【问题标题】:Hadoop HDFS compress in placeHadoop HDFS 就地压缩
【发布时间】:2023-03-09 01:23:02
【问题描述】:

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

是否有某种方法可以做到这一点,而不涉及从 HDFS 获取文件、在本地处理文件并将其放回?哪个处理文件名?

【问题讨论】:

    标签: hadoop hdfs snappy


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这些是 Spark 日志,Spark 应用程序在写入日志文件时将其命名为 .inprogress,然后在完成后将它们重命名为最终名称。我只关注压缩未压缩的已完成应用程序。我们这里有多个用户,有些用户使用他们自己的 spark 配置,他们不压缩,因为这使得在开发过程中阅读他们的日志变得更加困难。然后他们就这样设置好了。不过让我看看 Flume。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多