【问题标题】:How to merge 2 bzip2'ed files?如何合并 2 个 bzip2 文件?
【发布时间】:2010-07-02 18:13:15
【问题描述】:

我想合并 2 个 bzip2 文件。我尝试将一个附加到另一个:cat file1.bzip2 file2.bzip2 > out.bzip2 这似乎可以工作(此文件已正确解压缩),但我想将此文件用作 Hadoop 输入文件,但我收到有关损坏块的错误。

在不解压缩的情况下合并 2 个 bzip2 文件的最佳方法是什么?

【问题讨论】:

    标签: compression hadoop bzip2


    【解决方案1】:

    处理连接的 bzip 固定在主干上,或者应该是:https://issues.apache.org/jira/browse/HADOOP-4012。有一些例子:https://issues.apache.org/jira/browse/MAPREDUCE-477?focusedCommentId=12871993&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#action_12871993 确保你运行的是最新版本的 Hadoop,你应该没问题。

    【讨论】:

    • Bzipped 文件被正确分割,但我仍然不知道如何在连接文件上运行 map 任务。 (但是在解压所有之后,然后cat,然后压缩这个大输入文件就可以了)
    【解决方案2】:

    您可以将它们都压缩(嗯,存储)到新的 bz2 中吗?这意味着您必须进行 3 次解压缩才能获取 2 个存档的内容,但可能适用于您的场景。

    【讨论】:

    • 这个主意很好,如果 bzip2 聪明点就更好了,而且只需要解压 1 次。
    【解决方案3】:

    这个问题已经很老了,但我现在就遇到了,所以,如果其他人搜索这个问题,我发现这是在不使用本地文件系统的情况下将 HDFS 中的多个 bz2 文件合并为一个。这也可以用于任何文本文件。

    $HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -input foo \
    -output foo_merged \
    -mapper /bin/cat \
    -reducer /bin/cat 
    

    这将合并文件夹 foo 中的所有文件并将单个文件 (part-00000) 写入文件夹 foo_merged

    您可以对输入文件夹使用通配符,也可以根据需要使用任意数量的-input,以包含所有将要加入的文件。

    输出文件将被解压缩。如果您希望输出也压缩在 bz2 中,则应指定以下两个选项:

    $HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -D mapred.output.compress=true \
    -D mapred.output.compression.codec=org.apache.hadoop.io.compress.BZip2Codec \
    -input foo \
    -output foo_merged \
    -mapper /bin/cat \
    -reducer /bin/cat 
    

    将 BZip2Codec 替换为您想使用的任何一个。

    更多信息here

    【讨论】:

      【解决方案4】:

      您不必合并文件即可将它们用作 Hadoop 输入:

      • 考虑file_name* - 一个模式;
      • file_name_1,file_name_2 - 输入列表。

      Hadoop 会处理它。

      否则,您可以使用 Hadoop 的流式传输来合并它们(通过解压缩)。

      您可以按如下模式生成文件列表:

      FILES_LIST="'ls -m template*.bz2'"

      INPUT_FILE="'echo $FILES_LIST | tr -d ' ' '"

      内部' 引号应该不同。您可以通过 CLI 将 $INPUT_FILE 作为变量传递给您的脚本。

      还将CombineFileInputFormat 类视为 InputFormat。

      【讨论】:

      • 我试过了,但是当您有数千个每个 1MB 的压缩文件,并且您不想将它们加载到 HDFS,而是想要一个大文件时,就会出现问题加载。
      • lbzcat part* | lbzcat -z > output_file
      • 我的最后一条评论确实合并了文件,但 hadoop 之后无法完全读取它们。
      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2020-12-25
      • 2012-11-04
      • 1970-01-01
      • 2019-12-12
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多