2017-09-17 10 views
1

ローカルファイルシステムからシェルスクリプトを通してHDFSにファイルをコピーする必要があります。私は上記の場合アルファベット順にローカルからHDFSにファイルをコピー - ソート

fewInfo.tsv.gz 
fewInfo.txt 

私のローカルシステムの2つのファイルを持っていると仮定し、fewInfo.tsv.gzは、HDFSに(SはXの前に来る)最初にコピーする必要があり、その後、fewInfo.txtをコピーする必要があります。これは可能ですか?

複数のファイルがHDFSにコピーされているときに「put」コマンドがどのように機能するかについての内部構造を知っている人はいますか?

私が使用しているHadoopのバージョンは、Hadoop 2.5.0-cdh5.3.1です。

答えて

0

すべてのファイルを検索し、ファイルをソートしてからhdfsコピーを実行するために、ディレクトリをループすることができます。利点は、ソートの制約を指定できることです(たとえば、ファイル名、日付、順序など)。これを実行する多くのオプションがあります。一つは、findコマンドを使用することです:

find /some/directory -type f -maxdepth 1 -type f | sort | while IFS= read -r filename; do hdfs dfs -copyFromLocal "$filename" hdfs://target/dir/; done 
  • -maxdepth 1引数は、再帰的に任意のサブディレクトリに下降から見つける防ぎます。このようなネストされたディレクトリが処理されるようにするには、これを省略できます。
  • -type -fは、プレーンなファイルのみが処理されるように指定します。
  • sortは、見つかったファイルがソートされることを定義します。ここでは、逆順、変更日の並べ替えなどで拡張する可能性があります。
  • while IFS= read -r filenameループでは見つかったファイルが膨大になります。そのループの中でIFSは、先頭と末尾の空白を保持することです。 -rオプションを指定すると、読み込みでバックスラッシュを特殊文字として扱うことができなくなります。
  • hdfs dfs -copyFromLocal "$filename" hdfs://target/dir/は、ソートされたfilenamesをローカルディレクトリからhdfsディレクトリにコピーします。または、hadoop -fs put "$filename" hdfs://target/dir/
関連する問題