我想合并 2 个 bzip2 文件。我尝试将一个附加到另一个:cat file1.bzip2 file2.bzip2 > out.bzip2
这似乎有效(此文件已正确解压缩),但我想将此文件用作 Hadoop 输入文件,并且我收到有关损坏块的错误。
合并 2 个 bzip2 文件而不解压缩它们的最佳方法是什么?
我想合并 2 个 bzip2 文件。我尝试将一个附加到另一个:cat file1.bzip2 file2.bzip2 > out.bzip2
这似乎有效(此文件已正确解压缩),但我想将此文件用作 Hadoop 输入文件,并且我收到有关损坏块的错误。
合并 2 个 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,你应该没问题。
您可以将它们都压缩(嗯,存储)到新的 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。
更多信息在这里。
您不必合并文件即可将它们用作 Hadoop 输入:
file_name*
- 一种模式;file_name_1,file_name_2
- 输入列表。Hadoop 会处理它。
否则,您可以使用 Hadoop 的流来合并它们(通过解压缩)。
您可以按模式生成文件列表,例如:
FILES_LIST="'ls -m template*.bz2'"
INPUT_FILE="'echo $FILES_LIST | tr -d ' ' '"
内部'
引号应该不同。您可以$INPUT_FILE
通过 CLI 作为变量传递给您的脚本。
还可以将CombineFileInputFormat类视为 InputFormat。