6

hdfsディレクトリ内のすべてのファイルの名前を変更して.lzo拡張子を付けるにはどうすればよいですか?.lzo.indexファイルの名前を変更しないでください。

たとえば、次のディレクトリリスト:

file0.lzo file0.lzo.index file0.lzo_copy_1 

名前を変更できます:

file0.lzo file0.lzo.index file0.lzo_copy_1.lzo 

これらのファイルはlzo圧縮されており、.lzohadoopで認識される拡張子が必要です。

4

3 に答える 3

15

このためのJavaコードを記述したくない場合は、コマンドラインHDFSAPIを使用するのが最善の策だと思います。

mvHadoopで

hadoop fs -mv URI [URI …] <dest>

小さなワンライナーを使用してパスを取得できます。

% hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}'

/user/foo/bar/blacklist
/user/foo/bar/books-eng
...

これにより、awk出力からディレクトリが削除されます。これで、これらのファイルを変数に入れることができます。

% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d/ {print $8}')

各ファイルの名前を変更します。

% for f in $files; do hadoop fs -mv $f $f.lzo; done

awk他の基準でファイルをフィルタリングするために使用することもできます。これにより、正規表現に一致するファイルが削除されますnolzo。ただし、テストされていません。しかし、この方法で柔軟なフィルターを作成できます。

% files=$(hadoop fs -ls /user/foo/bar | awk  '!/^d|nolzo/ {print $8}' )

hadoopコマンドを次のように置き換えて機能するかどうかをテストしechoます。

$ for f in $files; do echo $f $f.lzo; done

編集:より信頼性の高い出力awkの代わりに使用するように例を更新しました。sed

それを行う「正しい」方法は、おそらくHDFS Java APIを使用することです。ただし、シェルを使用する方が、ほとんどのジョブでおそらくより高速で柔軟性があります。

于 2013-02-06T18:32:52.637 に答える
9

多くのファイルの名前を変更する必要があったとき、効率的な解決策を探していたところ、この質問と、多くのファイルの名前を変更するのは非常に遅いというthi-duong-nguyenの発言に出くわしました。桁違いに高速であるため、強くお勧めできるバッチ名前変更操作用の Java ソリューションを実装しました。基本的な考え方は、org.apache.hadoop.fs.FileSystemrename()メソッドを使用することです。

Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://master:8020");
FileSystem dfs = FileSystem.get(conf);
dfs.rename(from, to);

fromはオブジェクトですtoorg.apache.hadoop.fs.Path最も簡単な方法は、名前を変更するファイルのリスト (新しい名前を含む) を作成し、このリストを Java プログラムに供給することです。

からそのようなマッピングを読み取る完全な実装を公開しましSTDIN。100 個のファイルの名前を 4 秒未満で変更しました (7000 個のファイルの名前を変更するのに同じ時間が必要でした!) 一方で、前述のhdfs dfs -mvベースのアプローチでは100 個のファイルの名前を変更するのに4分かかりました。

于 2014-12-16T20:23:34.230 に答える
2

HDFS でファイルの一括名前変更を行うユーティリティを作成しました: https://github.com/tenaris/hdfs-rename。このツールには制限がありますが、必要に応じて、再帰的な awk 正規表現構文などを使用してツールの改善に貢献できます。

于 2016-08-04T13:00:34.067 に答える