En este proyecto he demostrado la integración entre Hadoop y ElasticSearch, creando una conexión funcional entre Hive y un índice de ElasticSearch. La combinación de estas tecnologías me permitió aprovechar lo mejor de ambos mundos: el procesamiento masivo de datos de Hadoop y las capacidades de búsqueda y análisis en tiempo real de ElasticSearch.
Requisitos Técnicos y Software Utilizado
Google Cloud Platform (GCP)
- Dataproc versión 2.1
- Hadoop 3.3.4
- Máquina virtual: e2-standard-4 (4 vCPUs, 16 GB memoria)
- Sistema operativo: Debian 11
Stack ELK
- ElasticSearch 8.14.1
- Logstash 8.14.1
- Kibana 8.14.1
Hadoop Ecosystem
- Hive 3.1.3
Librerías y Conectores
- ES-Hadoop 8.14.1
- Commons-httpclient 3.1
Herramientas para Documentación
- Claude Sonnet 3.7 - Utilizado para generar documentación detallada del proceso, problemas encontrados y soluciones
Mi arquitectura combina:
- Un clúster Hadoop en Google Cloud Dataproc
- Un servidor ElasticSearch (ELK stack) con Kibana y Logstash
- Conectores ES-Hadoop para la integración entre ambos sistemas
- Creé un clúster Hadoop en Google Cloud Dataproc
- Cargué las bibliotecas necesarias para la integración:
- elasticsearch-hadoop-8.14.1.jar
- commons-httpclient-3.1.jar
- Creé un bucket en Google Storage para almacenar estos archivos JAR
- Descargué los archivos desde el bucket al sistema de archivos del clúster
gsutil cp gs://bucket-para-elastic/jars/elastic/elasticsearch-hadoop-8.14.1.jar .
gsutil cp gs://bucket-para-elastic/jars/elastic/commons-httpclient-3.1.jar .
*Fig. 1: Acá creamos el bucket
*Fig. 2: Archivos cargados
*Fig. 3: captura de pantalla de las instancias de VM en Google Cloud Console.
- Creé una máquina virtual para ElasticSearch en Google Cloud
- Instalé y configuré ElasticSearch, desactivando las funciones de seguridad para esta prueba
- Abrí los puertos de firewall necesarios:
- Puerto 9200 para ElasticSearch
- Puerto 5601 para Kibana
- Verifiqué la conectividad entre el clúster Hadoop y el servidor ElasticSearch
Fig. 4: Configuración del archivo elasticsearch.yml con seguridad deshabilitada para permitir conexiones desde Hadoop
Como se puede observar en la configuración, establecí los siguientes parámetros clave:
xpack.security.enabled: false- Desactivé la seguridad para esta prueba de conceptonetwork.host: 0.0.0.0- Configuré el servidor para aceptar conexiones desde cualquier dirección IPhttp.port: 9200- Mantuve el puerto estándar de ElasticSearchdiscovery.type: single-node- Configuré un único nodo para simplificar la implementación
Modifiqué la configuración de Hive para establecer la conexión con ElasticSearch:
sudo sed -i '$d' /etc/hive/conf.dist/hive-site.xml
sudo sed -i '$a \ <property>\n <n>es.nodes</n>\n <value>IP_ELASTIC_SERVER</value>\n </property>' /etc/hive/conf.dist/hive-site.xml
sudo sed -i '$a \ <property>\n <n>es.port</n>\n <value>9200</value>\n </property>' /etc/hive/conf.dist/hive-site.xml
sudo sed -i '$a \ <property>\n <n>es.nodes.wan.only</n>\n <value>true</value>\n </property>' /etc/hive/conf.dist/hive-site.xml
sudo sed -i '$a \ <property>\n <n>hive.aux.jars.path</n>\n <value>/usr/lib/hive/lib/elasticsearch-hadoop-8.14.1.jar,/usr/lib/hive/lib/commons-httpclient-3.1.jar</value>\n </property>' /etc/hive/conf.dist/hive-site.xml
sudo cp elasticsearch-hadoop-8.14.1.jar /usr/lib/hive/lib/
sudo cp commons-httpclient-3.1.jar /usr/lib/hive/lib/Estos comandos me permitieron:
- Eliminar la última línea del archivo de configuración de Hive
- Agregar propiedades de configuración para la conexión con ElasticSearch
- Copiar los JAR necesarios al directorio de bibliotecas de Hive
Finalmente, reinicié Hive para aplicar los cambios.
- Creé un índice en ElasticSearch desde el servidor:
curl -X POST "localhost:9200/alumnos/_doc/6" -H 'Content-Type: application/json' -d'
{
"title": "New Document",
"content": "This is a new document for the master class",
"tag": ["general", "testing"]
}
'- Agregué documentos al índice desde el clúster Hadoop:
curl -X POST "IP-SERVER-ELASTICSEARCH:9200/_bulk" -H 'Content-Type: application/json' -d'
{ "index": { "_index": "alumnos", "_id": "3" } }
{ "id": 3, "name": "Carlos", "last_name": "González" }
{ "index": { "_index": "alumnos", "_id": "4" } }
{ "id": 4, "name": "María", "last_name": "López" }
{ "index": { "_index": "alumnos", "_id": "5" } }
{ "id": 5, "name": "Luis", "last_name": "Martínez" }
{ "index": { "_index": "alumnos", "_id": "7" } }
{ "id": 7, "name": "Sofía", "last_name": "Ramírez" }
{ "index": { "_index": "alumnos", "_id": "8" } }
{ "id": 8, "name": "Pedro", "last_name": "Hernández" }
'- Verifiqué la inserción de datos con una consulta:
curl -X GET "http://IP-SERVER-ELASTIC:9200/alumnos/_search?pretty"- Accedí a Kibana a través del navegador:
http://IP_ELASTIC_SERVER:5601 - Creé una vista de datos (Data View) para el índice "alumnos"
- Creé un dashboard con visualizaciones de los datos
- Exploré las diferentes opciones de visualización que ofrece Kibana
Durante la implementación de este proyecto, me encontré con varios desafíos técnicos:
Problema: Mi clúster Hadoop no podía conectarse al servidor ElasticSearch.
Solución:
- Verifiqué que las reglas de firewall estuvieran correctamente configuradas para permitir el tráfico al puerto 9200.
- Configuré ElasticSearch en modo inseguro (
xpack.security.enabled: false) para propósitos de prueba. - Agregué la propiedad
es.nodes.wan.only=trueen la configuración de Hive para permitir conexiones desde fuera de la red local.
Problema: Hive no podía encontrar las bibliotecas de ElasticSearch-Hadoop.
Solución:
- Verifiqué la ruta correcta donde debían colocarse los archivos JAR (
/usr/lib/hive/lib/). - Me aseguré de cargar el JAR correcto del paquete ElasticSearch-Hadoop (el que se encuentra en la carpeta
distdel archivo ZIP). - Reinicié el servicio Hive después de cargar los JAR.
Problema: Los comandos sed para modificar el archivo de configuración hive-site.xml no funcionaban correctamente.
Solución:
- Edité manualmente el archivo para asegurarme de que la sintaxis XML fuera correcta.
- Verifiqué que no hubiera caracteres especiales o espacios que pudieran afectar la interpretación de los comandos.
- Comprobé que el archivo terminara correctamente con la etiqueta
</configuration>.
Problema: Tuve incompatibilidad entre versiones de ElasticSearch y el conector ES-Hadoop.
Solución:
- Me aseguré de que la versión de ElasticSearch (8.14.1) coincidiera con la versión del conector ES-Hadoop.
- Utilicé la biblioteca commons-httpclient adecuada para evitar problemas de compatibilidad.
Problema: Los datos no aparecían en ElasticSearch después de intentar indexarlos.
Solución:
- Verifiqué la sintaxis correcta de los comandos curl para la inserción de datos.
- Comprobé que el índice "alumnos" estuviera correctamente creado antes de intentar insertar documentos.
- Utilicé el parámetro "pretty" en las consultas para facilitar la lectura de resultados y depuración.
Problema: Kibana no mostraba el índice "alumnos" en la lista de índices disponibles.
Solución:
- Refresqué manualmente la lista de índices en Kibana.
- Creé una vista de datos (Data View) escribiendo manualmente el patrón del índice.
- Verifiqué que Kibana estuviera utilizando la configuración correcta para conectarse a ElasticSearch.
Enfrentar y superar estos desafíos me permitió ganar experiencia valiosa en la configuración y optimización de estos sistemas de Big Data.
La integración de Hadoop con ElasticSearch me proporcionó una solución poderosa para el procesamiento, análisis y visualización de grandes volúmenes de datos. Con esta configuración pude:
- Procesar datos masivos con Hadoop
- Indexar y buscar eficientemente con ElasticSearch
- Visualizar los resultados de manera interactiva con Kibana
Esta combinación resultó ideal para casos de uso como análisis de logs, búsqueda de texto completo en grandes repositorios de documentos, análisis de datos en tiempo real y muchas otras aplicaciones de Big Data.