tutorial que pig instalar instalacion español data hive hdfs hiveql

hive - pig - Cómo hacer una tabla que se actualiza automáticamente Colmena



que es hive en español (2)

Creé una tabla externa que en Hive usa datos de una tienda Parquet en HDFS.

Cuando se eliminan los datos en HDFS, no hay datos en la tabla. Cuando los datos se insertan nuevamente en el mismo lugar en HDFS, la tabla no se actualiza para contener los datos nuevos. Si inserto nuevos registros en la tabla existente que contiene datos, no se muestran nuevos datos cuando ejecuto mis consultas Hive.

Cómo creo la tabla en Hive:

CREATE EXTERNAL TABLE nodes (id string) STORED AS PARQUET LOCATION "/hdfs/nodes";

El error relevante:

Error: java.io.FileNotFoundException: File does not exist: /hdfs/nodes/part-r-00038-2149d17d-f890-48bc-a9dd-5ea07b0ec590.gz.parquet

He visto varias publicaciones que explican que las tablas externas deben tener los datos más actualizados en ellas, como aquí . Sin embargo, este no es el caso para mí, y no sé lo que está sucediendo.

Inserté los mismos datos en la base de datos de nuevo y consulté la tabla. Contenía la misma cantidad de datos que antes. Luego creé una tabla idéntica con un nombre diferente. Tenía el doble de datos, que era la cantidad correcta.

El problema podría ser con la base de datos metastore. Estoy usando PostgreSQL en lugar de Derby para la base de datos.

Informacion relevante:

  • Colmena 0.13.0
  • Spark Streaming 1.4.1
  • PostgreSQL 9.3
  • CentOS 7

EDITAR: Después de examinar los archivos de Parquet, descubrí que los archivos de parte tienen nombres de archivo aparentemente incompatibles. -rw-r--r-- 3 hdfs hdfs 18702811 2015-08-27 08:22 /hdfs/nodes/part-r-00000-1670f7a9-9d7c-4206-84b5-e812d1d8fd9a.gz.parquet -rw-r--r-- 3 hdfs hdfs 18703029 2015-08-26 15:43 /hdfs/nodes/part-r-00000-7251c663-f76e-4903-8c5d-e0c6f61e0192.gz.parquet -rw-r--r-- 3 hdfs hdfs 18724320 2015-08-27 08:22 /hdfs/nodes/part-r-00001-1670f7a9-9d7c-4206-84b5-e812d1d8fd9a.gz.parquet -rw-r--r-- 3 hdfs hdfs 18723575 2015-08-26 15:43 /hdfs/nodes/part-r-00001-7251c663-f76e-4903-8c5d-e0c6f61e0192.gz.parquet

Estos archivos son los archivos que hacen que Hive tenga un error cuando no puede encontrarlo en el error descrito anteriormente. Esto significa que la tabla externa no actúa dinámicamente, acepta cualquier archivo en el directorio (si lo llama así en HDFS), sino que simplemente realiza un seguimiento de la lista de archivos de parquet dentro del directorio cuando se creó.

Código de muestra de Spark: nodes.foreachRDD(rdd => { if (!rdd.isEmpty()) sqlContext.createDataFrame(rdd.map( n => Row(n.stuff), ParquetStore.nodeSchema) .write.mode(SaveMode.Append).parquet(node_name) })

Donde nodeSchema es el esquema y node_name es "/ hdfs / nodes"

Vea mi otra pregunta sobre cómo obtener tablas externas Hive para detectar nuevos archivos.


Ok, entonces probablemente necesites encapsular el archivo en una carpeta. La tabla externa Hive debe estar asignada en una carpeta donde podría haber más de un archivo.

intente escribir el archivo en: / ruta / a / hdfs / nodes / archivo y luego mapee la tabla externa a / ruta / a / hdfs / nodes

entonces en los nodos de carpeta solo tendrá el archivo de parquet y debería funcionar


Para que Hive actualizara sus tablas, tuve que recurrir al uso de la función de partición de Hive. Al crear una nueva partición durante cada ejecución de Spark, creo una serie de directorios internos al directorio /hdfs/nodes como este:

/hdfs/nodes/timestamp=<a-timestamp>/<parquet-files> /hdfs/nodes/timestamp=<a-different-timestamp>/<parquet-files>

Luego, después de que se completa cada trabajo de Spark, ejecuto el comando Hive MSCK REPAIR TABLE nodes utilizando HiveContext en mi trabajo Spark, que encuentra nuevas particiones y actualiza la tabla.

Me doy cuenta de que esto no es automático, pero al menos funciona.