在Hadoop中将多个文件合并为一个文件

uHa*_*oop 31 hadoop apache-pig

我将多个小文件放入我的输入目录,我希望将其合并到一个文件中,而不使用本地文件系统或编写mapred.有没有办法可以使用hadoof fs命令或猪?

谢谢!

Guy*_*y B 22

为了保持网格上的所有内容,使用带有单个reducer和cat作为mapper和reducer(基本上是noop)的hadoop流 - 使用MR标志添加压缩.

hadoop jar \
    $HADOOP_PREFIX/share/hadoop/tools/lib/hadoop-streaming.jar \<br>
    -Dmapred.reduce.tasks=1 \
    -Dmapred.job.queue.name=$QUEUE \
    -input "$INPUT" \
    -output "$OUTPUT" \
    -mapper cat \
    -reducer cat
Run Code Online (Sandbox Code Playgroud)

如果要压缩,请添加
-Dmapred.output.compress = true\-Dmapred.output.compression.codec = org.apache.hadoop.io.compress.GzipCodec


Har*_*eri 17

hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
Run Code Online (Sandbox Code Playgroud)

  • 我认为`mergedsinglefile`是本地的,不是分发的 (7认同)
  • 这将导致本地文件系统上的文件,OP希望避免这些文件 (7认同)
  • 奇怪的是,这没有给我任何结果.不知道为什么. (4认同)

uHa*_*oop 7

好吧......我想出了一种使用hadoop fs命令的方法-

hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]
Run Code Online (Sandbox Code Playgroud)

它在我测试时起作用了......人们可以想到的任何陷阱?

谢谢!

  • 但是在这种情况下,您将所有数据从HDFS下载到您正在运行命令的节点(本地一个?),然后将其上传到HDFS.如果您有大量数据,这不是太有效 (9认同)