代码之家  ›  专栏  ›  技术社区  ›  dlamblin

Hadoop HDFS就地压缩

  •  0
  • dlamblin  · 技术社区  · 7 年前

    因此,HDF上的/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 但这一部分甚至没有完全映射到整个文件,也不是snappy编解码器。

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

    有没有一种方法可以做到这一点,而不需要从HDFS获取文件,在本地进行处理,然后将其放回?哪个处理文件名?

    1 回复  |  直到 7 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    6 年前

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

    此外,如果你想要的只是 application_1234 文件,您可以在Hadoop配置中启用纱线日志压缩,这将为您处理仅用于纱线日志的上传到HDFS。

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

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

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