2017-03-01 15 views
1
で複数のファイルをマージし

HDFSでマイフォルダパス構造は、このようなものです。私はこれらの個々のディレクトリの中にあるすべてのファイルをパスに応じて単一の個別のファイル名にマージできるシェルスクリプトを作成しています。再帰的にHDFS

例:1に

すべてJSONs内部/データ/ます。topicName /年= 2017 /月= 02 /日= 28 /時間= 00は、内部のすべてのJSONs /データ/

full_2017_02_28_00.jsonファイルをマージ/ data/topicname/year = 2017/month = 02/day = 28/hour =トピック名/年= 2017 /月= 02/day = 28/hour = 01マージされたファイルに1つのマージファイルfull_2017_02_28_01.json

すべてのJSONは、 02を1つのマージ済みファイルfull_2017_02_28_02.jsonなどに変換します。

上記のパターンでファイル名を保持することは、私が達成しようとする副次的な仕事です。現在、私はファイル名をハードコードすることができます。

しかし、ディレクトリパス構造内の再帰的連結は起こっていません。

はこれまでのところ、私は以下試してみました:

hadoop fs -cat /data/topicname/year=2017/* | hadoop fs -put - /merged/test1.json 

エラー: -

cat: `/data/topicname/year=2017/month=02/day=28/hour=00': Is a directory 
cat: `/data/topicname/year=2017/month=02/day=28/hour=01': Is a directory 
cat: `/data/topicname/year=2017/month=02/day=28/hour=02': Is a directory 

再帰猫は、上記では起きていない

hadoop fs -ls /data/topicname/year=2017/month=02 | find /data/topicname/year=2017/month=02/day=28 -name '*.json' -exec cat {} \; > output.json 

エラー試してください: -

find: ‘/data/topicname/year=2017/month=02/day=28’: No such file or directory 

cannot write output to stream message is repeated multiple times 
file /merged/output.json is repeated a few times 

どのようにこれが達成可能である - :

それは上記の試みで

for i in `hadoop fs -ls -R /data/topicname/year=2017/ | cut -d' ' -f19` ;do `hadoop fs -cat $i/* |hadoop fs -put - /merged/output.json`; done 

エラーをローカルFSの代わりに、HDFSで検索をしているのですか?私はスパークを使いたくない。

答えて

0

使用-appendToFile:プロセスがシーケンシャルであると解釈

for file in `hdfs dfs -ls -R /src_folder | awk '$2!="-" {print $8}'`; do hdfs dfs -cat $file | hdfs dfs -appendToFile - /target_folder/filename;done 

時間は、ファイルの数とサイズに依存することになります。

+0

これは多くの時間を取っています。それは20分のように実行され、5MBのファイルサイズがマージされた10-15ファイルだけを追加することができました。 – earl

+0

はい、fsshellを使用するとシーケンシャルで遅くなります。このソリューションは、投稿した質問の構文的に正しいバージョンです。並列処理を実現するには、MapReduceまたはSpark(使用しないと言いました)を使用します。 – franklinsijo

0

私は以下のスクリプトを使用して私の目標を達成することができました:

#!/bin/bash 

for k in 01 02 03 04 05 06 07 08 09 10 11 12 
do 
     for j in 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
     do 
       for i in 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
       do 

       hadoop fs -cat /data/topicname/year=2017/month=$k/day=$j/hour=$i/* | hadoop fs -put - /merged/TEST1/2017"_"$k"_"$j"_"$i.json 
       hadoop fs -du -s /merged/TEST1/2017"_"$k"_"$j"_"$i.json > /home/test/sizetest.txt 
       x=`awk '{ print $1 }' /home/test/sizetest.txt` 
       echo $x 
       if [ $x -eq 0 ] 
       then 
       hadoop fs -rm /merged/TEST1/2017"_"$k"_"$j"_"$i.json 
       else 
       echo "MERGE DONE!!! All files generated at hour $i of $j-$k-2017 merged into one" 
       echo "DELETED 0 SIZED FILES!!!!" 
       fi 

       done 
     done 
done 

rm -f /home/test/sizetest.txt 
hadoop fs -rm -r /data/topicname