複数の小さなファイルを入力ディレクトリに入れて、ローカルファイルシステムを使用したりmapredを作成したりせずに、単一のファイルにマージしたい。 hadoof fsコマンドまたはPigを使用して実行できる方法はありますか?
ありがとう!
グリッド上のすべてを維持するには、単一のリデューサーと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
hadoop fs -getmerge <dir_of_input_files> <mergedsinglefile>
わかりました... hadoop fs
コマンドを使用する方法を見つけました-
hadoop fs -cat [dir]/* | hadoop fs -put - [destination file]
私はそれをテストしたときに機能しました...考えられる落とし穴はありますか?
ありがとう!
HDFSをローカルディレクトリにマウントするようにFuseをセットアップした場合、出力はマウントされたファイルシステムになります。
たとえば、HDFSを/mnt/hdfs
にローカルにマウントしています。私は次のコマンドを実行し、それはうまく機能します:
hadoop fs -getmerge /reports/some_output /mnt/hdfs/reports/some_output.txt
もちろん、Fuseを使用してHDFSをローカルディレクトリにマウントする理由は他にもありますが、これは私たちにとって素晴らしい副作用でした。
ツール HDFSConcat (HDFS 0.21の新機能)を使用して、コピーのコストをかけずにこの操作を実行できます。
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の場所に保存されます
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')
すべてのソリューションは、
hadoop fs -cat [dir]/* > tmp_local_file
hadoop fs -copyFromLocal tmp_local_file
ローカルm/c I/Oがデータ転送のクリティカルパス上にあることを意味するだけです。