我在输入目录中放入了多个小文件,我想把它们合并成一个文件,而不需要使用本地文件系统或编写mapreds。有没有办法可以使用hadoof fs命令或Pig来完成?谢谢!
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
nvbavucw2#
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
gkn4icbw3#
好的......我找到了一种方法,用hadoop fs命令-
hadoop fs
hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]
我测试的时候它还能用......有什么陷阱吗?谢谢!
yk9xbfzb4#
如果设置fuse将HDFS挂载到本地目录,则输出可以是挂载的文件系统。例如,我将HDFS本地挂载到/mnt/hdfs,运行以下命令,效果很好:
/mnt/hdfs
hadoop fs -getmerge /reports/some_output /mnt/hdfs/reports/some_output.txt
当然,使用fuse将HDFS挂载到本地目录还有其他原因,但这对我们来说是一个不错的副作用。
sqxo8psd5#
您可以使用HDFS 0.21中的新工具HDFSConcat来执行此操作,而不会产生拷贝成本。
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位置
sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)
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')
knpiaxh18#
所有的解决方案都相当于
hadoop fs -cat [dir]/* > tmp_local_file hadoop fs -copyFromLocal tmp_local_file
这仅仅意味着本地m/c I/O在数据传输的关键路径上。
8条答案
按热度按时间g9icjywg1#
为了保持网格上的所有内容,使用带有单个reducer和cat的hadoop流作为Map器和reducer(基本上是一个noop)-使用MR标志添加压缩。
如果要压缩,请添加
-Dmapred.输出.压缩=真\ -Dmapred.输出.压缩.编解码器=org.apache.hadoop.io.压缩.GzipCodec
nvbavucw2#
gkn4icbw3#
好的......我找到了一种方法,用
hadoop fs
命令-我测试的时候它还能用......有什么陷阱吗?
谢谢!
yk9xbfzb4#
如果设置fuse将HDFS挂载到本地目录,则输出可以是挂载的文件系统。
例如,我将HDFS本地挂载到
/mnt/hdfs
,运行以下命令,效果很好:当然,使用fuse将HDFS挂载到本地目录还有其他原因,但这对我们来说是一个不错的副作用。
sqxo8psd5#
您可以使用HDFS 0.21中的新工具HDFSConcat来执行此操作,而不会产生拷贝成本。
vcudknz36#
如果您正在Hortonworks集群中工作,并希望将HDFS位置中存在的多个文件合并为一个文件,则可以运行“hadoop-streaming-2.7.1.2.3.2.0-2950.jar”jar,该jar运行单个reducer,并将合并文件合并到HDFS输出位置。
您可以从Get hadoop streaming jar下载此jar
如果您正在编写Spark作业,并且希望获得一个合并文件以避免创建多个RDD和性能瓶颈,请在转换RDD之前使用这段代码
sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)
这将合并所有部分文件为一个,并再次保存到hdfs位置
1qczuiv07#
从Apache Pig的Angular 解决这个问题,
要通过Pig合并两个模式相同的文件,可以使用UNION命令
knpiaxh18#
所有的解决方案都相当于
这仅仅意味着本地m/c I/O在数据传输的关键路径上。