HCatalog - Guide rapide
Qu'est-ce que HCatalog?
HCatalog est un outil de gestion de stockage de table pour Hadoop. Il expose les données tabulaires du métastore Hive à d'autres applications Hadoop. Il permet aux utilisateurs disposant de différents outils de traitement de données (Pig, MapReduce) d'écrire facilement des données sur une grille. Cela garantit que les utilisateurs n'ont pas à se soucier de l'endroit ou du format de stockage de leurs données.
HCatalog fonctionne comme un composant clé de Hive et permet aux utilisateurs de stocker leurs données dans n'importe quel format et n'importe quelle structure.
Pourquoi HCatalog?
Activer le bon outil pour le bon travail
L'écosystème Hadoop contient différents outils de traitement des données tels que Hive, Pig et MapReduce. Bien que ces outils ne nécessitent pas de métadonnées, ils peuvent toujours en bénéficier lorsqu'ils sont présents. Le partage d'un magasin de métadonnées permet également aux utilisateurs de tous les outils de partager des données plus facilement. Un flux de travail où les données sont chargées et normalisées à l'aide de MapReduce ou Pig, puis analysées via Hive est très courant. Si tous ces outils partagent un métastore, les utilisateurs de chaque outil ont un accès immédiat aux données créées avec un autre outil. Aucune étape de chargement ou de transfert n'est requise.
Capturez les états de traitement pour activer le partage
HCatalog peut publier vos résultats d'analyse. Ainsi, l'autre programmeur peut accéder à votre plate-forme d'analyse via «REST». Les schémas que vous publiez sont également utiles aux autres data scientists. Les autres data scientists utilisent vos découvertes comme entrées dans une découverte ultérieure.
Intégrez Hadoop à tout
Hadoop en tant qu'environnement de traitement et de stockage ouvre de nombreuses opportunités pour l'entreprise; cependant, pour favoriser l'adoption, il doit travailler avec et augmenter les outils existants. Hadoop doit servir d'entrée dans votre plate-forme d'analyse ou s'intégrer à vos magasins de données opérationnels et applications Web. L'organisation doit profiter de la valeur de Hadoop sans avoir à apprendre un ensemble d'outils entièrement nouveau. Les services REST ouvrent la plate-forme à l'entreprise avec une API familière et un langage de type SQL. Les systèmes de gestion de données d'entreprise utilisent HCatalog pour s'intégrer plus profondément à la plate-forme Hadoop.
Architecture HCatalog
L'illustration suivante montre l'architecture globale de HCatalog.
HCatalog prend en charge la lecture et l'écriture de fichiers dans tous les formats pour lesquels un SerDe(sérialiseur-désérialiseur) peut être écrit. Par défaut, HCatalog prend en charge les formats de fichier RCFile, CSV, JSON, SequenceFile et ORC. Pour utiliser un format personnalisé, vous devez fournir InputFormat, OutputFormat et SerDe.
HCatalog est construit au-dessus du métastore Hive et intègre le DDL de Hive. HCatalog fournit des interfaces de lecture et d'écriture pour Pig et MapReduce et utilise l'interface de ligne de commande de Hive pour émettre des commandes de définition de données et d'exploration de métadonnées.
Tous les sous-projets Hadoop tels que Hive, Pig et HBase prennent en charge le système d'exploitation Linux. Par conséquent, vous devez installer une version Linux sur votre système. HCatalog est fusionné avec Hive Installation le 26 mars 2013. À partir de la version Hive-0.11.0, HCatalog est livré avec l'installation Hive. Par conséquent, suivez les étapes ci-dessous pour installer Hive qui à son tour installera automatiquement HCatalog sur votre système.
Étape 1: Vérification de l'installation JAVA
Java doit être installé sur votre système avant d'installer Hive. Vous pouvez utiliser la commande suivante pour vérifier si Java est déjà installé sur votre système -
$ java –version
Si Java est déjà installé sur votre système, vous obtenez la réponse suivante -
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)
Si Java n'est pas installé sur votre système, vous devez suivre les étapes ci-dessous.
Étape 2: Installation de Java
Téléchargez Java (JDK <dernière version> - X64.tar.gz) en visitant le lien suivant http://www.oracle.com/
ensuite jdk-7u71-linux-x64.tar.gz sera téléchargé sur votre système.
En général, vous trouverez le fichier Java téléchargé dans le dossier Téléchargements. Vérifiez-le et extrayez lejdk-7u71-linux-x64.gz fichier à l'aide des commandes suivantes.
$ 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
Pour rendre Java disponible à tous les utilisateurs, vous devez le déplacer vers l'emplacement «/ usr / local /». Ouvrez root et saisissez les commandes suivantes.
$ su
password:
# mv jdk1.7.0_71 /usr/local/
# exit
Pour la mise en place PATH et JAVA_HOME variables, ajoutez les commandes suivantes à ~/.bashrc fichier.
export JAVA_HOME=/usr/local/jdk1.7.0_71
export PATH=PATH:$JAVA_HOME/bin
Vérifiez maintenant l'installation à l'aide de la commande java -version depuis le terminal comme expliqué ci-dessus.
Étape 3: vérification de l'installation de Hadoop
Hadoop doit être installé sur votre système avant d'installer Hive. Vérifions l'installation de Hadoop à l'aide de la commande suivante -
$ hadoop version
Si Hadoop est déjà installé sur votre système, vous obtiendrez la réponse suivante -
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
Si Hadoop n'est pas installé sur votre système, procédez comme suit:
Étape 4: Téléchargement de Hadoop
Téléchargez et extrayez Hadoop 2.4.1 depuis Apache Software Foundation à l'aide des commandes suivantes.
$ 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
Étape 5: Installation de Hadoop en mode pseudo distribué
Les étapes suivantes sont utilisées pour installer Hadoop 2.4.1 en mode pseudo distribué.
Configurer Hadoop
Vous pouvez définir des variables d'environnement Hadoop en ajoutant les commandes suivantes à ~/.bashrc fichier.
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
Appliquez maintenant toutes les modifications dans le système en cours d'exécution.
$ source ~/.bashrc
Configuration Hadoop
Vous pouvez trouver tous les fichiers de configuration Hadoop à l'emplacement «$ HADOOP_HOME / etc / hadoop». Vous devez apporter les modifications appropriées à ces fichiers de configuration en fonction de votre infrastructure Hadoop.
$ cd $HADOOP_HOME/etc/hadoop
Pour développer des programmes Hadoop à l'aide de Java, vous devez réinitialiser les variables d'environnement Java dans hadoop-env.sh fichier en remplaçant JAVA_HOME value avec l'emplacement de Java dans votre système.
export JAVA_HOME=/usr/local/jdk1.7.0_71
Vous trouverez ci-dessous la liste des fichiers que vous devez modifier pour configurer Hadoop.
core-site.xml
le core-site.xml Le fichier contient des informations telles que le numéro de port utilisé pour l'instance Hadoop, la mémoire allouée pour le système de fichiers, la limite de mémoire pour stocker les données et la taille des tampons de lecture / écriture.
Ouvrez le fichier core-site.xml et ajoutez les propriétés suivantes entre les balises <configuration> et </configuration>.
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
hdfs-site.xml
le hdfs-site.xmlLe fichier contient des informations telles que la valeur des données de réplication, le chemin du namenode et le chemin du datanode de vos systèmes de fichiers locaux. Cela signifie l'endroit où vous souhaitez stocker l'infrastructure Hadoop.
Supposons les données suivantes.
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
Ouvrez ce fichier et ajoutez les propriétés suivantes entre les balises <configuration>, </configuration> de ce fichier.
<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 - Dans le fichier ci-dessus, toutes les valeurs de propriété sont définies par l'utilisateur et vous pouvez apporter des modifications en fonction de votre infrastructure Hadoop.
yarn-site.xml
Ce fichier est utilisé pour configurer le fil dans Hadoop. Ouvrez le fichier yarn-site.xml et ajoutez les propriétés suivantes entre les balises <configuration>, </configuration> de ce fichier.
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
mapred-site.xml
Ce fichier est utilisé pour spécifier le framework MapReduce que nous utilisons. Par défaut, Hadoop contient un modèle de yarn-site.xml. Tout d'abord, vous devez copier le fichier depuismapred-site,xml.template à mapred-site.xml fichier à l'aide de la commande suivante.
$ cp mapred-site.xml.template mapred-site.xml
Ouvrez le fichier mapred-site.xml et ajoutez les propriétés suivantes entre les balises <configuration>, </configuration> de ce fichier.
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
Étape 6: Vérification de l'installation de Hadoop
Les étapes suivantes permettent de vérifier l'installation de Hadoop.
Configuration de Namenode
Configurez le namenode en utilisant la commande "hdfs namenode -format" comme suit -
$ cd ~ $ hdfs namenode -format
Le résultat attendu est le suivant -
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
************************************************************/
Vérification de Hadoop DFS
La commande suivante est utilisée pour démarrer le DFS. L'exécution de cette commande démarrera votre système de fichiers Hadoop.
$ start-dfs.sh
Le résultat attendu est le suivant -
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]
Vérification du script de fil
La commande suivante est utilisée pour démarrer le script Yarn. L'exécution de cette commande démarrera vos démons Yarn.
$ start-yarn.sh
Le résultat attendu est le suivant -
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
Accéder à Hadoop sur le navigateur
Le numéro de port par défaut pour accéder à Hadoop est 50070. Utilisez l'URL suivante pour obtenir les services Hadoop sur votre navigateur.
http://localhost:50070/
Vérifier toutes les applications pour le cluster
Le numéro de port par défaut pour accéder à toutes les applications du cluster est 8088. Utilisez l'url suivante pour visiter ce service.
http://localhost:8088/
Une fois que vous avez terminé l'installation de Hadoop, passez à l'étape suivante et installez Hive sur votre système.
Étape 7: Téléchargement de Hive
Nous utilisons hive-0.14.0 dans ce tutoriel. Vous pouvez le télécharger en visitant le lien suivanthttp://apache.petsads.us/hive/hive-0.14.0/. Supposons qu'il soit téléchargé sur le/Downloadsannuaire. Ici, nous téléchargeons l'archive Hive nommée "apache-hive-0.14.0-bin.tar.gz»Pour ce didacticiel. La commande suivante est utilisée pour vérifier le téléchargement -
$ cd Downloads $ ls
Lors du téléchargement réussi, vous obtenez la réponse suivante -
apache-hive-0.14.0-bin.tar.gz
Étape 8: Installation de Hive
Les étapes suivantes sont nécessaires pour installer Hive sur votre système. Supposons que l'archive Hive soit téléchargée sur le/Downloads annuaire.
Extraction et vérification de l'archive Hive
La commande suivante est utilisée pour vérifier le téléchargement et extraire l'archive Hive -
$ tar zxvf apache-hive-0.14.0-bin.tar.gz $ ls
Lors du téléchargement réussi, vous obtenez la réponse suivante -
apache-hive-0.14.0-bin apache-hive-0.14.0-bin.tar.gz
Copie de fichiers dans le répertoire / usr / local / hive
Nous devons copier les fichiers du superutilisateur «su -». Les commandes suivantes sont utilisées pour copier les fichiers du répertoire extrait vers le/usr/local/hive»Répertoire.
$ su -
passwd:
# cd /home/user/Download
# mv apache-hive-0.14.0-bin /usr/local/hive
# exit
Configuration de l'environnement pour Hive
Vous pouvez configurer l'environnement Hive en ajoutant les lignes suivantes à ~/.bashrc fichier -
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/*:.
La commande suivante est utilisée pour exécuter le fichier ~ / .bashrc.
$ source ~/.bashrc
Étape 9: Configuration de Hive
Pour configurer Hive avec Hadoop, vous devez modifier le hive-env.sh fichier, qui est placé dans le $HIVE_HOME/confannuaire. Les commandes suivantes redirigent vers Hiveconfig dossier et copiez le fichier modèle -
$ cd $HIVE_HOME/conf $ cp hive-env.sh.template hive-env.sh
Modifier le hive-env.sh fichier en ajoutant la ligne suivante -
export HADOOP_HOME=/usr/local/hadoop
Avec cela, l'installation de Hive est terminée. Vous avez maintenant besoin d'un serveur de base de données externe pour configurer Metastore. Nous utilisons la base de données Apache Derby.
Étape 10: Téléchargement et installation d'Apache Derby
Suivez les étapes ci-dessous pour télécharger et installer Apache Derby -
Téléchargement d'Apache Derby
La commande suivante est utilisée pour télécharger Apache Derby. Le téléchargement prend un certain temps.
$ cd ~ $ wget http://archive.apache.org/dist/db/derby/db-derby-10.4.2.0/db-derby-10.4.2.0-bin.tar.gz
La commande suivante est utilisée pour vérifier le téléchargement -
$ ls
Lors du téléchargement réussi, vous obtenez la réponse suivante -
db-derby-10.4.2.0-bin.tar.gz
Extraction et vérification de l'archive Derby
Les commandes suivantes sont utilisées pour extraire et vérifier l'archive Derby -
$ tar zxvf db-derby-10.4.2.0-bin.tar.gz
$ ls
Lors du téléchargement réussi, vous obtenez la réponse suivante -
db-derby-10.4.2.0-bin db-derby-10.4.2.0-bin.tar.gz
Copie de fichiers dans le répertoire / usr / local / derby
Nous devons copier depuis le superutilisateur «su -». Les commandes suivantes sont utilisées pour copier les fichiers du répertoire extrait vers le/usr/local/derby annuaire -
$ su -
passwd:
# cd /home/user
# mv db-derby-10.4.2.0-bin /usr/local/derby
# exit
Configuration de l'environnement pour Derby
Vous pouvez configurer l'environnement Derby en ajoutant les lignes suivantes à ~/.bashrc fichier -
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
La commande suivante est utilisée pour exécuter ~/.bashrc file -
$ source ~/.bashrc
Créer un répertoire pour Metastore
Créez un répertoire nommé data dans le répertoire $ DERBY_HOME pour stocker les données Metastore.
$ mkdir $DERBY_HOME/data
L'installation de Derby et la configuration de l'environnement sont maintenant terminées.
Étape 11: Configuration du métastore Hive
Configurer Metastore signifie spécifier à Hive où la base de données est stockée. Vous pouvez le faire en modifiant lehive-site.xml fichier, qui est dans le $HIVE_HOME/confannuaire. Tout d'abord, copiez le fichier modèle à l'aide de la commande suivante -
$ cd $HIVE_HOME/conf
$ cp hive-default.xml.template hive-site.xml
Éditer hive-site.xml et ajoutez les lignes suivantes entre les balises <configuration> et </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>
Créez un fichier nommé jpox.properties et ajoutez-y les lignes suivantes -
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
Étape 12: Vérification de l'installation de Hive
Avant d'exécuter Hive, vous devez créer le /tmpdossier et un dossier Hive distinct dans HDFS. Ici, nous utilisons le/user/hive/warehousedossier. Vous devez définir l'autorisation d'écriture pour ces dossiers nouvellement créés comme indiqué ci-dessous -
chmod g+w
Maintenant, définissez-les dans HDFS avant de vérifier Hive. Utilisez les commandes suivantes -
$ $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
Les commandes suivantes sont utilisées pour vérifier l'installation de Hive -
$ cd $HIVE_HOME $ bin/hive
Une fois l'installation réussie de Hive, vous obtenez la réponse suivante -
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>
Vous pouvez exécuter l'exemple de commande suivant pour afficher toutes les tables -
hive> show tables;
OK Time taken: 2.798 seconds
hive>
Étape 13: Vérifiez l'installation de HCatalog
Utilisez la commande suivante pour définir une variable système HCAT_HOME pour HCatalog Home.
export HCAT_HOME = $HiVE_HOME/HCatalog
Utilisez la commande suivante pour vérifier l'installation de HCatalog.
cd $HCAT_HOME/bin
./hcat
Si l'installation réussit, vous verrez la sortie suivante -
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
L'interface de ligne de commande HCatalog (CLI) peut être appelée à partir de la commande $HIVE_HOME/HCatalog/bin/hcat où $ HIVE_HOME est le répertoire personnel de Hive. hcat est une commande utilisée pour initialiser le serveur HCatalog.
Utilisez la commande suivante pour initialiser la ligne de commande HCatalog.
cd $HCAT_HOME/bin
./hcat
Si l'installation a été effectuée correctement, vous obtiendrez le résultat suivant -
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
La CLI HCatalog prend en charge ces options de ligne de commande -
Sr.Non | Option | Exemple et description |
---|---|---|
1 | -g | hcat -g mygroup ... La table à créer doit avoir le groupe "mygroup". |
2 | -p | hcat -p rwxr-xr-x ... La table à créer doit disposer des autorisations de lecture, d'écriture et d'exécution. |
3 | -F | hcat -f myscript.HCatalog ... myscript.HCatalog est un fichier script contenant des commandes DDL à exécuter. |
4 | -e | hcat -e 'create table mytable(a int);' ... Traitez la chaîne suivante comme une commande DDL et exécutez-la. |
5 | -RÉ | hcat -Dkey = value ... Passe la paire clé-valeur à HCatalog en tant que propriété système Java. |
6 | - | hcat Imprime un message d'utilisation. |
Remarque -
le -g et -p les options ne sont pas obligatoires.
À un moment donné, soit -e ou -f l'option peut être fournie, pas les deux.
L'ordre des options est sans importance; vous pouvez spécifier les options dans n'importe quel ordre.
Sr.Non | Commande DDL et description |
---|---|
1 | CREATE TABLE Créez une table à l'aide de HCatalog. Si vous créez une table avec une clause CLUSTERED BY, vous ne pourrez pas y écrire avec Pig ou MapReduce. |
2 | ALTER TABLE Pris en charge à l'exception des options REBUILD et CONCATENATE. Son comportement reste le même que dans Hive. |
3 | DROP TABLE Prise en charge. Comportement identique à Hive (Supprimez le tableau et la structure complets). |
4 | CREATE/ALTER/DROP VIEW Prise en charge. Comportement identique à Hive. Note - Pig et MapReduce ne peuvent pas lire ou écrire dans les vues. |
5 | SHOW TABLES Affichez une liste de tableaux. |
6 | SHOW PARTITIONS Affichez une liste de partitions. |
sept | Create/Drop Index Les opérations CREATE et DROP FUNCTION sont prises en charge, mais les fonctions créées doivent toujours être enregistrées dans Pig et placées dans CLASSPATH pour MapReduce. |
8 | DESCRIBE Prise en charge. Comportement identique à Hive. Décrivez la structure. |
Certaines des commandes du tableau ci-dessus sont expliquées dans les chapitres suivants.
Ce chapitre explique comment créer un tableau et comment y insérer des données. Les conventions de création d'une table dans HCatalog sont assez similaires à la création d'une table à l'aide de Hive.
Créer une instruction de table
Create Table est une instruction utilisée pour créer une table dans le métastore Hive à l'aide de HCatalog. Sa syntaxe et son exemple sont les suivants -
Syntaxe
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]
Exemple
Supposons que vous ayez besoin de créer une table nommée employee en utilisant CREATE TABLEdéclaration. Le tableau suivant répertorie les champs et leurs types de données dans leemployee table -
Sr.Non | Nom de domaine | Type de données |
---|---|---|
1 | Eid | int |
2 | Nom | Chaîne |
3 | Un salaire | Flotte |
4 | La désignation | chaîne |
Les données suivantes définissent les champs pris en charge tels que Comment, Champs au format de ligne tels que Field terminator, Lines terminator, et Stored File type.
COMMENT ‘Employee details’
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED IN TEXT FILE
La requête suivante crée une table nommée employee en utilisant les données ci-dessus.
./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;"
Si vous ajoutez l'option IF NOT EXISTS, HCatalog ignore l'instruction au cas où la table existe déjà.
Lors de la création réussie de la table, vous obtenez la réponse suivante -
OK
Time taken: 5.905 seconds
Charger la déclaration de données
Généralement, après avoir créé une table en SQL, nous pouvons insérer des données à l'aide de l'instruction Insert. Mais dans HCatalog, nous insérons des données à l'aide de l'instruction LOAD DATA.
Lors de l'insertion de données dans HCatalog, il est préférable d'utiliser LOAD DATA pour stocker des enregistrements en masse. Il existe deux façons de charger des données: l'une est à partir delocal file system et le second est de Hadoop file system.
Syntaxe
La syntaxe de LOAD DATA est la suivante -
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
- LOCAL est l'identifiant pour spécifier le chemin local. C'est facultatif.
- OVERWRITE est facultatif pour écraser les données de la table.
- LA PARTITION est facultative.
Exemple
Nous insérerons les données suivantes dans le tableau. C'est un fichier texte nommésample.txt dans /home/user annuaire.
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
La requête suivante charge le texte donné dans la table.
./hcat –e "LOAD DATA LOCAL INPATH '/home/user/sample.txt'
OVERWRITE INTO TABLE employee;"
Lors du téléchargement réussi, vous obtenez la réponse suivante -
OK
Time taken: 15.905 seconds
Ce chapitre explique comment modifier les attributs d'une table, comme changer son nom de table, changer les noms de colonne, ajouter des colonnes et supprimer ou remplacer des colonnes.
Instruction Alter Table
Vous pouvez utiliser l'instruction ALTER TABLE pour modifier une table dans Hive.
Syntaxe
L'instruction prend l'une des syntaxes suivantes en fonction des attributs que nous souhaitons modifier dans une table.
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 ...])
Certains des scénarios sont expliqués ci-dessous.
Renommer en… Instruction
La requête suivante renomme une table de employee à emp.
./hcat –e "ALTER TABLE employee RENAME TO emp;"
Déclaration de changement
Le tableau suivant contient les champs de employee table et il montre les champs à modifier (en gras).
Nom de domaine | Convertir à partir du type de données | Changer le nom du champ | Convertir en type de données |
---|---|---|---|
eid | int | eid | int |
Nom | Chaîne | ename | Chaîne |
un salaire | Flotte | un salaire | Double |
la désignation | Chaîne | la désignation | Chaîne |
Les requêtes suivantes renomment le nom de la colonne et le type de données de la colonne en utilisant les données ci-dessus -
./hcat –e "ALTER TABLE employee CHANGE name ename String;"
./hcat –e "ALTER TABLE employee CHANGE salary salary Double;"
Instruction Add Columns
La requête suivante ajoute une colonne nommée dept à la employee table.
./hcat –e "ALTER TABLE employee ADD COLUMNS (dept STRING COMMENT 'Department name');"
Remplacer l'instruction
La requête suivante supprime toutes les colonnes du employee table et la remplace par emp et name colonnes -
./hcat – e "ALTER TABLE employee REPLACE COLUMNS ( eid INT empid Int, ename STRING name String);"
Instruction Drop Table
Ce chapitre décrit comment supprimer une table dans HCatalog. Lorsque vous supprimez une table du métastore, cela supprime les données de la table / colonne et leurs métadonnées. Il peut s'agir d'une table normale (stockée dans le metastore) ou d'une table externe (stockée dans le système de fichiers local); HCatalog traite les deux de la même manière, quels que soient leurs types.
La syntaxe est la suivante -
DROP TABLE [IF EXISTS] table_name;
La requête suivante supprime une table nommée employee -
./hcat –e "DROP TABLE IF EXISTS employee;"
Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante -
OK
Time taken: 5.3 seconds
Ce chapitre décrit comment créer et gérer un viewdans HCatalog. Les vues de base de données sont créées à l'aide duCREATE VIEWdéclaration. Les vues peuvent être créées à partir d'une seule table, de plusieurs tables ou d'une autre vue.
Pour créer une vue, un utilisateur doit disposer des privilèges système appropriés en fonction de l'implémentation spécifique.
Créer une déclaration de vue
CREATE VIEWcrée une vue avec le nom donné. Une erreur est générée si une table ou une vue portant le même nom existe déjà. Vous pouvez utiliserIF NOT EXISTS pour ignorer l'erreur.
Si aucun nom de colonne n'est fourni, les noms des colonnes de la vue seront automatiquement dérivés du defining SELECT expression.
Note - Si le SELECT contient des expressions scalaires sans alias telles que x + y, les noms de colonne de vue résultants seront générés sous la forme _C0, _C1, etc.
Lors du changement de nom des colonnes, des commentaires de colonne peuvent également être fournis. Les commentaires ne sont pas automatiquement hérités des colonnes sous-jacentes.
Une instruction CREATE VIEW échouera si la vue defining SELECT expression est invalide.
Syntaxe
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
[COMMENT view_comment]
[TBLPROPERTIES (property_name = property_value, ...)]
AS SELECT ...;
Exemple
Voici les données de la table des employés. Voyons maintenant comment créer une vue nomméeEmp_Deg_View contenant les champs id, nom, désignation et salaire d'un employé ayant un salaire supérieur à 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 |
+------+-------------+--------+-------------------+-------+
Voici la commande permettant de créer une vue basée sur les données ci-dessus.
./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;"
Production
OK
Time taken: 5.3 seconds
Déclaration Drop View
DROP VIEW supprime les métadonnées de la vue spécifiée. Lors de la suppression d'une vue référencée par d'autres vues, aucun avertissement n'est donné (les vues dépendantes sont laissées pendantes comme non valides et doivent être supprimées ou recréées par l'utilisateur).
Syntaxe
DROP VIEW [IF EXISTS] view_name;
Exemple
La commande suivante est utilisée pour supprimer une vue nommée Emp_Deg_View.
DROP VIEW Emp_Deg_View;
Vous souhaitez souvent répertorier toutes les tables d'une base de données ou répertorier toutes les colonnes d'une table. Évidemment, chaque base de données a sa propre syntaxe pour lister les tables et les colonnes.
Show TablesL'instruction affiche les noms de toutes les tables. Par défaut, il répertorie les tables de la base de données actuelle ou avec leIN clause, dans une base de données spécifiée.
Ce chapitre décrit comment lister toutes les tables de la base de données actuelle dans HCatalog.
Instruction Show Tables
La syntaxe de SHOW TABLES est la suivante -
SHOW TABLES [IN database_name] ['identifier_with_wildcards'];
La requête suivante affiche une liste de tables -
./hcat –e "Show tables;"
Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante -
OK
emp
employee
Time taken: 5.3 seconds
Une partition est une condition pour les données tabulaires qui est utilisée pour créer une table ou une vue distincte. SHOW PARTITIONS répertorie toutes les partitions existantes pour une table de base donnée. Les partitions sont répertoriées par ordre alphabétique. Après Hive 0.6, il est également possible de spécifier des parties d'une spécification de partition pour filtrer la liste résultante.
Vous pouvez utiliser la commande SHOW PARTITIONS pour voir les partitions qui existent dans une table particulière. Ce chapitre décrit comment lister les partitions d'une table particulière dans HCatalog.
Afficher la déclaration des partitions
La syntaxe est la suivante -
SHOW PARTITIONS table_name;
La requête suivante supprime une table nommée employee -
./hcat –e "Show partitions employee;"
Lors de l'exécution réussie de la requête, vous obtenez la réponse suivante -
OK
Designation = IT
Time taken: 5.3 seconds
Partition dynamique
HCatalog organise les tables en partitions. C'est un moyen de diviser une table en parties liées en fonction des valeurs de colonnes partitionnées telles que la date, la ville et le département. À l'aide de partitions, il est facile d'interroger une partie des données.
Par exemple, une table nommée Tab1contient des données sur les employés telles que l'identifiant, le nom, le service et le yoj (c'est-à-dire l'année de l'adhésion). Supposons que vous ayez besoin de récupérer les détails de tous les employés qui se sont joints en 2012. Une requête recherche dans toute la table les informations requises. Cependant, si vous partitionnez les données des employés avec l'année et les stockez dans un fichier séparé, cela réduit le temps de traitement des requêtes. L'exemple suivant montre comment partitionner un fichier et ses données -
Le fichier suivant contient employeedata table.
/ tab1 / employeedata / file1
id, name, dept, yoj
1, gopal, TP, 2012
2, kiran, HR, 2012
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Les données ci-dessus sont partitionnées en deux fichiers en utilisant l'année.
/ tab1 / employeedata / 2012 / file2
1, gopal, TP, 2012
2, kiran, HR, 2012
/ tab1 / employeedata / 2013 / file3
3, kaleel, SC, 2013
4, Prasanth, SC, 2013
Ajouter une partition
Nous pouvons ajouter des partitions à une table en modifiant la table. Supposons que nous ayons une table appeléeemployee avec des champs tels que Id, Nom, Salaire, Désignation, Département et yoj.
Syntaxe
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, ...)
La requête suivante est utilisée pour ajouter une partition au employee table.
./hcat –e "ALTER TABLE employee ADD PARTITION (year = '2013') location '/2012/part2012';"
Renommer une partition
Vous pouvez utiliser la commande RENAME-TO pour renommer une partition. Sa syntaxe est la suivante -
./hact –e "ALTER TABLE table_name PARTITION partition_spec RENAME TO PARTITION partition_spec;"
La requête suivante est utilisée pour renommer une partition -
./hcat –e "ALTER TABLE employee PARTITION (year=’1203’) RENAME TO PARTITION (Yoj='1203');"
Supprimer une partition
La syntaxe de la commande utilisée pour supprimer une partition est la suivante -
./hcat –e "ALTER TABLE table_name DROP [IF EXISTS] PARTITION partition_spec,.
PARTITION partition_spec,...;"
La requête suivante est utilisée pour supprimer une partition -
./hcat –e "ALTER TABLE employee DROP [IF EXISTS] PARTITION (year=’1203’);"
Créer un index
Un index n'est rien d'autre qu'un pointeur sur une colonne particulière d'une table. Créer un index signifie créer un pointeur sur une colonne particulière d'une table. Sa syntaxe est la suivante -
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 (...)]
Exemple
Prenons un exemple pour comprendre le concept d'indice. Utilisez le mêmeemployee table que nous avons utilisée précédemment avec les champs Id, Name, Salary, Designation et Dept. Créez un index nommé index_salary sur le salary colonne de la employee table.
La requête suivante crée un index -
./hcat –e "CREATE INDEX inedx_salary ON TABLE employee(salary)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler';"
C'est un pointeur vers le salarycolonne. Si la colonne est modifiée, les modifications sont stockées à l'aide d'une valeur d'index.
Supprimer un index
La syntaxe suivante est utilisée pour supprimer un index -
DROP INDEX <index_name> ON <table_name>
La requête suivante supprime l'index index_salary -
./hcat –e "DROP INDEX index_salary ON employee;"
HCatalog contient une API de transfert de données pour l'entrée et la sortie parallèles sans utiliser MapReduce. Cette API utilise une abstraction de stockage de base de tables et de lignes pour lire les données du cluster Hadoop et y écrire des données.
L'API de transfert de données contient principalement trois classes; ce sont -
HCatReader - Lit les données d'un cluster Hadoop.
HCatWriter - Écrit des données dans un cluster Hadoop.
DataTransferFactory - Génère des instances de lecteur et d'écrivain.
Cette API convient à la configuration du nœud maître-esclave. Laissez-nous discuter plus surHCatReader et HCatWriter.
HCatReader
HCatReader est une classe abstraite interne à HCatalog et résume les complexités du système sous-jacent d'où les enregistrements doivent être récupérés.
S. Non. | Nom et description de la méthode |
---|---|
1 | Public abstract ReaderContext prepareRead() throws HCatException Cela doit être appelé au nœud maître pour obtenir ReaderContext qui doit ensuite être sérialisé et envoyé aux nœuds esclaves. |
2 | Public abstract Iterator <HCatRecorder> read() throws HCaException Cela doit être appelé aux nœuds esclaves pour lire HCatRecords. |
3 | Public Configuration getConf() Il renverra l'objet de classe de configuration. |
La classe HCatReader est utilisée pour lire les données de HDFS. La lecture est un processus en deux étapes dans lequel la première étape se produit sur le nœud maître d'un système externe. La deuxième étape est réalisée en parallèle sur plusieurs nœuds esclaves.
Les lectures sont effectuées sur un ReadEntity. Avant de commencer à lire, vous devez définir un ReadEntity à partir duquel lire. Cela peut être fait parReadEntity.Builder. Vous pouvez spécifier un nom de base de données, un nom de table, une partition et une chaîne de filtre. Par exemple -
ReadEntity.Builder builder = new ReadEntity.Builder();
ReadEntity entity = builder.withDatabase("mydb").withTable("mytbl").build(); 10.
L'extrait de code ci-dessus définit un objet ReadEntity («entité»), comprenant une table nommée mytbl dans une base de données nommée mydb, qui peut être utilisé pour lire toutes les lignes de ce tableau. Notez que ce tableau doit exister dans HCatalog avant le début de cette opération.
Après avoir défini un ReadEntity, vous obtenez une instance de HCatReader à l'aide de ReadEntity et de la configuration du cluster -
HCatReader reader = DataTransferFactory.getHCatReader(entity, config);
L'étape suivante consiste à obtenir un ReaderContext du lecteur comme suit -
ReaderContext cntxt = reader.prepareRead();
HCatWriter
Cette abstraction est interne à HCatalog. Ceci permet de faciliter l'écriture dans HCatalog à partir de systèmes externes. N'essayez pas de l'instancier directement. Au lieu de cela, utilisez DataTransferFactory.
Sr.No. | Nom et description de la méthode |
---|---|
1 | Public abstract WriterContext prepareRead() throws HCatException Le système externe doit invoquer cette méthode exactement une fois à partir d'un nœud maître. Il renvoie unWriterContext. Cela doit être sérialisé et envoyé aux nœuds esclaves pour construireHCatWriter Là. |
2 | Public abstract void write(Iterator<HCatRecord> recordItr) throws HCaException Cette méthode doit être utilisée sur les nœuds esclaves pour effectuer des écritures. RecordItr est un objet itérateur qui contient la collection d'enregistrements à écrire dans HCatalog. |
3 | Public abstract void abort(WriterContext cntxt) throws HCatException Cette méthode doit être appelée au niveau du nœud maître. L'objectif principal de cette méthode est d'effectuer des nettoyages en cas d'échec. |
4 | public abstract void commit(WriterContext cntxt) throws HCatException Cette méthode doit être appelée au niveau du nœud maître. Le but de cette méthode est de valider les métadonnées. |
Semblable à la lecture, l'écriture est également un processus en deux étapes dans lequel la première étape se produit sur le nœud maître. Par la suite, la deuxième étape se déroule en parallèle sur les nœuds esclaves.
Les écritures sont effectuées sur un WriteEntity qui peut être construit d'une manière similaire aux lectures -
WriteEntity.Builder builder = new WriteEntity.Builder();
WriteEntity entity = builder.withDatabase("mydb").withTable("mytbl").build();
Le code ci-dessus crée un objet WriteEntity entity
qui peut être utilisé pour écrire dans une table nomméemytbl dans la base de données mydb.
Après avoir créé un WriteEntity, l'étape suivante consiste à obtenir un WriterContext -
HCatWriter writer = DataTransferFactory.getHCatWriter(entity, config);
WriterContext info = writer.prepareWrite();
Toutes les étapes ci-dessus se produisent sur le nœud maître. Le nœud maître sérialise ensuite l'objet WriterContext et le met à disposition de tous les esclaves.
Sur les nœuds esclaves, vous devez obtenir un HCatWriter en utilisant WriterContext comme suit -
HCatWriter writer = DataTransferFactory.getHCatWriter(context);
Puis le writerprend un itérateur comme argument de la write
méthode -
writer.write(hCatRecordItr);
le writer puis appelle getNext() sur cet itérateur dans une boucle et écrit tous les enregistrements attachés à l'itérateur.
le TestReaderWriter.javaLe fichier est utilisé pour tester les classes HCatreader et HCatWriter. Le programme suivant montre comment utiliser HCatReader et l'API HCatWriter pour lire des données à partir d'un fichier source et ensuite les écrire dans un fichier de destination.
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();
}
}
}
Le programme ci-dessus lit les données du HDFS sous forme d'enregistrements et écrit les données d'enregistrement dans mytable
le HCatInputFormat et HCatOutputFormatLes interfaces sont utilisées pour lire les données de HDFS et après le traitement, écrire les données résultantes dans HDFS à l'aide de la tâche MapReduce. Développons les interfaces de format d'entrée et de sortie.
HCatInputFormat
le HCatInputFormatest utilisé avec les travaux MapReduce pour lire les données des tables gérées par HCatalog. HCatInputFormat expose une API MapReduce Hadoop 0.20 pour lire des données comme si elles avaient été publiées dans une table.
Sr.No. | Nom et description de la méthode |
---|---|
1 | public static HCatInputFormat setInput(Job job, String dbName, String tableName)throws IOException Définissez les entrées à utiliser pour le travail. Il interroge le métastore avec la spécification d'entrée donnée et sérialise les partitions correspondantes dans la configuration du travail pour les tâches MapReduce. |
2 | public static HCatInputFormat setInput(Configuration conf, String dbName, String tableName) throws IOException Définissez les entrées à utiliser pour le travail. Il interroge le métastore avec la spécification d'entrée donnée et sérialise les partitions correspondantes dans la configuration du travail pour les tâches MapReduce. |
3 | public HCatInputFormat setFilter(String filter)throws IOException Définissez un filtre sur la table d'entrée. |
4 | public HCatInputFormat setProperties(Properties properties) throws IOException Définissez les propriétés du format d'entrée. |
L'API HCatInputFormat comprend les méthodes suivantes -
- setInput
- setOutputSchema
- getTableSchema
Utiliser HCatInputFormat pour lire des données, instanciez d'abord un InputJobInfo avec les informations nécessaires de la table en cours de lecture, puis appelez setInput avec le InputJobInfo.
Vous pouvez utiliser le setOutputSchema méthode pour inclure un projection schema, pour spécifier les champs de sortie. Si aucun schéma n'est spécifié, toutes les colonnes de la table seront renvoyées. Vous pouvez utiliser la méthode getTableSchema pour déterminer le schéma de table pour une table d'entrée spécifiée.
HCatOutputFormat
HCatOutputFormat est utilisé avec les travaux MapReduce pour écrire des données dans des tables gérées par HCatalog. HCatOutputFormat expose une API MapReduce Hadoop 0.20 pour écrire des données dans une table. Lorsqu'un travail MapReduce utilise HCatOutputFormat pour écrire la sortie, le OutputFormat par défaut configuré pour la table est utilisé et la nouvelle partition est publiée dans la table une fois le travail terminé.
Sr.No. | Nom et description de la méthode |
---|---|
1 | public static void setOutput (Configuration conf, Credentials credentials, OutputJobInfo outputJobInfo) throws IOException Définissez les informations sur la sortie à écrire pour le travail. Il interroge le serveur de métadonnées pour trouver le StorageHandler à utiliser pour la table. Il génère une erreur si la partition est déjà publiée. |
2 | public static void setSchema (Configuration conf, HCatSchema schema) throws IOException Définissez le schéma des données écrites sur la partition. Le schéma de table est utilisé par défaut pour la partition s'il n'est pas appelé. |
3 | public RecordWriter <WritableComparable<?>, HCatRecord > getRecordWriter (TaskAttemptContext context)throws IOException, InterruptedException Obtenez le rédacteur de disques pour le travail. Il utilise le OutputFormat par défaut de StorageHandler pour obtenir l'enregistreur d'enregistrement. |
4 | public OutputCommitter getOutputCommitter (TaskAttemptContext context) throws IOException, InterruptedException Obtenez le committer de sortie pour ce format de sortie. Il garantit que la sortie est validée correctement. |
le HCatOutputFormat L'API comprend les méthodes suivantes -
- setOutput
- setSchema
- getTableSchema
Le premier appel sur HCatOutputFormat doit être setOutput; tout autre appel lèvera une exception indiquant que le format de sortie n'est pas initialisé.
Le schéma des données en cours d'écriture est spécifié par le setSchemaméthode. Vous devez appeler cette méthode en fournissant le schéma des données que vous écrivez. Si vos données ont le même schéma que le schéma de table, vous pouvez utiliserHCatOutputFormat.getTableSchema() pour obtenir le schéma de table, puis le transmettre à setSchema().
Exemple
Le programme MapReduce suivant lit les données d'une table qu'il suppose avoir un entier dans la deuxième colonne ("colonne 1") et compte le nombre d'instances de chaque valeur distincte qu'il trouve. Autrement dit, il fait l'équivalent de "select col1, count(*) from $table group by col1;".
Par exemple, si les valeurs de la deuxième colonne sont {1, 1, 1, 3, 3, 5}, le programme produira la sortie suivante de valeurs et de décomptes -
1, 3
3, 2
5, 1
Regardons maintenant le code du programme -
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);
}
}
Avant de compiler le programme ci-dessus, vous devez télécharger quelques jars et ajoutez-les au classpathpour cette application. Vous devez télécharger tous les bocaux Hive et HCatalog (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).
Utilisez les commandes suivantes pour les copier jar fichiers de local à HDFS et ajoutez-les au 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
Utilisez la commande suivante pour compiler et exécuter le programme donné.
$HADOOP_HOME/bin/hadoop jar GroupByAge tmp/hive
Maintenant, vérifiez votre répertoire de sortie (hdfs: user / tmp / hive) pour la sortie (part_0000, part_0001).
le HCatLoader et HCatStorerLes API sont utilisées avec les scripts Pig pour lire et écrire des données dans les tables gérées par HCatalog. Aucune configuration spécifique à HCatalog n'est requise pour ces interfaces.
Il est préférable d'avoir des connaissances sur les scripts Apache Pig pour mieux comprendre ce chapitre. Pour plus d'informations, veuillez consulter notre tutoriel Apache Pig .
HCatloader
HCatLoader est utilisé avec les scripts Pig pour lire les données des tables gérées par HCatalog. Utilisez la syntaxe suivante pour charger des données dans HDFS à l'aide de HCatloader.
A = LOAD 'tablename' USING org.apache.HCatalog.pig.HCatLoader();
Vous devez spécifier le nom de la table entre guillemets simples: LOAD 'tablename'. Si vous utilisez une base de données autre que celle par défaut, vous devez spécifier votre entrée comme 'dbname.tablename'.
Le métastore Hive vous permet de créer des tables sans spécifier de base de données. Si vous avez créé des tables de cette façon, le nom de la base de données est'default' et n'est pas nécessaire lors de la spécification de la table pour HCatLoader.
Le tableau suivant contient les méthodes importantes et la description de la classe HCatloader.
Sr.No. | Nom et description de la méthode |
---|---|
1 | public InputFormat<?,?> getInputFormat()throws IOException Lisez le format d'entrée des données de chargement à l'aide de la classe HCatloader. |
2 | public String relativeToAbsolutePath(String location, Path curDir) throws IOException Il renvoie le format String du Absolute path. |
3 | public void setLocation(String location, Job job) throws IOException Il définit l'emplacement où le travail peut être exécuté. |
4 | public Tuple getNext() throws IOException Renvoie le tuple actuel (key et value) de la boucle. |
HCatStorer
HCatStorer est utilisé avec les scripts Pig pour écrire des données dans des tables gérées par HCatalog. Utilisez la syntaxe suivante pour l'opération de stockage.
A = LOAD ...
B = FOREACH A ...
...
...
my_processed_data = ...
STORE my_processed_data INTO 'tablename' USING org.apache.HCatalog.pig.HCatStorer();
Vous devez spécifier le nom de la table entre guillemets simples: LOAD 'tablename'. La base de données et la table doivent être créées avant d'exécuter votre script Pig. Si vous utilisez une base de données autre que celle par défaut, vous devez spécifier votre entrée comme'dbname.tablename'.
Le métastore Hive vous permet de créer des tables sans spécifier de base de données. Si vous avez créé des tables de cette façon, le nom de la base de données est'default' et vous n'avez pas besoin de spécifier le nom de la base de données dans le store déclaration.
Pour le USINGclause, vous pouvez avoir un argument de chaîne qui représente des paires clé / valeur pour les partitions. Il s'agit d'un argument obligatoire lorsque vous écrivez dans une table partitionnée et que la colonne de partition n'est pas dans la colonne de sortie. Les valeurs des clés de partition ne doivent PAS être entre guillemets.
Le tableau suivant contient les méthodes importantes et la description de la classe HCatStorer.
Sr.No. | Nom et description de la méthode |
---|---|
1 | public OutputFormat getOutputFormat() throws IOException Lisez le format de sortie des données stockées à l'aide de la classe HCatStorer. |
2 | public void setStoreLocation (String location, Job job) throws IOException Définit l'emplacement où exécuter ceci store application. |
3 | public void storeSchema (ResourceSchema schema, String arg1, Job job) throws IOException Stockez le schéma. |
4 | public void prepareToWrite (RecordWriter writer) throws IOException Cela aide à écrire des données dans un fichier particulier à l'aide de RecordWriter. |
5 | public void putNext (Tuple tuple) throws IOException Écrit les données du tuple dans le fichier. |
Running Pig avec HCatalog
Pig ne récupère pas automatiquement les bocaux HCatalog. Pour importer les fichiers JAR nécessaires, vous pouvez soit utiliser un indicateur dans la commande Pig, soit définir les variables d'environnementPIG_CLASSPATH et PIG_OPTS comme décrit ci-dessous.
Pour apporter les pots appropriés pour travailler avec HCatalog, ajoutez simplement le drapeau suivant -
pig –useHCatalog <Sample pig scripts file>
Définition du CLASSPATH pour l'exécution
Utilisez le paramètre CLASSPATH suivant pour synchroniser le HCatalog avec 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
Exemple
Supposons que nous ayons un fichier student_details.txt en HDFS avec le contenu suivant.
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
Nous avons également un exemple de script avec le nom sample_script.pig, dans le même répertoire HDFS. Ce fichier contient des instructions effectuant des opérations et des transformations sur lestudent relation, comme indiqué ci-dessous.
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;
La première instruction du script chargera les données dans le fichier nommé student_details.txt comme une relation nommée student.
La deuxième instruction du script organisera les tuples de la relation dans l'ordre décroissant, en fonction de l'âge, et le stockera comme student_order.
La troisième instruction stocke les données traitées student_order résulte en une table distincte nommée student_order_table.
La quatrième instruction du script stockera les quatre premiers tuples de student_order comme student_limit.
Enfin, la cinquième instruction videra le contenu de la relation student_limit.
Exécutons maintenant le sample_script.pig comme indiqué ci-dessous.
$./pig -useHCatalog hdfs://localhost:9000/pig_data/sample_script.pig
Maintenant, vérifiez votre répertoire de sortie (hdfs: user / tmp / hive) pour la sortie (part_0000, part_0001).