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

2eafrhcq  于 2023-03-17  发布在  Hadoop
关注(0)|答案(8)|浏览(353)

我在输入目录中放入了多个小文件,我想把它们合并成一个文件,而不需要使用本地文件系统或编写mapreds。有没有办法可以使用hadoof fs命令或Pig来完成?
谢谢!

g9icjywg

g9icjywg1#

为了保持网格上的所有内容,使用带有单个reducer和cat的hadoop流作为Map器和reducer(基本上是一个noop)-使用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

如果要压缩,请添加
-Dmapred.输出.压缩=真\ -Dmapred.输出.压缩.编解码器=org.apache.hadoop.io.压缩.GzipCodec

nvbavucw

nvbavucw2#

hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
gkn4icbw

gkn4icbw3#

好的......我找到了一种方法,用hadoop fs命令-

hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]

我测试的时候它还能用......有什么陷阱吗?
谢谢!

yk9xbfzb

yk9xbfzb4#

如果设置fuse将HDFS挂载到本地目录,则输出可以是挂载的文件系统。
例如,我将HDFS本地挂载到/mnt/hdfs,运行以下命令,效果很好:

hadoop fs -getmerge /reports/some_output /mnt/hdfs/reports/some_output.txt

当然,使用fuse将HDFS挂载到本地目录还有其他原因,但这对我们来说是一个不错的副作用。

sqxo8psd

sqxo8psd5#

您可以使用HDFS 0.21中的新工具HDFSConcat来执行此操作,而不会产生拷贝成本。

vcudknz3

vcudknz36#

如果您正在Hortonworks集群中工作,并希望将HDFS位置中存在的多个文件合并为一个文件,则可以运行“hadoop-streaming-2.7.1.2.3.2.0-2950.jar”jar,该jar运行单个reducer,并将合并文件合并到HDFS输出位置。

$ hadoop jar /usr/hdp/2.3.2.0-2950/hadoop-mapreduce/hadoop-streaming-2.7.1.2.3.2.0-2950.jar \
-Dmapred.reduce.tasks=1 \
-input "/hdfs/input/dir" \
-output "/hdfs/output/dir" \
-mapper cat \
-reducer cat

您可以从Get hadoop streaming jar下载此jar
如果您正在编写Spark作业,并且希望获得一个合并文件以避免创建多个RDD和性能瓶颈,请在转换RDD之前使用这段代码
sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)
这将合并所有部分文件为一个,并再次保存到hdfs位置

1qczuiv0

1qczuiv07#

从Apache Pig的Angular 解决这个问题,
要通过Pig合并两个模式相同的文件,可以使用UNION命令

A = load 'tmp/file1' Using PigStorage('\t') as ....(schema1)
 B = load 'tmp/file2' Using PigStorage('\t') as ....(schema1) 
 C = UNION A,B
 store C into 'tmp/fileoutput' Using PigStorage('\t')
knpiaxh1

knpiaxh18#

所有的解决方案都相当于

hadoop fs -cat [dir]/* > tmp_local_file  
hadoop fs -copyFromLocal tmp_local_file

这仅仅意味着本地m/c I/O在数据传输的关键路径上。

相关问题