Hadoop HDFS 就地压缩

Hadoop HDFS compress in place

因此,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 您可以生成文件名的输入文件,然后对每个名称执行任务。虽然没有简单的快速压缩工具。另一个选项看起来会更好(虽然我不想构建一个 jar,我想我可以)但是它说名称不会被保留。我认为这对我没有帮助。

有没有什么方法不需要从 HDFS 获取文件、在本地处理文件然后放回原处?哪个处理文件名?

日志文件不断生成,所以我不确定使用 Hadoop 流式传输来读取它们是否有意义,因为这是一次性操作,如果您 运行 它不会保留已读取的文件再次。

此外,如果您只需要 application_1234 文件,您可以在 Hadoop 配置中启用 YARN 日志压缩,这将为您处理上传到 HDFS 的 YARN 日志。

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

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

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