Para habilitar la compresión LZO en Hadoop, es necesario utilizar el componente open-source hadoop-lzo desarrollado por Twitter, ya que Hadoop no lo incluye de manera nativa. El proceso implica compilar hadoop-lzo con dependencias en Hadoop y LZO, seguido de configuraciones específicas en el clúster y herramientas asociadas como Hive y Flume.
Configuración de Hadoop para compresión LZO
Primero, compile el JAR de hadoop-lzo y colóquelo en el directorio de bibliotecas comunes de Hadoop. Por ejemplo, en la ruta /opt/hadoop-3.2.1/share/hadoop/common/.
[user@node1 common]$ ls
hadoop-lzo-0.4.20.jar
Sincronice el JAR a todos los nodos del clúster utilizando herramientas como rsync o scripts personalizados.
[user@node1 common]$ rsync hadoop-lzo-0.4.20.jar node2:/opt/hadoop-3.2.1/share/hadoop/common/
Modifique el archivo core-site.xml para incluir los códecs de compresión LZO. Añada los siguientes parámetros:
<configuration>
<property>
<name>io.compression.codecs</name>
<value>
org.apache.hadoop.io.compress.GzipCodec,
org.apache.hadoop.io.compress.DefaultCodec,
com.hadoop.compression.lzo.LzoCodec,
com.hadoop.compression.lzo.LzopCodec
</value>
</property>
<property>
<name>io.compression.codec.lzo.class</name>
<value>com.hadoop.compression.lzo.LzoCodec</value>
</property>
</configuration>
Sincronice la configuración actualizada a los demás nodos e inicie los servicios de HDFS y YARN.
[user@node1 hadoop]$ start-dfs.sh
[user@node1 hadoop]$ start-yarn.sh
Para archivos comprimidos con LZO, es crucial crear índices para permitir la división en fragmentos. Use la herramienta incluida en hadoop-lzo para generar índices. Ejemplo:
hadoop jar /opt/hadoop-3.2.1/share/hadoop/common/hadoop-lzo-0.4.20.jar com.hadoop.compression.lzo.DistributedLzoIndexer /data/input/compressed/
Integración de compresión LZO con Hive
Configuer Hive para utilizar compresión en salidas intermedias y finales. Edite hive-site.xml con los siguientes parámetros:
<property>
<name>hive.exec.compress.output</name>
<value>true</value>
</property>
<property>
<name>hive.exec.compress.intermediate</name>
<value>true</value>
</property>
Compatibilidad con Oozie
Para integrar Oozie, asegúrese de que los archivos de configuración de Hive y Hadoop en el clúster estén actualizados para incluir la compresión LZO. Esto garantiza que los workflows de Oozie hereden las configuraciones adecuadas.
Caso práctico: Captura de datos con Flume y compresión LZO
Configure Flume para recolectar datos desde Kafka y almacenarlos en HDFS con compresión LZO. Copie los archivos de configuración de Hadoop al directoroi conf de Flume. Ejemplo de configuración:
# Definir componentes
agent.sources = kafka-src
agent.channels = mem-ch
agent.sinks = hdfs-snk
# Configurar fuente Kafka
agent.sources.kafka-src.type = org.apache.flume.source.kafka.KafkaSource
agent.sources.kafka-src.batchSize = 4000
agent.sources.kafka-src.batchDurationMillis = 2000
agent.sources.kafka-src.kafka.bootstrap.servers = broker1:9092,broker2:9092
agent.sources.kafka-src.kafka.topics = logs-events
agent.sources.kafka-src.kafka.consumer.group.id = flume-consumer-group
# Configurar canal en memoria
agent.channels.mem-ch.type = memory
agent.channels.mem-ch.capacity = 15000
agent.channels.mem-ch.transactionCapacity = 5000
# Configurar sink HDFS con compresión LZO
agent.sinks.hdfs-snk.type = hdfs
agent.sinks.hdfs-snk.hdfs.path = hdfs://namenode:8020/data/logs/ds=%Y-%m-%d/hour=%H/
agent.sinks.hdfs-snk.hdfs.batchSize = 1000
agent.sinks.hdfs-snk.hdfs.codeC = lzop
agent.sinks.hdfs-snk.hdfs.fileType = CompressedStream
# Vincular componentes
agent.sources.kafka-src.channels = mem-ch
agent.sinks.hdfs-snk.channel = mem-ch
Inicie el agente de Flume con el siguiente comando:
nohup flume-ng agent --name agent --conf-file /etc/flume/conf/flume-kafka-hdfs.conf --conf /etc/flume/conf -Dflume.root.logger=INFO,console &
Los datos se almacenarán en HDFS como archivos comprimidos con LZO, lo que facilita su procesamianto posterior en herramientas como Hive o MapReduce.