因此,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获取文件,在本地处理它,并把它放回去?并处理文件名?
答案 0 :(得分:1)
日志文件是连续生成的,因此我不确定使用Hadoop流来读取它们是有意义的,因为这是一次性操作,如果再次运行它,则不会保留已读取的文件。
此外,如果你想要的只是application_1234
文件,你可以在Hadoop配置中启用YARN日志压缩,并且只为YARN日志处理上传到HDFS。
如果您希望将这些日志连续压缩并上传到HDFS,您应该考虑至少使用Flume,它包含在主要的Hadoop发行版中。
如果您愿意安装任何其他软件,请查看Fluentd或Filebeat以进行日志收集,然后使用NiFi以合理的文件大小处理以您选择的压缩格式传输到HDFS。 Kafka也可用于日志采集器和NiFi之间。使用这些选项,您可以很好地控制文件名,也可以将日志发送到Solr或Elasticsearch等适当的搜索平台
关于你的评论,自设置这些工具以来已经有一段时间了,但我相信你可以使用文件名正则表达式模式来明确捕获你想要包含/排除的文件