HCatalog - Guia rápido
O que é HCatalog?
HCatalog é uma ferramenta de gerenciamento de armazenamento de tabela para Hadoop. Ele expõe os dados tabulares do metastore do Hive para outros aplicativos Hadoop. Ele permite que os usuários com diferentes ferramentas de processamento de dados (Pig, MapReduce) gravem dados facilmente em uma grade. Isso garante que os usuários não precisem se preocupar com onde ou em que formato seus dados estão armazenados.
HCatalog funciona como um componente chave do Hive e permite aos usuários armazenar seus dados em qualquer formato e estrutura.
Por que HCatalog?
Habilitando a ferramenta certa para o trabalho certo
O ecossistema Hadoop contém diferentes ferramentas para processamento de dados, como Hive, Pig e MapReduce. Embora essas ferramentas não exijam metadados, elas ainda podem se beneficiar deles quando estiverem presentes. O compartilhamento de um repositório de metadados também permite que os usuários entre ferramentas compartilhem dados com mais facilidade. Um fluxo de trabalho onde os dados são carregados e normalizados usando MapReduce ou Pig e depois analisados por meio do Hive é muito comum. Se todas essas ferramentas compartilham um metastore, os usuários de cada ferramenta têm acesso imediato aos dados criados com outra ferramenta. Nenhuma etapa de carregamento ou transferência é necessária.
Capture estados de processamento para permitir o compartilhamento
HCatalog pode publicar seus resultados analíticos. Assim, o outro programador pode acessar sua plataforma analítica via “REST”. Os esquemas publicados por você também são úteis para outros cientistas de dados. Os outros cientistas de dados usam suas descobertas como entradas para uma descoberta subsequente.
Integre o Hadoop com tudo
O Hadoop como um ambiente de processamento e armazenamento abre muitas oportunidades para a empresa; no entanto, para estimular a adoção, ele deve funcionar com e aumentar as ferramentas existentes. O Hadoop deve servir como entrada em sua plataforma analítica ou se integrar a seus armazenamentos de dados operacionais e aplicativos da web. A organização deve aproveitar o valor do Hadoop sem ter que aprender um conjunto de ferramentas totalmente novo. Os serviços REST abrem a plataforma para a empresa com uma API familiar e linguagem semelhante a SQL. Os sistemas de gerenciamento de dados corporativos usam o HCatalog para uma integração mais profunda com a plataforma Hadoop.
Arquitetura HCatalog
A ilustração a seguir mostra a arquitetura geral do HCatalog.
HCatalog suporta leitura e gravação de arquivos em qualquer formato para o qual um SerDe(serializador-desserializador) pode ser escrito. Por padrão, HCatalog oferece suporte aos formatos de arquivo RCFile, CSV, JSON, SequenceFile e ORC. Para usar um formato personalizado, você deve fornecer InputFormat, OutputFormat e SerDe.
HCatalog é construído em cima do metastore do Hive e incorpora o DDL do Hive. HCatalog fornece interfaces de leitura e gravação para Pig e MapReduce e usa a interface de linha de comando do Hive para emitir comandos de definição de dados e exploração de metadados.
Todos os subprojetos do Hadoop, como Hive, Pig e HBase, oferecem suporte ao sistema operacional Linux. Portanto, você precisa instalar um tipo de Linux em seu sistema. HCatalog foi mesclado com a instalação do Hive em 26 de março de 2013. A partir da versão Hive-0.11.0, o HCatalog vem com a instalação do Hive. Portanto, siga as etapas fornecidas abaixo para instalar o Hive, que por sua vez instalará automaticamente o HCatalog em seu sistema.
Etapa 1: Verificação da instalação JAVA
Java deve ser instalado em seu sistema antes de instalar o Hive. Você pode usar o seguinte comando para verificar se o Java já está instalado em seu sistema -
$ java –version
Se o Java já estiver instalado em seu sistema, você verá a seguinte resposta -
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b13)
Java HotSpot(TM) Client VM (build 25.0-b02, mixed mode)
Se você não tiver o Java instalado em seu sistema, siga as etapas abaixo.
Etapa 2: Instalando o Java
Baixe o Java (JDK <versão mais recente> - X64.tar.gz) visitando o seguinte link http://www.oracle.com/
Então jdk-7u71-linux-x64.tar.gz será baixado em seu sistema.
Geralmente, você encontrará o arquivo Java baixado na pasta Downloads. Verifique e extraia ojdk-7u71-linux-x64.gz arquivo usando os seguintes comandos.
$ cd Downloads/
$ ls jdk-7u71-linux-x64.gz $ tar zxf jdk-7u71-linux-x64.gz
$ ls
jdk1.7.0_71 jdk-7u71-linux-x64.gz
Para disponibilizar o Java a todos os usuários, você deve movê-lo para o local “/ usr / local /”. Abra o root e digite os seguintes comandos.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Para configurar PATH e JAVA_HOME variáveis, adicione os seguintes comandos para ~/.bashrc Arquivo.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Agora verifique a instalação usando o comando java -version do terminal conforme explicado acima.
Etapa 3: Verificar a instalação do Hadoop
O Hadoop deve ser instalado em seu sistema antes de instalar o Hive. Vamos verificar a instalação do Hadoop usando o seguinte comando -
$ hadoop version
Se o Hadoop já estiver instalado em seu sistema, você receberá a seguinte resposta -
Hadoop 2.4.1
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
Se o Hadoop não estiver instalado em seu sistema, prossiga com as seguintes etapas -
Etapa 4: baixando o Hadoop
Baixe e extraia o Hadoop 2.4.1 da Apache Software Foundation usando os comandos a seguir.
$ su
password:
# cd /usr/local
# wget http://apache.claz.org/hadoop/common/hadoop-2.4.1/
hadoop-2.4.1.tar.gz
# tar xzf hadoop-2.4.1.tar.gz
# mv hadoop-2.4.1/* to hadoop/
# exit
Etapa 5: instalando o Hadoop no modo pseudo-distribuído
As etapas a seguir são usadas para instalar Hadoop 2.4.1 em modo pseudo distribuído.
Configurando o Hadoop
Você pode definir variáveis de ambiente Hadoop anexando os seguintes comandos a ~/.bashrc Arquivo.
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
Agora aplique todas as alterações no sistema em execução atual.
$ source ~/.bashrc
Configuração Hadoop
Você pode encontrar todos os arquivos de configuração do Hadoop no local “$ HADOOP_HOME / etc / hadoop”. Você precisa fazer as alterações adequadas nesses arquivos de configuração de acordo com sua infraestrutura Hadoop.
$ cd $HADOOP_HOME/etc/hadoop
Para desenvolver programas Hadoop usando Java, você deve redefinir as variáveis de ambiente Java em hadoop-env.sh arquivo substituindo JAVA_HOME valor com a localização do Java em seu sistema.
export JAVA_HOME=/usr/local/jdk1.7.0_71
A seguir está a lista de arquivos que você deve editar para configurar o Hadoop.
core-site.xml
o core-site.xml arquivo contém informações como o número da porta usado para a instância do Hadoop, memória alocada para o sistema de arquivos, limite de memória para armazenar os dados e o tamanho dos buffers de leitura / gravação.
Abra o core-site.xml e adicione as seguintes propriedades entre as tags <configuration> e </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
o hdfs-site.xmlO arquivo contém informações como o valor dos dados de replicação, o caminho do namenode e o caminho do datanode dos sistemas de arquivos locais. Significa o local onde você deseja armazenar a infraestrutura do Hadoop.
Vamos supor os seguintes dados.
dfs.replication (data replication value) = 1
(In the following path /hadoop/ is the user name.
hadoopinfra/hdfs/namenode is the directory created by hdfs file system.)
namenode path = //home/hadoop/hadoopinfra/hdfs/namenode
(hadoopinfra/hdfs/datanode is the directory created by hdfs file system.)
datanode path = //home/hadoop/hadoopinfra/hdfs/datanode
Abra este arquivo e adicione as seguintes propriedades entre as marcas <configuration>, </configuration> neste arquivo.
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>file:///home/hadoop/hadoopinfra/hdfs/datanode</value>
</property>
</configuration>
Note - No arquivo acima, todos os valores de propriedade são definidos pelo usuário e você pode fazer alterações de acordo com sua infraestrutura Hadoop.
yarn-site.xml
Este arquivo é usado para configurar o yarn no Hadoop. Abra o arquivo yarn-site.xml e adicione as seguintes propriedades entre as marcas <configuration>, </configuration> neste arquivo.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Este arquivo é usado para especificar qual estrutura MapReduce estamos usando. Por padrão, o Hadoop contém um modelo de yarn-site.xml. Em primeiro lugar, você precisa copiar o arquivo demapred-site,xml.template para mapred-site.xml arquivo usando o seguinte comando.
$ cp mapred-site.xml.template mapred-site.xml
Abra o arquivo mapred-site.xml e adicione as seguintes propriedades entre as marcas <configuration>, </configuration> neste arquivo.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Etapa 6: Verificar a instalação do Hadoop
As etapas a seguir são usadas para verificar a instalação do Hadoop.
Configuração de Namenode
Configure o namenode usando o comando “hdfs namenode -format” da seguinte forma -
$ cd ~ $ hdfs namenode -format
O resultado esperado é o seguinte -
10/24/14 21:30:55 INFO namenode.NameNode: STARTUP_MSG:
/************************************************************
STARTUP_MSG: Starting NameNode
STARTUP_MSG: host = localhost/192.168.1.11
STARTUP_MSG: args = [-format]
STARTUP_MSG: version = 2.4.1
...
...
10/24/14 21:30:56 INFO common.Storage: Storage directory
/home/hadoop/hadoopinfra/hdfs/namenode has been successfully formatted.
10/24/14 21:30:56 INFO namenode.NNStorageRetentionManager: Going to retain 1
images with txid >= 0 10/24/14 21:30:56 INFO util.ExitUtil: Exiting with status 0
10/24/14 21:30:56 INFO namenode.NameNode: SHUTDOWN_MSG:
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at localhost/192.168.1.11
************************************************************/
Verificando Hadoop DFS
O seguinte comando é usado para iniciar o DFS. Executar este comando iniciará seu sistema de arquivos Hadoop.
$ start-dfs.sh
A saída esperada é a seguinte -
10/24/14 21:37:56 Starting namenodes on [localhost]
localhost: starting namenode, logging to
/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-namenode-localhost.out localhost:
starting datanode, logging to
/home/hadoop/hadoop-2.4.1/logs/hadoop-hadoop-datanode-localhost.out
Starting secondary namenodes [0.0.0.0]
Verificando o Script do Yarn
O seguinte comando é usado para iniciar o script Yarn. Executar este comando iniciará seus daemons Yarn.
$ start-yarn.sh
A saída esperada é a seguinte -
starting yarn daemons
starting resourcemanager, logging to /home/hadoop/hadoop-2.4.1/logs/
yarn-hadoop-resourcemanager-localhost.out
localhost: starting nodemanager, logging to
/home/hadoop/hadoop-2.4.1/logs/yarn-hadoop-nodemanager-localhost.out
Acessando o Hadoop no navegador
O número da porta padrão para acessar o Hadoop é 50070. Use a seguinte URL para obter serviços Hadoop em seu navegador.
http://localhost:50070/
Verifique todos os aplicativos do cluster
O número da porta padrão para acessar todos os aplicativos do cluster é 8088. Use o seguinte url para visitar este serviço.
http://localhost:8088/
Depois de concluir a instalação do Hadoop, prossiga para a próxima etapa e instale o Hive em seu sistema.
Etapa 7: baixando o Hive
Usamos hive-0.14.0 neste tutorial. Você pode baixá-lo visitando o seguinte linkhttp://apache.petsads.us/hive/hive-0.14.0/. Vamos supor que ele seja baixado no/Downloadsdiretório. Aqui, baixamos o arquivo Hive chamado “apache-hive-0.14.0-bin.tar.gz”Para este tutorial. O seguinte comando é usado para verificar o download -
$ cd Downloads $ ls
Após o download bem-sucedido, você verá a seguinte resposta -
apache-hive-0.14.0-bin.tar.gz
Etapa 8: Instalando o Hive
As etapas a seguir são necessárias para instalar o Hive em seu sistema. Suponhamos que o arquivo Hive seja baixado no/Downloads diretório.
Extraindo e Verificando Arquivo Hive
O seguinte comando é usado para verificar o download e extrair o arquivo Hive -
$ tar zxvf apache-hive-0.14.0-bin.tar.gz $ ls
Após o download bem-sucedido, você verá a seguinte resposta -
apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz
Copiando arquivos para o diretório / usr / local / hive
Precisamos copiar os arquivos do superusuário “su -”. Os seguintes comandos são usados para copiar os arquivos do diretório extraído para o/usr/local/hive”Diretório.
$ su -
passwd:
# cd /home/user/Download
# mv apache-hive-0.14.0-bin /usr/local/hive
# exit
Configurando o ambiente para Hive
Você pode configurar o ambiente Hive anexando as seguintes linhas a ~/.bashrc arquivo -
export HIVE_HOME=/usr/local/hive
export PATH=$PATH:$HIVE_HOME/bin export CLASSPATH=$CLASSPATH:/usr/local/Hadoop/lib/*:.
export CLASSPATH=$CLASSPATH:/usr/local/hive/lib/*:.
O seguinte comando é usado para executar o arquivo ~ / .bashrc.
$ source ~/.bashrc
Etapa 9: Configurando o Hive
Para configurar o Hive com Hadoop, você precisa editar o hive-env.sh arquivo, que é colocado no $HIVE_HOME/confdiretório. Os seguintes comandos redirecionam para o Hiveconfig pasta e copie o arquivo de modelo -
$ cd $HIVE_HOME/conf $ cp hive-env.sh.template hive-env.sh
Edite o hive-env.sh arquivo anexando a seguinte linha -
export HADOOP_HOME=/usr/local/hadoop
Com isso, a instalação do Hive está concluída. Agora você precisa de um servidor de banco de dados externo para configurar o Metastore. Usamos o banco de dados Apache Derby.
Etapa 10: Baixar e instalar o Apache Derby
Siga as etapas abaixo para baixar e instalar o Apache Derby -
Baixando Apache Derby
O seguinte comando é usado para baixar o Apache Derby. Leva algum tempo para fazer o download.
$ cd ~ $ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz
O seguinte comando é usado para verificar o download -
$ ls
Após o download bem-sucedido, você verá a seguinte resposta -
db-derby-10.4.2.0-bin.tar.gz
Extraindo e verificando o arquivo Derby
Os seguintes comandos são usados para extrair e verificar o arquivo Derby -
$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls
Após o download bem-sucedido, você verá a seguinte resposta -
db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz
Copiando arquivos para o diretório / usr / local / derby
Precisamos copiar do superusuário “su -”. Os seguintes comandos são usados para copiar os arquivos do diretório extraído para o/usr/local/derby diretório -
$ su -
passwd:
# cd /home/user
# mv db-derby-10.4.2.0-bin /usr/local/derby
# exit
Configurando o ambiente para Derby
Você pode configurar o ambiente Derby anexando as seguintes linhas ao ~/.bashrc arquivo -
export DERBY_HOME=/usr/local/derby
export PATH=$PATH:$DERBY_HOME/bin
export CLASSPATH=$CLASSPATH:$DERBY_HOME/lib/derby.jar:$DERBY_HOME/lib/derbytools.jar
O seguinte comando é usado para executar ~/.bashrc file -
$ source ~/.bashrc
Crie um diretório para o Metastore
Crie um diretório chamado data no diretório $ DERBY_HOME para armazenar dados Metastore.
$ mkdir $DERBY_HOME/data
A instalação do Derby e a configuração do ambiente agora estão completas.
Etapa 11: Configurando o Hive Metastore
Configurar o Metastore significa especificar para o Hive onde o banco de dados está armazenado. Você pode fazer isso editando ohive-site.xml arquivo, que está no $HIVE_HOME/confdiretório. Em primeiro lugar, copie o arquivo de modelo usando o seguinte comando -
$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
Editar hive-site.xml e acrescente as seguintes linhas entre as tags <configuration> e </configuration> -
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:derby://localhost:1527/metastore_db;create = true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
Crie um arquivo chamado jpox.properties e adicione as seguintes linhas nele -
javax.jdo.PersistenceManagerFactoryClass = org.jpox.PersistenceManagerFactoryImpl
org.jpox.autoCreateSchema = false
org.jpox.validateTables = false
org.jpox.validateColumns = false
org.jpox.validateConstraints = false
org.jpox.storeManagerType = rdbms
org.jpox.autoCreateSchema = true
org.jpox.autoStartMechanismMode = checked
org.jpox.transactionIsolation = read_committed
javax.jdo.option.DetachAllOnCommit = true
javax.jdo.option.NontransactionalRead = true
javax.jdo.option.ConnectionDriverName = org.apache.derby.jdbc.ClientDriver
javax.jdo.option.ConnectionURL = jdbc:derby://hadoop1:1527/metastore_db;create = true
javax.jdo.option.ConnectionUserName = APP
javax.jdo.option.ConnectionPassword = mine
Etapa 12: Verificar a instalação do Hive
Antes de executar o Hive, você precisa criar o /tmppasta e uma pasta separada do Hive no HDFS. Aqui, usamos o/user/hive/warehousepasta. Você precisa definir a permissão de gravação para essas pastas recém-criadas, conforme mostrado abaixo -
chmod g+w
Agora configure-os no HDFS antes de verificar o Hive. Use os seguintes comandos -
$ $HADOOP_HOME/bin/hadoop fs -mkdir /tmp $ $HADOOP_HOME/bin/hadoop fs -mkdir /user/hive/warehouse $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /tmp $ $HADOOP_HOME/bin/hadoop fs -chmod g+w /user/hive/warehouse
Os seguintes comandos são usados para verificar a instalação do Hive -
$ cd $HIVE_HOME $ bin/hive
Na instalação bem-sucedida do Hive, você verá a seguinte resposta -
Logging initialized using configuration in
jar:file:/home/hadoop/hive-0.9.0/lib/hive-common-0.9.0.jar!/
hive-log4j.properties Hive history
=/tmp/hadoop/hive_job_log_hadoop_201312121621_1494929084.txt
………………….
hive>
Você pode executar o seguinte comando de amostra para exibir todas as tabelas -
hive> show tables;
OK Time taken: 2.798 seconds
hive>
Etapa 13: verificar a instalação do HCatalog
Use o seguinte comando para definir uma variável de sistema HCAT_HOME para a página inicial do HCatalog.
export HCAT_HOME = $HiVE_HOME/HCatalog
Use o seguinte comando para verificar a instalação do HCatalog.
cd $HCAT_HOME/bin
./hcat
Se a instalação for bem-sucedida, você verá a seguinte saída -
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
[ -g "<group>" ] [ -p "<perms>" ]
[ -D"<name> = <value>" ]
-D <property = value> use hadoop value for given property
-e <exec> hcat command given from command line
-f <file> hcat commands in file
-g <group> group for the db/table specified in CREATE statement
-h,--help Print help information
-p <perms> permissions for the db/table specified in CREATE statement
HCatalog Command Line Interface (CLI) pode ser invocado a partir do comando $HIVE_HOME/HCatalog/bin/hcat onde $ HIVE_HOME é o diretório inicial do Hive. hcat é um comando usado para inicializar o servidor HCatalog.
Use o seguinte comando para inicializar a linha de comando do HCatalog.
cd $HCAT_HOME/bin
./hcat
Se a instalação foi feita corretamente, você obterá a seguinte saída -
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
usage: hcat { -e "<query>" | -f "<filepath>" }
[ -g "<group>" ] [ -p "<perms>" ]
[ -D"<name> = <value>" ]
-D <property = value> use hadoop value for given property
-e <exec> hcat command given from command line
-f <file> hcat commands in file
-g <group> group for the db/table specified in CREATE statement
-h,--help Print help information
-p <perms> permissions for the db/table specified in CREATE statement
O HCatalog CLI oferece suporte a essas opções de linha de comando -
Sr. Não | Opção | Exemplo e descrição |
---|---|---|
1 | -g | hcat -g mygroup ... A tabela a ser criada deve ter o grupo "meu grupo". |
2 | -p | hcat -p rwxr-xr-x ... A tabela a ser criada deve ter permissões de leitura, gravação e execução. |
3 | -f | hcat -f myscript.HCatalog ... myscript.HCatalog é um arquivo de script que contém comandos DDL para executar. |
4 | -e | hcat -e 'create table mytable(a int);' ... Trate a seguinte string como um comando DDL e execute-o. |
5 | -D | hcat -Dkey = value ... Passa o par de valores-chave para HCatalog como uma propriedade de sistema Java. |
6 | - | hcat Imprime uma mensagem de uso. |
Nota -
o -g e -p as opções não são obrigatórias.
Ao mesmo tempo, qualquer um -e ou -f opção pode ser fornecida, não ambos.
A ordem das opções é imaterial; você pode especificar as opções em qualquer ordem.
Sr. Não | Comando DDL e descrição |
---|---|
1 | CREATE TABLE Crie uma tabela usando HCatalog. Se você criar uma tabela com uma cláusula CLUSTERED BY, não poderá gravar nela com Pig ou MapReduce. |
2 | ALTER TABLE Suportado, exceto para as opções REBUILD e CONCATENATE. Seu comportamento permanece o mesmo que no Hive. |
3 | DROP TABLE Suportado. Comportamento igual ao do Hive (elimine a tabela e a estrutura completas). |
4 | CREATE/ALTER/DROP VIEW Suportado. Comportamento igual ao do Hive. Note - Pig e MapReduce não podem ler ou gravar em visualizações. |
5 | SHOW TABLES Exibe uma lista de tabelas. |
6 | SHOW PARTITIONS Exibe uma lista de partições. |
7 | Create/Drop Index As operações CREATE e DROP FUNCTION são suportadas, mas as funções criadas ainda devem ser registradas no Pig e colocadas em CLASSPATH para MapReduce. |
8 | DESCRIBE Suportado. Comportamento igual ao do Hive. Descreva a estrutura. |
Alguns dos comandos da tabela acima são explicados nos capítulos subsequentes.
Este capítulo explica como criar uma tabela e inserir dados nela. As convenções de criação de uma tabela no HCatalog são bastante semelhantes à criação de uma tabela usando o Hive.
Criar declaração de tabela
Criar Tabela é uma instrução usada para criar uma tabela no Hive metastore usando HCatalog. Sua sintaxe e exemplo são os seguintes -
Sintaxe
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[ROW FORMAT row_format]
[STORED AS file_format]
Exemplo
Vamos supor que você precise criar uma tabela chamada employee usando CREATE TABLEdeclaração. A tabela a seguir lista os campos e seus tipos de dados noemployee mesa -
Sr. Não | Nome do Campo | Tipo de dados |
---|---|---|
1 | Eid | int |
2 | Nome | Corda |
3 | Salário | Flutuador |
4 | Designação | corda |
Os dados a seguir definem os campos suportados, como Comment, Campos formatados por linha, como Field terminator, Lines terminator, e Stored File type.
COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
A consulta a seguir cria uma tabela chamada employee usando os dados acima.
./hcat –e "CREATE TABLE IF NOT EXISTS employee ( eid int, name String,
salary String, destination String) \
COMMENT 'Employee details' \
ROW FORMAT DELIMITED \
FIELDS TERMINATED BY ‘\t’ \
LINES TERMINATED BY ‘\n’ \
STORED AS TEXTFILE;"
Se você adicionar a opção IF NOT EXISTS, HCatalog ignora a instrução caso a tabela já exista.
Com a criação bem-sucedida da tabela, você verá a seguinte resposta -
OK
Time taken: 5.905 seconds
Declaração de carga de dados
Geralmente, após criar uma tabela em SQL, podemos inserir dados usando a instrução Insert. Mas no HCatalog, inserimos dados usando a instrução LOAD DATA.
Ao inserir dados no HCatalog, é melhor usar LOAD DATA para armazenar registros em massa. Existem duas maneiras de carregar dados: uma é delocal file system e o segundo é de Hadoop file system.
Sintaxe
A sintaxe para LOAD DATA é a seguinte -
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
- LOCAL é o identificador para especificar o caminho local. Isso é opcional.
- OVERWRITE é opcional para sobrescrever os dados na tabela.
- PARTITION é opcional.
Exemplo
Vamos inserir os seguintes dados na tabela. É um arquivo de texto chamadosample.txt dentro /home/user diretório.
1201 Gopal 45000 Technical manager
1202 Manisha 45000 Proof reader
1203 Masthanvali 40000 Technical writer
1204 Kiran 40000 Hr Admin
1205 Kranthi 30000 Op Admin
A consulta a seguir carrega o texto fornecido na tabela.
./hcat –e "LOAD DATA LOCAL INPATH '/home/user/sample.txt'
OVERWRITE INTO TABLE employee;"
Após o download bem-sucedido, você verá a seguinte resposta -
OK
Time taken: 15.905 seconds
Este capítulo explica como alterar os atributos de uma tabela, como alterar o nome da tabela, alterar os nomes das colunas, adicionar colunas e excluir ou substituir colunas.
Alterar declaração da tabela
Você pode usar a instrução ALTER TABLE para alterar uma tabela no Hive.
Sintaxe
A instrução assume qualquer uma das seguintes sintaxes com base nos atributos que desejamos modificar em uma tabela.
ALTER TABLE name RENAME TO new_name
ALTER TABLE name ADD COLUMNS (col_spec[, col_spec ...])
ALTER TABLE name DROP [COLUMN] column_name
ALTER TABLE name CHANGE column_name new_name new_type
ALTER TABLE name REPLACE COLUMNS (col_spec[, col_spec ...])
Alguns dos cenários são explicados a seguir.
Renomear para… Declaração
A consulta a seguir renomeia uma tabela de employee para emp.
./hcat –e "ALTER TABLE employee RENAME TO emp;"
Declaração de mudança
A tabela a seguir contém os campos de employee tabela e mostra os campos a serem alterados (em negrito).
Nome do Campo | Converter do tipo de dados | Alterar o nome do campo | Converter para tipo de dados |
---|---|---|---|
eid | int | eid | int |
nome | Corda | ename | Corda |
salário | Flutuador | salário | em dobro |
designação | Corda | designação | Corda |
As consultas a seguir renomeiam o nome da coluna e o tipo de dados da coluna usando os dados acima -
./hcat –e "ALTER TABLE employee CHANGE name ename String;"
./hcat –e "ALTER TABLE employee CHANGE salary salary Double;"
Adicionar declaração de colunas
A consulta a seguir adiciona uma coluna chamada dept ao employee mesa.
./hcat –e "ALTER TABLE employee ADD COLUMNS (dept STRING COMMENT 'Department name');"
Substituir Declaração
A consulta a seguir exclui todas as colunas do employee mesa e a substitui por emp e name colunas -
./hcat – e "ALTER TABLE employee REPLACE COLUMNS ( eid INT empid Int, ename STRING name String);"
Declaração de abandono de mesa
Este capítulo descreve como eliminar uma tabela no HCatalog. Quando você remove uma tabela do metastore, ele remove os dados da tabela / coluna e seus metadados. Pode ser uma tabela normal (armazenada no metastore) ou uma tabela externa (armazenada no sistema de arquivos local); O HCatalog trata ambos da mesma maneira, independentemente dos seus tipos.
A sintaxe é a seguinte -
DROP TABLE [IF EXISTS] table_name;
A consulta a seguir elimina uma tabela chamada employee -
./hcat –e "DROP TABLE IF EXISTS employee;"
Na execução bem-sucedida da consulta, você verá a seguinte resposta -
OK
Time taken: 5.3 seconds
Este capítulo descreve como criar e gerenciar um viewno HCatalog. As visualizações do banco de dados são criadas usando oCREATE VIEWdeclaração. As visualizações podem ser criadas a partir de uma única tabela, várias tabelas ou outra visualização.
Para criar uma visualização, um usuário deve ter privilégios de sistema apropriados de acordo com a implementação específica.
Criar declaração de visão
CREATE VIEWcria uma visualização com o nome fornecido. Um erro será gerado se uma tabela ou exibição com o mesmo nome já existir. Você pode usarIF NOT EXISTS para pular o erro.
Se nenhum nome de coluna for fornecido, os nomes das colunas da visão serão derivados automaticamente do defining SELECT expression.
Note - Se o SELECT contiver expressões escalares sem alias, como x + y, os nomes das colunas de visualização resultantes serão gerados no formato _C0, _C1, etc.
Ao renomear colunas, comentários de coluna também podem ser fornecidos. Os comentários não são herdados automaticamente das colunas subjacentes.
Uma instrução CREATE VIEW falhará se a visão defining SELECT expression é inválido.
Sintaxe
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...;
Exemplo
A seguir estão os dados da tabela de funcionários. Agora vamos ver como criar uma visão chamadaEmp_Deg_View contendo os campos id, nome, designação e salário de um funcionário com um salário superior a 35.000.
+------+-------------+--------+-------------------+-------+
| ID | Name | Salary | Designation | Dept |
+------+-------------+--------+-------------------+-------+
| 1201 | Gopal | 45000 | Technical manager | TP |
| 1202 | Manisha | 45000 | Proofreader | PR |
| 1203 | Masthanvali | 30000 | Technical writer | TP |
| 1204 | Kiran | 40000 | Hr Admin | HR |
| 1205 | Kranthi | 30000 | Op Admin | Admin |
+------+-------------+--------+-------------------+-------+
A seguir está o comando para criar uma visualização com base nos dados fornecidos acima.
./hcat –e "CREATE VIEW Emp_Deg_View (salary COMMENT ' salary more than 35,000')
AS SELECT id, name, salary, designation FROM employee WHERE salary ≥ 35000;"
Resultado
OK
Time taken: 5.3 seconds
Drop View Extrato
DROP VIEW remove metadados para a visão especificada. Ao eliminar uma visão referenciada por outras visões, nenhum aviso é dado (as visões dependentes são deixadas penduradas como inválidas e devem ser eliminadas ou recriadas pelo usuário).
Sintaxe
DROP VIEW [IF EXISTS] view_name;
Exemplo
O seguinte comando é usado para remover uma visão chamada Emp_Deg_View.
DROP VIEW Emp_Deg_View;
Freqüentemente, você deseja listar todas as tabelas de um banco de dados ou listar todas as colunas de uma tabela. Obviamente, cada banco de dados tem sua própria sintaxe para listar as tabelas e colunas.
Show Tablesinstrução exibe os nomes de todas as tabelas. Por padrão, ele lista as tabelas do banco de dados atual ou com oIN cláusula, em um banco de dados especificado.
Este capítulo descreve como listar todas as tabelas do banco de dados atual no HCatalog.
Mostrar declaração de tabelas
A sintaxe de SHOW TABLES é a seguinte -
SHOW TABLES [IN database_name] ['identifier_with_wildcards'];
A consulta a seguir exibe uma lista de tabelas -
./hcat –e "Show tables;"
Na execução bem-sucedida da consulta, você verá a seguinte resposta -
OK
emp
employee
Time taken: 5.3 seconds
Uma partição é uma condição para dados tabulares usados para criar uma tabela ou visualização separada. SHOW PARTITIONS lista todas as partições existentes para uma determinada tabela base. As partições são listadas em ordem alfabética. Após o Hive 0.6, também é possível especificar partes de uma especificação de partição para filtrar a lista resultante.
Você pode usar o comando SHOW PARTITIONS para ver as partições existentes em uma tabela específica. Este capítulo descreve como listar as partições de uma tabela específica no HCatalog.
Mostrar declaração de partições
A sintaxe é a seguinte -
SHOW PARTITIONS table_name;
A consulta a seguir elimina uma tabela chamada employee -
./hcat –e "Show partitions employee;"
Na execução bem-sucedida da consulta, você verá a seguinte resposta -
OK
Designation = IT
Time taken: 5.3 seconds
Partição Dinâmica
HCatalog organiza tabelas em partições. É uma maneira de dividir uma tabela em partes relacionadas com base nos valores de colunas particionadas, como data, cidade e departamento. Usando partições, é fácil consultar uma parte dos dados.
Por exemplo, uma mesa chamada Tab1contém dados do funcionário, como id, nome, departamento e yoj (ou seja, ano de adesão). Suponha que você precise recuperar os detalhes de todos os funcionários que ingressaram em 2012. Uma consulta pesquisa em toda a tabela as informações necessárias. No entanto, se você particionar os dados do funcionário com o ano e armazená-los em um arquivo separado, isso reduzirá o tempo de processamento da consulta. O exemplo a seguir mostra como particionar um arquivo e seus dados -
O seguinte arquivo contém employeedata mesa.
/ tab1 / Employeedata / file1
id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Os dados acima são divididos em dois arquivos por ano.
/ tab1 / Employeedata / 2012 / file2
1, gopal, TP, 2012
2, kiran, HR, 2012
/ tab1 / Employeedata / 2013 / file3
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Adicionando uma Partição
Podemos adicionar partições a uma tabela alterando a tabela. Vamos supor que temos uma mesa chamadaemployee com campos como Id, Nome, Salário, Designação, Departamento e yoj.
Sintaxe
ALTER TABLE table_name ADD [IF NOT EXISTS] PARTITION partition_spec
[LOCATION 'location1'] partition_spec [LOCATION 'location2'] ...;
partition_spec:
: (p_column = p_col_value, p_column = p_col_value, ...)
A consulta a seguir é usada para adicionar uma partição ao employee mesa.
./hcat –e "ALTER TABLE employee ADD PARTITION (year = '2013') location '/2012/part2012';"
Renomeando uma Partição
Você pode usar o comando RENAME-TO para renomear uma partição. Sua sintaxe é a seguinte -
./hact –e "ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;"
A consulta a seguir é usada para renomear uma partição -
./hcat –e "ALTER TABLE employee PARTITION (year=’1203’) RENAME TO PARTITION (Yoj='1203');"
Soltando uma partição
A sintaxe do comando que é usado para descartar uma partição é a seguinte -
./hcat –e "ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,.
PARTITION partition_spec,...;"
A consulta a seguir é usada para descartar uma partição -
./hcat –e "ALTER TABLE employee DROP [IF EXISTS] PARTITION (year=’1203’);"
Criação de um índice
Um índice nada mais é do que um ponteiro para uma coluna específica de uma tabela. Criar um índice significa criar um ponteiro em uma coluna específica de uma tabela. Sua sintaxe é a seguinte -
CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name = property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)][
[ ROW FORMAT ...] STORED AS ...
| STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
Exemplo
Vamos dar um exemplo para entender o conceito de índice. Use o mesmoemployee tabela que usamos anteriormente com os campos Id, Nome, Salário, Designação e Departamento. Crie um índice chamado index_salary no salary coluna do employee mesa.
A consulta a seguir cria um índice -
./hcat –e "CREATE INDEX inedx_salary ON TABLE employee(salary)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';"
É um indicador para o salarycoluna. Se a coluna for modificada, as alterações serão armazenadas usando um valor de índice.
Descartando um índice
A seguinte sintaxe é usada para descartar um índice -
DROP INDEX <index_name> ON <table_name>
A consulta a seguir elimina o índice index_salary -
./hcat –e "DROP INDEX index_salary ON employee;"
HCatalog contém uma API de transferência de dados para entrada e saída paralelas sem usar MapReduce. Esta API usa uma abstração de armazenamento básico de tabelas e linhas para ler dados do cluster Hadoop e gravar dados nele.
A API de transferência de dados contém principalmente três classes; aqueles são -
HCatReader - Lê dados de um cluster Hadoop.
HCatWriter - Grava dados em um cluster Hadoop.
DataTransferFactory - Gera instâncias de leitor e gravador.
Esta API é adequada para configuração de nó mestre-escravo. Vamos discutir mais sobreHCatReader e HCatWriter.
HCatReader
HCatReader é uma classe abstrata interna do HCatalog e abstrai as complexidades do sistema subjacente de onde os registros devem ser recuperados.
S. No. | Nome e descrição do método |
---|---|
1 | Public abstract ReaderContext prepareRead() throws HCatException Deve ser chamado no nó mestre para obter o ReaderContext, que deve ser serializado e enviado aos nós escravos. |
2 | Public abstract Iterator <HCatRecorder> read() throws HCaException Isso deve ser chamado em nós escravos para ler HCatRecords. |
3 | Public Configuration getConf() Ele retornará o objeto da classe de configuração. |
A classe HCatReader é usada para ler os dados do HDFS. A leitura é um processo de duas etapas em que a primeira etapa ocorre no nó mestre de um sistema externo. A segunda etapa é realizada em paralelo em vários nós escravos.
As leituras são feitas em um ReadEntity. Antes de começar a ler, você precisa definir um ReadEntity para ler. Isso pode ser feito através deReadEntity.Builder. Você pode especificar um nome de banco de dados, nome de tabela, partição e string de filtro. Por exemplo -
ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build(); 10.
O trecho de código acima define um objeto ReadEntity ("entidade"), compreendendo uma tabela chamada mytbl em um banco de dados chamado mydb, que pode ser usado para ler todas as linhas desta tabela. Observe que esta tabela deve existir no HCatalog antes do início desta operação.
Depois de definir um ReadEntity, você obtém uma instância de HCatReader usando o ReadEntity e a configuração de cluster -
HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
A próxima etapa é obter um ReaderContext do leitor da seguinte forma -
ReaderContext cntxt = reader.prepareRead();
HCatWriter
Esta abstração é interna ao HCatalog. Isso é para facilitar a gravação no HCatalog de sistemas externos. Não tente instanciar isso diretamente. Em vez disso, use DataTransferFactory.
Sr. Não. | Nome e descrição do método |
---|---|
1 | Public abstract WriterContext prepareRead() throws HCatException O sistema externo deve invocar este método exatamente uma vez a partir de um nó mestre. Retorna umWriterContext. Isso deve ser serializado e enviado aos nós escravos para construirHCatWriter há. |
2 | Public abstract void write(Iterator<HCatRecord> recordItr) throws HCaException Este método deve ser usado em nós escravos para realizar gravações. O recordItr é um objeto iterador que contém a coleção de registros a serem gravados no HCatalog. |
3 | Public abstract void abort(WriterContext cntxt) throws HCatException Este método deve ser chamado no nó mestre. O objetivo principal deste método é fazer limpezas em caso de falhas. |
4 | public abstract void commit(WriterContext cntxt) throws HCatException Este método deve ser chamado no nó mestre. O objetivo deste método é fazer commit de metadados. |
Semelhante à leitura, a escrita também é um processo de duas etapas em que a primeira etapa ocorre no nó mestre. Posteriormente, a segunda etapa ocorre em paralelo nos nós escravos.
As gravações são feitas em um WriteEntity que pode ser construído de forma semelhante à leitura -
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();
O código acima cria um objeto WriteEntity entity
que pode ser usado para escrever em uma tabela chamadamytbl no banco de dados mydb.
Depois de criar um WriteEntity, a próxima etapa é obter um WriterContext -
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();
Todas as etapas acima ocorrem no nó mestre. O nó mestre então serializa o objeto WriterContext e o disponibiliza para todos os escravos.
Em nós escravos, você precisa obter um HCatWriter usando WriterContext da seguinte forma -
HCatWriter writer = DataTransferFactory.getHCatWriter(context);
Então o writerleva um iterador como argumento para o write
método -
writer.write(hCatRecordItr);
o writer então liga getNext() neste iterador em um loop e grava todos os registros anexados ao iterador.
o TestReaderWriter.javaarquivo é usado para testar as classes HCatreader e HCatWriter. O programa a seguir demonstra como usar HCatReader e HCatWriter API para ler dados de um arquivo de origem e, subsequentemente, gravá-los em um arquivo de destino.
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.metastore.api.MetaException;
import org.apache.hadoop.hive.ql.CommandNeedRetryException;
import org.apache.hadoop.mapreduce.InputSplit;
import org.apache.hive.HCatalog.common.HCatException;
import org.apache.hive.HCatalog.data.transfer.DataTransferFactory;
import org.apache.hive.HCatalog.data.transfer.HCatReader;
import org.apache.hive.HCatalog.data.transfer.HCatWriter;
import org.apache.hive.HCatalog.data.transfer.ReadEntity;
import org.apache.hive.HCatalog.data.transfer.ReaderContext;
import org.apache.hive.HCatalog.data.transfer.WriteEntity;
import org.apache.hive.HCatalog.data.transfer.WriterContext;
import org.apache.hive.HCatalog.mapreduce.HCatBaseTest;
import org.junit.Assert;
import org.junit.Test;
public class TestReaderWriter extends HCatBaseTest {
@Test
public void test() throws MetaException, CommandNeedRetryException,
IOException, ClassNotFoundException {
driver.run("drop table mytbl");
driver.run("create table mytbl (a string, b int)");
Iterator<Entry<String, String>> itr = hiveConf.iterator();
Map<String, String> map = new HashMap<String, String>();
while (itr.hasNext()) {
Entry<String, String> kv = itr.next();
map.put(kv.getKey(), kv.getValue());
}
WriterContext cntxt = runsInMaster(map);
File writeCntxtFile = File.createTempFile("hcat-write", "temp");
writeCntxtFile.deleteOnExit();
// Serialize context.
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(writeCntxtFile));
oos.writeObject(cntxt);
oos.flush();
oos.close();
// Now, deserialize it.
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(writeCntxtFile));
cntxt = (WriterContext) ois.readObject();
ois.close();
runsInSlave(cntxt);
commit(map, true, cntxt);
ReaderContext readCntxt = runsInMaster(map, false);
File readCntxtFile = File.createTempFile("hcat-read", "temp");
readCntxtFile.deleteOnExit();
oos = new ObjectOutputStream(new FileOutputStream(readCntxtFile));
oos.writeObject(readCntxt);
oos.flush();
oos.close();
ois = new ObjectInputStream(new FileInputStream(readCntxtFile));
readCntxt = (ReaderContext) ois.readObject();
ois.close();
for (int i = 0; i < readCntxt.numSplits(); i++) {
runsInSlave(readCntxt, i);
}
}
private WriterContext runsInMaster(Map<String, String> config) throws HCatException {
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withTable("mytbl").build();
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();
return info;
}
private ReaderContext runsInMaster(Map<String, String> config,
boolean bogus) throws HCatException {
ReadEntity entity = new ReadEntity.Builder().withTable("mytbl").build();
HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
ReaderContext cntxt = reader.prepareRead();
return cntxt;
}
private void runsInSlave(ReaderContext cntxt, int slaveNum) throws HCatException {
HCatReader reader = DataTransferFactory.getHCatReader(cntxt, slaveNum);
Iterator<HCatRecord> itr = reader.read();
int i = 1;
while (itr.hasNext()) {
HCatRecord read = itr.next();
HCatRecord written = getRecord(i++);
// Argh, HCatRecord doesnt implement equals()
Assert.assertTrue("Read: " + read.get(0) + "Written: " + written.get(0),
written.get(0).equals(read.get(0)));
Assert.assertTrue("Read: " + read.get(1) + "Written: " + written.get(1),
written.get(1).equals(read.get(1)));
Assert.assertEquals(2, read.size());
}
//Assert.assertFalse(itr.hasNext());
}
private void runsInSlave(WriterContext context) throws HCatException {
HCatWriter writer = DataTransferFactory.getHCatWriter(context);
writer.write(new HCatRecordItr());
}
private void commit(Map<String, String> config, boolean status,
WriterContext context) throws IOException {
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withTable("mytbl").build();
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
if (status) {
writer.commit(context);
} else {
writer.abort(context);
}
}
private static HCatRecord getRecord(int i) {
List<Object> list = new ArrayList<Object>(2);
list.add("Row #: " + i);
list.add(i);
return new DefaultHCatRecord(list);
}
private static class HCatRecordItr implements Iterator<HCatRecord> {
int i = 0;
@Override
public boolean hasNext() {
return i++ < 100 ? true : false;
}
@Override
public HCatRecord next() {
return getRecord(i);
}
@Override
public void remove() {
throw new RuntimeException();
}
}
}
O programa acima lê os dados do HDFS na forma de registros e grava os dados do registro em mytable
o HCatInputFormat e HCatOutputFormatas interfaces são usadas para ler dados do HDFS e, após o processamento, gravar os dados resultantes no HDFS usando o trabalho MapReduce. Vamos elaborar as interfaces de formato de entrada e saída.
HCatInputFormat
o HCatInputFormaté usado com tarefas MapReduce para ler dados de tabelas gerenciadas pelo HCatalog. HCatInputFormat expõe uma API Hadoop 0.20 MapReduce para ler dados como se tivessem sido publicados em uma tabela.
Sr. Não. | Nome e descrição do método |
---|---|
1 | public static HCatInputFormat setInput(Job job, String dbName, String tableName)throws IOException Defina as entradas a serem usadas para o trabalho. Ele consulta o metastore com a especificação de entrada fornecida e serializa partições correspondentes na configuração do trabalho para tarefas MapReduce. |
2 | public static HCatInputFormat setInput(Configuration conf, String dbName, String tableName) throws IOException Defina as entradas a serem usadas para o trabalho. Ele consulta o metastore com a especificação de entrada fornecida e serializa partições correspondentes na configuração do trabalho para tarefas MapReduce. |
3 | public HCatInputFormat setFilter(String filter)throws IOException Defina um filtro na tabela de entrada. |
4 | public HCatInputFormat setProperties(Properties properties) throws IOException Defina propriedades para o formato de entrada. |
A API HCatInputFormat inclui os seguintes métodos -
- setInput
- setOutputSchema
- getTableSchema
Usar HCatInputFormat para ler os dados, primeiro instancie um InputJobInfo com as informações necessárias da tabela sendo lida e, em seguida, chame setInput com o InputJobInfo.
Você pode usar o setOutputSchema método para incluir um projection schema, para especificar os campos de saída. Se um esquema não for especificado, todas as colunas da tabela serão retornadas. Você pode usar o método getTableSchema para determinar o esquema da tabela para uma tabela de entrada especificada.
HCatOutputFormat
HCatOutputFormat é usado com trabalhos MapReduce para gravar dados em tabelas gerenciadas pelo HCatalog. HCatOutputFormat expõe uma API Hadoop 0.20 MapReduce para gravar dados em uma tabela. Quando um trabalho MapReduce usa HCatOutputFormat para gravar a saída, o OutputFormat padrão configurado para a tabela é usado e a nova partição é publicada na tabela após a conclusão do trabalho.
Sr. Não. | Nome e descrição do método |
---|---|
1 | public static void setOutput (Configuration conf, Credentials credentials, OutputJobInfo outputJobInfo) throws IOException Defina as informações sobre a saída a serem gravadas para o trabalho. Ele consulta o servidor de metadados para localizar o StorageHandler a ser usado para a tabela. Ele gera um erro se a partição já foi publicada. |
2 | public static void setSchema (Configuration conf, HCatSchema schema) throws IOException Defina o esquema para os dados que estão sendo gravados na partição. O esquema da tabela é usado por padrão para a partição se ela não for chamada. |
3 | public RecordWriter <WritableComparable<?>, HCatRecord > getRecordWriter (TaskAttemptContext context)throws IOException, InterruptedException Obtenha o gravador para o trabalho. Ele usa o OutputFormat padrão do StorageHandler para obter o gravador do registro. |
4 | public OutputCommitter getOutputCommitter (TaskAttemptContext context) throws IOException, InterruptedException Obtenha o committer de saída para este formato de saída. Ele garante que a saída seja confirmada corretamente. |
o HCatOutputFormat API inclui os seguintes métodos -
- setOutput
- setSchema
- getTableSchema
A primeira chamada no HCatOutputFormat deve ser setOutput; qualquer outra chamada lançará uma exceção dizendo que o formato de saída não foi inicializado.
O esquema para os dados que estão sendo gravados é especificado pelo setSchemamétodo. Você deve chamar esse método, fornecendo o esquema de dados que está gravando. Se seus dados tiverem o mesmo esquema que o esquema da tabela, você pode usarHCatOutputFormat.getTableSchema() para obter o esquema da tabela e, em seguida, passá-lo para setSchema().
Exemplo
O programa MapReduce a seguir lê os dados de uma tabela que assume ter um número inteiro na segunda coluna ("coluna 1") e conta quantas instâncias de cada valor distinto encontra. Ou seja, ele faz o equivalente a "select col1, count(*) from $table group by col1;"
Por exemplo, se os valores da segunda coluna forem {1, 1, 1, 3, 3, 5}, o programa produzirá a seguinte saída de valores e contagens -
1, 3
3, 2
5, 1
Vamos agora dar uma olhada no código do programa -
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import org.apache.HCatalog.common.HCatConstants;
import org.apache.HCatalog.data.DefaultHCatRecord;
import org.apache.HCatalog.data.HCatRecord;
import org.apache.HCatalog.data.schema.HCatSchema;
import org.apache.HCatalog.mapreduce.HCatInputFormat;
import org.apache.HCatalog.mapreduce.HCatOutputFormat;
import org.apache.HCatalog.mapreduce.InputJobInfo;
import org.apache.HCatalog.mapreduce.OutputJobInfo;
public class GroupByAge extends Configured implements Tool {
public static class Map extends Mapper<WritableComparable,
HCatRecord, IntWritable, IntWritable> {
int age;
@Override
protected void map(
WritableComparable key, HCatRecord value,
org.apache.hadoop.mapreduce.Mapper<WritableComparable,
HCatRecord, IntWritable, IntWritable>.Context context
)throws IOException, InterruptedException {
age = (Integer) value.get(1);
context.write(new IntWritable(age), new IntWritable(1));
}
}
public static class Reduce extends Reducer<IntWritable, IntWritable,
WritableComparable, HCatRecord> {
@Override
protected void reduce(
IntWritable key, java.lang.Iterable<IntWritable> values,
org.apache.hadoop.mapreduce.Reducer<IntWritable, IntWritable,
WritableComparable, HCatRecord>.Context context
)throws IOException ,InterruptedException {
int sum = 0;
Iterator<IntWritable> iter = values.iterator();
while (iter.hasNext()) {
sum++;
iter.next();
}
HCatRecord record = new DefaultHCatRecord(2);
record.set(0, key.get());
record.set(1, sum);
context.write(null, record);
}
}
public int run(String[] args) throws Exception {
Configuration conf = getConf();
args = new GenericOptionsParser(conf, args).getRemainingArgs();
String serverUri = args[0];
String inputTableName = args[1];
String outputTableName = args[2];
String dbName = null;
String principalID = System
.getProperty(HCatConstants.HCAT_METASTORE_PRINCIPAL);
if (principalID != null)
conf.set(HCatConstants.HCAT_METASTORE_PRINCIPAL, principalID);
Job job = new Job(conf, "GroupByAge");
HCatInputFormat.setInput(job, InputJobInfo.create(dbName, inputTableName, null));
// initialize HCatOutputFormat
job.setInputFormatClass(HCatInputFormat.class);
job.setJarByClass(GroupByAge.class);
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(IntWritable.class);
job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(WritableComparable.class);
job.setOutputValueClass(DefaultHCatRecord.class);
HCatOutputFormat.setOutput(job, OutputJobInfo.create(dbName, outputTableName, null));
HCatSchema s = HCatOutputFormat.getTableSchema(job);
System.err.println("INFO: output schema explicitly set for writing:" + s);
HCatOutputFormat.setSchema(job, s);
job.setOutputFormatClass(HCatOutputFormat.class);
return (job.waitForCompletion(true) ? 0 : 1);
}
public static void main(String[] args) throws Exception {
int exitCode = ToolRunner.run(new GroupByAge(), args);
System.exit(exitCode);
}
}
Antes de compilar o programa acima, você deve baixar alguns jars e adicione-os ao classpathpara este aplicativo. Você precisa baixar todos os jars Hive e HCatalog jars (HCatalog-core-0.5.0.jar, hive-metastore-0.10.0.jar, libthrift-0.7.0.jar, hive-exec-0.10.0.jar, libfb303-0.7.0.jar, jdo2-api-2.3-ec.jar, slf4j-api-1.6.1.jar).
Use os seguintes comandos para copiá-los jar arquivos de local para HDFS e adicione-os ao classpath.
bin/hadoop fs -copyFromLocal $HCAT_HOME/share/HCatalog/HCatalog-core-0.5.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-metastore-0.10.0.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libthrift-0.7.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/hive-exec-0.10.0.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/libfb303-0.7.0.jar /tmp bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/jdo2-api-2.3-ec.jar /tmp
bin/hadoop fs -copyFromLocal $HIVE_HOME/lib/slf4j-api-1.6.1.jar /tmp
export LIB_JARS=hdfs:///tmp/HCatalog-core-0.5.0.jar,
hdfs:///tmp/hive-metastore-0.10.0.jar,
hdfs:///tmp/libthrift-0.7.0.jar,
hdfs:///tmp/hive-exec-0.10.0.jar,
hdfs:///tmp/libfb303-0.7.0.jar,
hdfs:///tmp/jdo2-api-2.3-ec.jar,
hdfs:///tmp/slf4j-api-1.6.1.jar
Use o seguinte comando para compilar e executar o programa fornecido.
$HADOOP_HOME/bin/hadoop jar GroupByAge tmp/hive
Agora, verifique o diretório de saída (hdfs: user / tmp / hive) para a saída (part_0000, part_0001).
o HCatLoader e HCatStorerAPIs são usados com scripts Pig para ler e gravar dados em tabelas gerenciadas pelo HCatalog. Nenhuma configuração específica do HCatalog é necessária para essas interfaces.
É melhor ter algum conhecimento sobre os scripts do Apache Pig para entender melhor este capítulo. Para obter mais referências, consulte nosso tutorial do Apache Pig .
HCatloader
HCatLoader é usado com scripts Pig para ler dados de tabelas gerenciadas pelo HCatalog. Use a seguinte sintaxe para carregar dados no HDFS usando HCatloader.
A = LOAD 'tablename' USING org.apache.HCatalog.pig.HCatLoader();
Você deve especificar o nome da tabela entre aspas simples: LOAD 'tablename'. Se você estiver usando um banco de dados não padrão, deverá especificar sua entrada como 'dbname.tablename'.
O metastore Hive permite criar tabelas sem especificar um banco de dados. Se você criou tabelas dessa maneira, o nome do banco de dados é'default' e não é necessário ao especificar a tabela para HCatLoader.
A tabela a seguir contém os métodos importantes e a descrição da classe HCatloader.
Sr. Não. | Nome e descrição do método |
---|---|
1 | public InputFormat<?,?> getInputFormat()throws IOException Leia o formato de entrada dos dados de carregamento usando a classe HCatloader. |
2 | public String relativeToAbsolutePath(String location, Path curDir) throws IOException Ele retorna o formato de String do Absolute path. |
3 | public void setLocation(String location, Job job) throws IOException Ele define o local onde o trabalho pode ser executado. |
4 | public Tuple getNext() throws IOException Retorna a tupla atual (key e value) do loop. |
HCatStorer
HCatStorer é usado com scripts Pig para gravar dados em tabelas gerenciadas pelo HCatalog. Use a seguinte sintaxe para operação de armazenamento.
A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...
STORE my_processed_data INTO 'tablename' USING org.apache.HCatalog.pig.HCatStorer();
Você deve especificar o nome da tabela entre aspas simples: LOAD 'tablename'. O banco de dados e a tabela devem ser criados antes de executar o script Pig. Se você estiver usando um banco de dados não padrão, você deve especificar sua entrada como'dbname.tablename'.
O metastore Hive permite criar tabelas sem especificar um banco de dados. Se você criou tabelas dessa maneira, o nome do banco de dados é'default' e você não precisa especificar o nome do banco de dados no store declaração.
Para o USINGcláusula, você pode ter um argumento de string que representa pares chave / valor para partições. Este é um argumento obrigatório quando você está gravando em uma tabela particionada e a coluna de partição não está na coluna de saída. Os valores das chaves de partição NÃO devem ser citados.
A tabela a seguir contém os métodos importantes e a descrição da classe HCatStorer.
Sr. Não. | Nome e descrição do método |
---|---|
1 | public OutputFormat getOutputFormat() throws IOException Leia o formato de saída dos dados armazenados usando a classe HCatStorer. |
2 | public void setStoreLocation (String location, Job job) throws IOException Define o local onde executar isso store inscrição. |
3 | public void storeSchema (ResourceSchema schema, String arg1, Job job) throws IOException Armazene o esquema. |
4 | public void prepareToWrite (RecordWriter writer) throws IOException Isso ajuda a gravar dados em um arquivo específico usando o RecordWriter. |
5 | public void putNext (Tuple tuple) throws IOException Grava os dados da tupla no arquivo. |
Executando Pig com HCatalog
O Pig não coleta frascos HCatalog automaticamente. Para trazer os jars necessários, você pode usar um sinalizador no comando Pig ou definir as variáveis de ambientePIG_CLASSPATH e PIG_OPTS como descrito abaixo.
Para trazer os frascos apropriados para trabalhar com HCatalog, basta incluir a seguinte sinalização -
pig –useHCatalog <Sample pig scripts file>
Configurando o CLASSPATH para execução
Use a seguinte configuração CLASSPATH para sincronizar o HCatalog com o Apache Pig.
export HADOOP_HOME = <path_to_hadoop_install>
export HIVE_HOME = <path_to_hive_install>
export HCAT_HOME = <path_to_hcat_install>
export PIG_CLASSPATH = $HCAT_HOME/share/HCatalog/HCatalog-core*.jar:\ $HCAT_HOME/share/HCatalog/HCatalog-pig-adapter*.jar:\
$HIVE_HOME/lib/hive-metastore-*.jar:$HIVE_HOME/lib/libthrift-*.jar:\
$HIVE_HOME/lib/hive-exec-*.jar:$HIVE_HOME/lib/libfb303-*.jar:\
$HIVE_HOME/lib/jdo2-api-*-ec.jar:$HIVE_HOME/conf:$HADOOP_HOME/conf:\ $HIVE_HOME/lib/slf4j-api-*.jar
Exemplo
Suponha que temos um arquivo student_details.txt em HDFS com o seguinte conteúdo.
student_details.txt
001, Rajiv, Reddy, 21, 9848022337, Hyderabad
002, siddarth, Battacharya, 22, 9848022338, Kolkata
003, Rajesh, Khanna, 22, 9848022339, Delhi
004, Preethi, Agarwal, 21, 9848022330, Pune
005, Trupthi, Mohanthy, 23, 9848022336, Bhuwaneshwar
006, Archana, Mishra, 23, 9848022335, Chennai
007, Komal, Nayak, 24, 9848022334, trivendram
008, Bharathi, Nambiayar, 24, 9848022333, Chennai
Também temos um script de exemplo com o nome sample_script.pig, no mesmo diretório HDFS. Este arquivo contém instruções que executam operações e transformações nostudent relação, conforme mostrado abaixo.
student = LOAD 'hdfs://localhost:9000/pig_data/student_details.txt' USING
PigStorage(',') as (id:int, firstname:chararray, lastname:chararray,
phone:chararray, city:chararray);
student_order = ORDER student BY age DESC;
STORE student_order INTO 'student_order_table' USING org.apache.HCatalog.pig.HCatStorer();
student_limit = LIMIT student_order 4;
Dump student_limit;
A primeira instrução do script carregará os dados no arquivo denominado student_details.txt como uma relação chamada student.
A segunda declaração do script irá organizar as tuplas da relação em ordem decrescente, com base na idade, e armazená-la como student_order.
A terceira instrução armazena os dados processados student_order resulta em uma tabela separada chamada student_order_table.
A quarta declaração do script irá armazenar as primeiras quatro tuplas de student_order Como student_limit.
Finalmente, a quinta declaração irá despejar o conteúdo da relação student_limit.
Vamos agora executar o sample_script.pig como mostrado abaixo.
$./pig -useHCatalog hdfs://localhost:9000/pig_data/sample_script.pig
Agora, verifique o diretório de saída (hdfs: user / tmp / hive) para a saída (part_0000, part_0001).