【发布时间】:2010-07-02 18:13:15
【问题描述】:
我想合并 2 个 bzip2 文件。我尝试将一个附加到另一个:cat file1.bzip2 file2.bzip2 > out.bzip2 这似乎可以工作(此文件已正确解压缩),但我想将此文件用作 Hadoop 输入文件,但我收到有关损坏块的错误。
在不解压缩的情况下合并 2 个 bzip2 文件的最佳方法是什么?
【问题讨论】:
标签: compression hadoop bzip2
我想合并 2 个 bzip2 文件。我尝试将一个附加到另一个:cat file1.bzip2 file2.bzip2 > out.bzip2 这似乎可以工作(此文件已正确解压缩),但我想将此文件用作 Hadoop 输入文件,但我收到有关损坏块的错误。
在不解压缩的情况下合并 2 个 bzip2 文件的最佳方法是什么?
【问题讨论】:
标签: compression hadoop bzip2
处理连接的 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,你应该没问题。
【讨论】:
cat,然后压缩这个大输入文件就可以了)
您可以将它们都压缩(嗯,存储)到新的 bz2 中吗?这意味着您必须进行 3 次解压缩才能获取 2 个存档的内容,但可能适用于您的场景。
【讨论】:
这个问题已经很老了,但我现在就遇到了,所以,如果其他人搜索这个问题,我发现这是在不使用本地文件系统的情况下将 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。
【讨论】:
您不必合并文件即可将它们用作 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。
【讨论】:
lbzcat part* | lbzcat -z > output_file