Hadoop HDFS压缩到位

时间:2017-12-15 09:43:12

标签: hadoop hdfs snappy

因此,hdfs上的/ var / log / ...中的一堆日志文件可以使用snappy进行解压缩或压缩。

如果它们没有以.snappy结尾,我想压缩它们,并用结尾命名它们。但是我想用数据本地做这件事,最好让名字正确。

我尝试了hadoop流媒体方法。

HAD=/usr/lib/hadoop
$HAD/bin/hadoop jar $HAD/hadoop-streaming.jar \
-D mapred.output.compress=true \
-D madred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec \
-D mapred.reduce.tasks=0 \
-input /var/log/… -output /user/hadoop/working \
-mapper org.apache.hadoop.mapred.lib.IdentityMapper

但是这给了一堆零件文件,似乎是一行一行。由于某些原因,它也选择了放气。所以我得到part-00000.deflate等文件。输入就像app_123456789_0123_1。我本来希望app_123456789_0123_1.snappy但是这个部分甚至没有完全映射到整个文件,也不是简单的编解码器。

FAQ says您可以生成文件名的输入文件,然后对每个名称执行任务。虽然没有简单的snappy压缩工具。另一个选项看起来会更好(虽然我不想构建一个jar,我想我可以)然而它说这些名字不会被保留。我认为这对我没有帮助。

有没有办法做到这一点,不涉及从HDFS获取文件,在本地处理它,并把它放回去?并处理文件名?

1 个答案:

答案 0 :(得分:1)

日志文件是连续生成的,因此我不确定使用Hadoop流来读取它们是有意义的,因为这是一次性操作,如果再次运行它,则不会保留已读取的文件。

此外,如果你想要的只是application_1234文件,你可以在Hadoop配置中启用YARN日志压缩,并且只为YARN日志处理上传到HDFS。

如果您希望将这些日志连续压缩并上传到HDFS,您应该考虑至少使用Flume,它包含在主要的Hadoop发行版中。

如果您愿意安装任何其他软件,请查看Fluentd或Filebeat以进行日志收集,然后使用NiFi以合理的文件大小处理以您选择的压缩格式传输到HDFS。 Kafka也可用于日志采集器和NiFi之间。使用这些选项,您可以很好地控制文件名,也可以将日志发送到Solr或Elasticsearch等适当的搜索平台

关于你的评论,自设置这些工具以来已经有一段时间了,但我相信你可以使用文件名正则表达式模式来明确捕获你想要包含/排除的文件