[Java] Pruebas de integración Hive jobs


Answers

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.

Question

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 de 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 existe dicho 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.




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.).