2017-04-12 14 views
0

AWSのHadoop hdfsにアップロードしたいローカルデータファイル(csv)があります。最初にリモートサーバーにファイルをアップロードしてからHDFSにファイルをコピーする必要はありません。だから私はthis postの後にCLIで1つのライナーを作成しました。リモートファイルをhadoopに入れて圧縮と圧縮解除を追加する

ここでは、処理を高速化して帯域幅を節約するために、各ファイルを(ローカルで)圧縮し、アップロードし、圧縮解除して(リモートサーバー上で)HDFSに入れることができると考えました。

私のpiplineに圧縮と伸張を追加するにはどうすればよいですか?

次は私の現在のスクリプトです:いくつかの実験の後

#! /bin/bash 

DATA_FOLDER="~/data" 

for fpath in $DATA_FOLDER/*; do 
    fname=`basename "$fpath"` 
    #echo $fname 
    cat $DATA_FOLDER/$fname | ssh namenode ". ~/.bash_profile; hdfs dfs -put - /data/ShenXianNongShangHang/$fname" 
    echo "Copied \"$fpath\" to HDFS." 
done 

UPDATE

、私は次の解決策を考え出した:

#! /bin/bash 

DATA_FOLDER="/path/to/local/data/folder" 
REMOTE_TEMP_FOLDER="/linux/system/path/to/temp/folder/to/save/compressed /file" # you should have created it 
REMOTE_HDFS_DATA_FOLDER="hdfs/data/folder" 

for fpath in $DATA_FOLDER/*; do 
    fname=`basename "$fpath"` 

    # Keep the original file and create a compressed copy 
    gzip -c $DATA_FOLDER/$fname > $fname.gz 
    echo "Compressed \"$fname\" and created a local copy." 

    # Upload compressed the file to remote server 
    scp $fname.gz namenode:$REMOTE_TEMP_FOLDER/$fname.gz 
    echo "Uploaded \"$fname\" to the namenode:$REMOTE_TEMP_FOLDER." 

    # Delete the local copy of the compressed file 
    rm $fname.gz 
    echo "Deleted local copy of \"$fname.gz\"." 

    # Decompress file and put in HDFS on the remote server 
    # Each csv data file will be placed in its own directory (creating Hive external table requires it) 
    ssh namenode ". ~/.bash_profile; hdfs dfs -mkdir $REMOTE_HDFS_DATA_FOLDER/$fname.dir" 
    ssh namenode ". ~/.bash_profile; gunzip -c $REMOTE_TEMP_FOLDER/$fname.gz | hdfs dfs -put - $REMOTE_HDFS_DATA_FOLDER/$fname.dir/$fname" 
    echo "Copied \"$fname\" to HDFS." 
    ssh namenode ". ~/.bash_profile; hdfs dfs -ls -h $REMOTE_HDFS_DATA_FOLDER/$fname.dir/$fname" 

    # Remove the compressed copy on the remote server 
    ssh namenode "rm $REMOTE_TEMP_FOLDER/$fname.gz" 
    echo "Deleted remote copy of \"$fname.gz\"." 
done 

答えて

0

は十分に担当者を持っていませんコメントします。多分このようなものを試してみませんか?

cat $ DATA_FOLDER/$ fname | gzip $ fname | SSHの名前ノード -

Compress files while reading data from STDIN

+0

ガット・エラー "〜/ .bash_profileの;のgzip -d $ fnameのHDFS DFS -put /データ/ ShenXianNongShangHang/$のfnameを。": 'GZIP:をstatできません:cache_db-cache_db -4-10-17_del_saacntxn.csv(cache_db-cache_db-4-10-17_del_saacntxn.csv):「cache_db-cache_db-4-10-17_del_saacntxn.csv」が私の「fname」であるファイルやディレクトリはありません。 – panc

+0

また、 '$ fname'がリモートサーバ上に存在しないので、' gzip -d $ fname'がリモートサーバ上でどのように実行されるのか理解できません。 – panc

+0

ええ私は私の答えをテストする時間がなかったので、あなたのソリューションを見つけたようだと私はコメントしたかった。私は後でこれを試してみるかもしれません...パイプとawkを使ってこれを行うことが可能かどうかを見てください。 –

関連する問題