web-dev-qa-db-ja.com

Hadoop内で複数のファイルを1つにマージする

複数の小さなファイルを入力ディレクトリに入れて、ローカルファイルシステムを使用したりmapredを作成したりせずに、単一のファイルにマージしたい。 hadoof fsコマンドまたはPigを使用して実行できる方法はありますか?

ありがとう!

30
uHadoop

グリッド上のすべてを維持するには、単一のリデューサーとcatperをマッパーとリデューサーとして使用するhadoopストリーミングを使用します(基本的には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.output.compress = true\-Dmapred.output.compression.codec = org.Apache.hadoop.io.compress.GzipCodec

22
Guy B
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
15
Harsha Hulageri

わかりました... hadoop fsコマンドを使用する方法を見つけました-

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

私はそれをテストしたときに機能しました...考えられる落とし穴はありますか?

ありがとう!

7
uHadoop

HDFSをローカルディレクトリにマウントするようにFuseをセットアップした場合、出力はマウントされたファイルシステムになります。

たとえば、HDFSを/mnt/hdfsにローカルにマウントしています。私は次のコマンドを実行し、それはうまく機能します:

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

もちろん、Fuseを使用してHDFSをローカルディレクトリにマウントする理由は他にもありますが、これは私たちにとって素晴らしい副作用でした。

2
user609254

ツール HDFSConcat (HDFS 0.21の新機能)を使用して、コピーのコストをかけずにこの操作を実行できます。

1

Hortonworksクラスターで作業しており、HDFSの場所にある複数のファイルを単一のファイルにマージする場合、単一のレデューサーを実行する「hadoop-streaming-2.7.1.2.3.2.0-2950.jar」jarを実行して、ファイルを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
_

このjarは Get hadoop streaming jar からダウンロードできます。

sparkジョブを作成していて、複数のRDDの作成とパフォーマンスのボトルネックを回避するためにマージされたファイルを取得する場合、RDDを変換する前にこのコードを使用します

sc.textFile("hdfs://...../part*).coalesce(1).saveAsTextFile("hdfs://...../filename)

これにより、すべてのパーツファイルが1つにマージされ、再びhdfsの場所に保存されます

1
khushbu kanojia

Apache Pigの観点からこれに対処し、

Pigを介して同じスキーマを持つ2つのファイルをマージするには、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')
0
Greturncodezero

すべてのソリューションは、

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

ローカルm/c I/Oがデータ転送のクリティカルパス上にあることを意味するだけです。

0
samurai