unitarias pruebas prueba las integrales integración integracion hacer función ejemplos cuál como clases automatizadas java testing hadoop mapreduce hive

java - las - Pruebas de integración Hive jobs



pruebas integrales ejemplos (6)

Hive admite el modo integrado solo en el sentido de que el RDBMS que almacena la metainformación para las tablas Hive puede ejecutarse localmente o en un servidor independiente (consulte https://cwiki.apache.org/confluence/display/Hive/HiveClient para obtener más información). ) Además, la colmena con su base de datos adjunta es simplemente un orquestador de una serie de trabajos de MapReduce, que también requiere que el marco de Hadoop se ejecute.

Recomiendo usar esta máquina virtual que tiene una pila Hadoop preconfigurada http://hortonworks.com/products/hortonworks-sandbox/ . Hortonworks es uno de los 2 principales proveedores de distribución de Hadoop, por lo que cuenta con un buen soporte.

Intento escribir un trabajo Hive no trivial utilizando las interfaces Hive Thrift y JDBC, y tengo problemas para configurar una prueba JUnit decente. Por no trivial, me refiero a que el trabajo resulta en al menos una etapa de MapReduce, en lugar de solo tratar con la metastore.

La prueba debería 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 según la referencia de Spring . 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 "/ usr / bin / hadoop" (en el directorio "/ Users / yoni / opower / workspace / intellij_project_root"): error = 2, No hay tal archivo o directorio

El problema es que Hive Server se ejecuta en memoria, pero depende de la instalación local de Hive para poder ejecutarlo. Para que mi proyecto sea autónomo, necesito que los servicios de Hive se integren, incluidos los clústeres HDFS y MapReduce. Intenté poner en marcha un servidor Hive utilizando el mismo método Spring y apuntando a MiniDFSCluster y MiniMRCluster , similar al patrón utilizado en la fuente Hive QTestUtil y en HBaseTestUtility . Sin embargo, no he podido hacer que eso funcione.

Después de tres días de intentar discutir las pruebas de integración de Hive, pensé en preguntarle a la comunidad:

  1. ¿Cómo recomiendas los trabajos de Hive en la prueba de integración?
  2. ¿Tiene un ejemplo de JUnit en funcionamiento para realizar pruebas de integración en trabajos de Colmena utilizando instancias de HDFS, MR y Hive en memoria?

Recursos adicionales que he visto:

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


Implementé HiveRunner.

HiveRunner

Lo probamos en Mac y tuvimos algunos problemas con Windows, sin embargo, con algunos cambios que se detallan a continuación, la utilidad fue muy útil.

Para las ventanas aquí se muestran algunos de los cambios que se realizaron para que HiveRunner funcione en el entorno de Windows. Después de estos cambios, es posible realizar pruebas unitarias para todas las consultas de Hive.

1.Clone el proyecto en https://github.com/steveloughran/winutils a cualquier lugar de su computadora, agregue una nueva variable de entorno, HADOOP_HOME, señalando el directorio / bin de esa carpeta. sin barras diagonales ni espacios permitidos. 2.Clone el proyecto en https://github.com/sakserv/hadoop-mini-clusters a cualquier parte de su computadora. Agregue una nueva variable de entorno HADOOP_WINDOWS_LIBS, apuntando al directorio / lib de esa carpeta. Nuevamente, no se permiten barras diagonales ni espacios. 3. También instalé cygwin, suponiendo que los servidores de severla win para Linux estén disponibles.

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


No estoy seguro de qué ha cambiado desde la respuesta aceptada en febrero de 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 (por lo general, la fase de generación de hashtable mapjoin) se ejecuta en JVM por separado (verdadero recomendado) o no. Evita la sobrecarga de generar nueva JVM, pero puede provocar problemas de falta de memoria.

Esto funciona alrededor del problema 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 executeInChildVM() al método executeInChildVM() , que literalmente llama a hadoop jar . La otra ruta de código hasta ahora ha funcionado en mi prueba. Posibles problemas de memoria pueden resolverse ajustando las configuraciones de pila de Java (Xmx, Xms, etc.).



Vengo a encontrar una herramienta bastante buena: HiveRunner . Es un marco además de jUnit para probar los scripts de la colmena. Debajo del capó se inicia un HiveServer autónomo con memoria HSQL como metastore.


Idealmente, uno podría probar las consultas de la colmena con LocalJobRunner lugar de recurrir a pruebas de mini-cluster. Sin embargo, debido a que HIVE-3816 ejecuta una colmena con mapred.job.tracker=local resultados mapred.job.tracker=local en una llamada al ejecutable CLI de colmena instalado en el sistema (como se describe en su pregunta).

Hasta que HIVE-3816 se resuelva, las pruebas de mini-cluster son la única opción. A continuación se muestra una configuración mínima de mini-clúster para pruebas de colmenas 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 es necesario ejecutar un proceso separado de hiveserver o hiveserver2 para realizar pruebas. Puede probar con un proceso incorporado de hiveserver2 configurando su URL de conexión jdbc:hive2:/// a jdbc:hive2:///