web-dev-qa-db-fra.com

Test d'intégration des tâches Hive

J'essaie d'écrire un travail Hive non trivial en utilisant les interfaces Hive Thrift et JDBC, et j'ai du mal à configurer un test JUnit décent. Par non trivial, je veux dire que le travail entraîne au moins une étape MapReduce, par opposition à ne traiter que le métastore.

Le test doit démarrer un serveur Hive, charger des données dans une table, exécuter une requête non triviale sur cette table et vérifier les résultats.

J'ai câblé un contexte Spring selon le référence Spring . Cependant, le travail échoue sur la phase MapReduce, se plaignant qu'aucun binaire Hadoop n'existe:

Java.io.IOException: impossible d'exécuter le programme "/ usr/bin/hadoop" (dans le répertoire "/ Users/yoni/opower/workspace/intellij_project_root"): erreur = 2, aucun fichier ou répertoire de ce type

Le problème est que le serveur Hive s'exécute en mémoire, mais dépend de l'installation locale de Hive pour fonctionner. Pour que mon projet soit autonome, j'ai besoin que les services Hive soient intégrés, y compris les clusters HDFS et MapReduce. J'ai essayé de démarrer un serveur Hive en utilisant la même méthode Spring et en le pointant sur MiniDFSCluster et MiniMRCluster , similaire au modèle utilisé dans Hive QTestUtil source et dans HBaseTestUtility . Cependant, je n'ai pas réussi à faire fonctionner cela.

Après trois jours à essayer de résoudre les tests d'intégration de Hive, j'ai pensé demander à la communauté:

  1. Comment recommandez-vous que je teste l'intégration des tâches Hive?
  2. Avez-vous un exemple fonctionnel de JUnit pour l'intégration des tests de travaux Hive à l'aide d'instances HDFS, MR et Hive en mémoire?

Ressources supplémentaires que j'ai consultées:

Edit: Je suis parfaitement conscient que travailler sur un cluster Hadoop - qu'il soit local ou distant - permet d'exécuter des tests d'intégration sur une instance Hive à pile complète. Le problème, comme indiqué, est que ce n'est pas une solution viable pour tester efficacement les flux de travail Hive.

70
yoni

Idéalement, on serait en mesure de tester les requêtes Hive avec LocalJobRunner plutôt que de recourir à des tests de mini-cluster. Cependant, en raison de Hive-3816 exécutant Hive avec mapred.job.tracker=local entraîne un appel à l'exécutable CLI Hive installé sur le système (comme décrit dans votre question).

Jusqu'à ce que Hive-3816 soit résolu, les tests de mini-cluster sont la seule option. Vous trouverez ci-dessous une configuration minimale de mini-cluster pour les tests Hive que j'ai testés contre CDH 4.4.

Configuration conf = new Configuration();

/* Build MiniDFSCluster */
MiniDFSCluster miniDFS = new MiniDFSCluster.Builder(conf).build();

/* Build MiniMR Cluster */
System.setProperty("hadoop.log.dir", "/path/to/hadoop/log/dir"); // MAPREDUCE-2785
int numTaskTrackers = 1;
int numTaskTrackerDirectories = 1;
String[] racks = null;
String[] hosts = null;
miniMR = new MiniMRCluster(numTaskTrackers, miniDFS.getFileSystem().getUri().toString(),
                           numTaskTrackerDirectories, racks, hosts, new JobConf(conf));

/* Set JobTracker URI */
System.setProperty("mapred.job.tracker", miniMR.createJobConf(new JobConf(conf)).get("mapred.job.tracker"));

Il n'est pas nécessaire d'exécuter un processus hiveserver ou hiveserver2 distinct pour les tests. Vous pouvez tester avec un processus hiveserver2 intégré en définissant l'URL de votre connexion jdbc sur jdbc:Hive2:///

12
oby1

Je viens de trouver un très bon outil: HiveRunner . C'est un framework au-dessus de jUnit pour tester les scripts Hive. Sous le capot, il démarre un HiveServer autonome avec en mémoire HSQL comme métastore.

5
Luís Bianchin

Je ne suis pas sûr de ce qui a changé depuis la réponse acceptée en février 2014, mais à partir de Hive 1.2.0, ce qui suit contourne le problème décrit par OP:

System.setProperty(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD.varname, "false");

Soyez conscient de l'avertissement donné dans la documentation de configuration:

Détermine si les tâches locales (généralement la phase de génération de table de hachage mapjoin) s'exécutent dans une machine virtuelle Java distincte (true recommandé) ou non. Évite les frais généraux liés à la création de nouvelles machines virtuelles Java, mais peut entraîner des problèmes de mémoire insuffisante.

Cela fonctionne autour du problème car dans MapredLocalTask.Java:

  @Override
  public int execute(DriverContext driverContext) {
    if (conf.getBoolVar(HiveConf.ConfVars.SUBMITLOCALTASKVIACHILD)) {
      // send task off to another jvm
      return executeInChildVM(driverContext);
    } else {
      // execute in process
      return executeInProcess(driverContext);
    }
  }

La valeur de configuration par défaut provoque l'appel de la méthode executeInChildVM(), qui appelle littéralement hadoop jar. Jusqu'à présent, l'autre chemin de code a fonctionné dans mes tests. Les problèmes de mémoire potentiels peuvent probablement être résolus en modifiant Java configurations de tas (Xmx, Xms, etc.).

1
Andrey

J'ai implémenté HiveRunner.

https://github.com/klarna/HiveRunner

Nous l'avons testé sur Mac et avons eu quelques problèmes avec Windows, mais avec quelques modifications répertoriées ci-dessous, l'utilitaire a bien fonctionné.

Pour les fenêtres, voici quelques-unes des modifications qui ont été apportées afin que HiveRunner fonctionne dans l'environnement Windows. Après ces modifications, les tests unitaires sont possibles pour toutes les requêtes Hive.

1.Clonez le projet à https://github.com/steveloughran/winutils n'importe où sur votre ordinateur, ajoutez une nouvelle variable d'environnement, HADOOP_HOME, pointant vers le répertoire/bin de ce dossier. aucune barre oblique ni espace n'est autorisé. 2.Clonez le projet sur https://github.com/sakserv/hadoop-mini-clusters vers n'importe où sur votre ordinateur. Ajoutez une nouvelle variable d'environnement HADOOP_WINDOWS_LIBS, pointant vers le répertoire/lib de ce dossier. Encore une fois, aucune barre oblique ni espace n'est autorisé. 3. J'ai également installé cygwin, en supposant que les utilitaires severla win pour linux soient disponibles via.

Cette traction sur gitbub a aidé à le faire fonctionner sur Windows, https://github.com/klarna/HiveRunner/pull/6

1
Prachi Sharma

Hive prend en charge le mode intégré uniquement dans le sens où le SGBDR qui stocke les métadonnées des tables Hive peut s'exécuter localement ou sur un serveur autonome (voir https://cwiki.Apache.org/confluence/display/Hive)/HiveClient pour plus de détails). En outre, Hive avec sa base de données qui l'accompagne n'est qu'un orchestrateur pour une chaîne de travaux MapReduce, ce qui nécessite que la structure Hadoop s'exécute également.

Je recommande d'utiliser cette machine virtuelle qui a une pile Hadoop préconfigurée http://hortonworks.com/products/hortonworks-sandbox/ . Hortonworks est l'un des 2 principaux fournisseurs de distribution Hadoop, il est donc bien pris en charge.

1
Dmitriusan

Un autre coureur Hive JUnit est à https://github.com/edwardcapriolo/Hive_test

0
gliptak