因此,在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
但这是给一堆零件文件,似乎是一行一行地做事情。出于某种原因,它也选择了deflate。所以我得到的文件 part-00000.deflate
等等。输入就像 app_123456789_0123_1
. 我会喜欢的 app_123456789_0123_1.snappy
但这个部分甚至没有完全Map到一个完整的文件,也不是很快的编解码器。
常见问题解答说,您可以生成一个包含文件名的输入文件,然后对每个文件名执行一项任务。但是没有简单的快速压缩工具。另一个选项看起来会更好(虽然我不想构建jar,我想我可以),但是它说名称不会被保留。我想那对我毫无帮助。
有什么方法可以做到这一点,而不需要从hdfs获取文件,在本地处理文件,然后将其放回去?哪个处理文件名?
1条答案
按热度按时间ubof19bj1#
日志文件是连续生成的,所以我不确定使用hadoop流来读取它们是否有意义,因为这是一次性操作,如果再次运行它,则不会保留已读取的文件。
另外,如果你想要的只是
application_1234
文件,您可以在hadoop配置中启用yarn日志压缩,这将为您处理上传到hdfs的yarn日志。如果您想让这些日志不断地被压缩并上传到hdfs,您应该考虑至少使用flume,它包含在主要的hadoop发行版中。
如果您愿意安装任何其他软件,请查看fluentd或filebeat以收集日志,然后查看nifi以您选择的压缩格式处理以合理文件大小传输到hdfs的操作。kafka也可以在日志收集器和nifi之间使用。通过这些选项,您可以很好地控制文件名,也可以将日志发送到适当的搜索平台,如solr或elasticsearch
关于您的评论,设置这些工具已经有一段时间了,但是我相信您可以使用filename regex模式来显式捕获要包含/排除的文件