Integration testing Hive jobs


Estoy tratando de escribir un trabajo de Colmena no trivial usando las interfaces Hive Thrift y JDBC, y estoy teniendo problemas para configurar una prueba de JUnit decente. Por no trivial, quiero decir que el trabajo resulta en al menos una etapa de MapReduce, en lugar de solo tratar con el metástore.

La prueba debe iniciar un servidor Hive, cargar algunos datos en una tabla, ejecutar alguna consulta no trivial en esa tabla y verificar los resultados.

He conectado un contexto de primavera de acuerdo con el Primavera referencia. Sin embargo, el trabajo falla en la fase MapReduce, quejándose de que no existe ningún binario Hadoop:

Java.io.IOException: No se puede ejecutar el programa de "/usr/bin/hadoop" (en directorio " / Users / yoni / opower / workspace /intellij_project_root"): error = 2, No hay tal archivo o directorio

El problema es que el servidor Hive se está ejecutando en memoria, pero depende de la instalación local de Hive para poder ejecutarse. Para que mi proyecto sea autónomo, necesito que los servicios de Hive sean incrustado, incluidos los clústeres HDFS y MapReduce. He intentado iniciar un servidor Hive usando el mismo método Spring y apuntándolo a MiniDFSCluster y MiniMRCluster , similar al patrón utilizado en la fuente Hive QTestUtil y en HBaseTestUtility . Sin embargo, no he sido capaz de conseguir que funcione.

Después de tres días de tratar de manejar las pruebas de integración de Hive, pensé que le preguntaría a la comunidad:

  1. ¿Cómo se recomienda I integration test Hive jobs?
  2. ¿Tiene un ejemplo de JUnit que funcione para probar trabajos de integración de Hive usando HDFS en memoria, MR e instancias de Hive?

Recursos adicionales que he visto:

Editar: Soy plenamente consciente de que trabajar contra un clúster de Hadoop, ya sea local o remoto, permite ejecutar pruebas de integración contra una colmena de pila completa instancia. El problema, como se ha dicho, es que esta no es una solución viable para probar eficazmente los flujos de trabajo de Hive.

Author: Keshav Pradeep Ramanath, 2013-05-23

6 answers

Idealmente uno sería capaz de probar consultas hive con LocalJobRunner en lugar de recurrir a pruebas de mini-clúster. Sin embargo, debido a que HIVE-3816 ejecutar hive con mapred.job.tracker=local resulta en una llamada al ejecutable CLI de hive instalado en el sistema (como se describe en su pregunta).

Hasta que se resuelva HIVE-3816, la prueba de mini-clúster es la única opción. A continuación se muestra una configuración mínima de mini-cluster para pruebas de colmena que he probado contra 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"));

No hay necesidad de ejecutar un proceso hiveserver o hiveserver2 para pruebas. Puede probar con un proceso hiveserver2 incrustado configurando su URL de conexión jdbc en jdbc:hive2:///

 12
Author: oby1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-16 21:48:23

He encontrado una herramienta bastante buena: HiveRunner. Es framework en la parte superior de JUnit para probar scripts de hive. Bajo el capó se inicia un HiveServer independiente con HSQL en memoria como el metástore.

 5
Author: Luís Bianchin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 19:31:53

Hive soporta el modo embebido solo en el sentido de que el RDBMS que almacena la meta información para las tablas Hive puede ejecutarse localmente o en un servidor independiente (ver https://cwiki.apache.org/confluence/display/Hive/HiveClient para más detalles). Además, hive con su base de datos acompañante es simplemente un orquestador para una cadena de trabajos de MapReduce, lo que requiere que el marco de Hadoop también se ejecute.

Recomiendo el uso de esta máquina virtual que tiene un Pila Hadoop http://hortonworks.com/products/hortonworks-sandbox / . Hortonworks es uno de los 2 principales proveedores de distribución de Hadoop, por lo que está bien soportado.

 1
Author: Dmitriusan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-01 22:16:16

No estoy seguro de lo que ha cambiado desde la respuesta aceptada en febrero. 2014, pero a partir de Hive 1.2.0, lo siguiente funciona en torno al problema descrito por OP:

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

Tenga en cuenta la advertencia dada en la documentación de configuración:

Determina si las tareas locales (típicamente mapjoin hashtable generation phase) se ejecuta en JVM independiente (true recomendado) o no. Evita el sobrecarga de generar nueva JVM, pero puede conducir a problemas de falta de memoria.

Esto funciona en torno al tema porque en 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);
    }
  }

El valor de configuración predeterminado hace que se llame al método executeInChildVM(), que literalmente llama a hadoop jar. La otra ruta de código ha funcionado hasta ahora en mis pruebas. Es probable que los posibles problemas de memoria se resuelvan ajustando las configuraciones de montón de Java (Xmx, Xms, etc.).

 1
Author: Andrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-18 18:49:50

He implementado HiveRunner.

Https://github.com/klarna/HiveRunner

Lo probamos en Mac y tuvimos algunos problemas con Windows, sin embargo, con algunos cambios enumerados a continuación, el util sirvió bien.

Para windows estos son algunos de los cambios que se hicieron para que HiveRunner funcione en el entorno windows. Después de estos cambios, es posible realizar pruebas unitarias para todas las consultas de Hive.

1.Clonar el proyecto en https://github.com/steveloughran/winutils a cualquier lugar de su computadora, Agregue una nueva variable de entorno, HADOOP_HOME, apuntando al directorio /bin de esa carpeta. no se permiten barras ni espacios. 2.Clonar el proyecto en https://github.com/sakserv/hadoop-mini-clusters a cualquier lugar de su computadora. Agregue una nueva variable de entorno HADOOP_WINDOWS_LIBS, apuntando al directorio / lib de esa carpeta. Una vez más, no se permiten barras o espacios hacia adelante. 3.También instalé cygwin, suponiendo que severla win utils para linux podría estar disponible a través de.

Este tirón en gitbub ayudó a hacer que funcione en Windows, https://github.com/klarna/HiveRunner/pull/63

 1
Author: Prachi Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-23 18:46:56

Otro Hive JUnit runner está en https://github.com/edwardcapriolo/hive_test

 0
Author: gliptak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-05 20:00:51