1

HDFS からすべてのコンテンツを含むディレクトリ全体をコピーする最良の方法を探しています。何かのようなもの:

Path srcPath = new Path("hdfs://localhost:9000/user/britva/data");
Path dstPath = new Path("/home/britva/Work");
fs.copyToLocal(false, srcPath, dstPath);

さらに、「data」フォルダーには、「Work」ディレクトリーに存在しないフォルダーを含めることができます。では、これを行う最善の方法は何ですか?

回答ありがとうございます。

解決策の 1 つはFileUtilオブジェクトを使用することだと思いますが、1 つのファイル システム (HDFS) しか初期化していないため、その使用方法がわかりません。次に問題は、ローカル FS をどのように初期化すればよいかということです。私が理解しているように、このユーティリティは多くのノードがある場合に使用されます。しかし、私が望むのは、ローカル FS を操作して、HDFS からプロジェクト ソースにコピーすることです。

また、私は Play! を使用しています。のように、そのパスを使用するのに最適Play.application.path + "/public/stuff"です。

上記のコードを使用しようとすると、次のように表示されます。

java.io.IOException: No FileSystem for scheme: file
4

2 に答える 2

1

私はscalaを使用しているので、これはjavaに似たscalaの例です。

ステップ1。hdfsがアクティブであることを確認してください。ローカルの場合は、127.0.0.1:50070 を開いてみてください

ステップ2。ここにスカラコードがあります:

val hdfsConfig = new Configuration
val hdfsURI = "127.0.0.1:9000"
val hdfs = FileSystem.get(new URI(hdfsURI), hdfsConfig)
val targetPath = new Path("127.0.0.1:9000/hdfsData")
if (hdfs.exists(targetPath)) {
  hdfs.delete(targetPath, true)
}
val oriPath = new Path(#your_local_file_path)
hdfs.copyFromLocalFile(oriPath, new Path(hdfsURI+"/"))
hdfs.close()

Step3. 例: 私のローカル ファイル パスは次のとおりです: /tmp/hdfsData

ステップ 2 のコードを実行した後、このディレクトリの下のすべてのファイルを HDFS にコピーしたい: すべてのファイルは "127.0.0.1:9000/hdfsData/" にある

Step4. HDFS からローカルにコピーするには、「copyFromLocalFile」を「copyToLocalFile」に変更するだけです

于 2014-06-19T18:44:47.313 に答える
0

maven「スキームのファイルシステムがありません」という例外を使用してプロジェクトをビルドすると、このような問題が発生し、私の場合は次のようになりました。

実行しようとしている JAR の内容を確認してください。特にMETA-INFO/servicesディレクトリ、ファイルorg.apache.hadoop.fs.FileSystem。filsystem 実装クラスのリストがあるはずです。HDFS およびローカル ファイル スキームorg.apache.hadoop.hdfs.DistributedFileSystemのリストにチェック行があります。org.apache.hadoop.fs.LocalFileSystem

この場合、ビルド中に参照されたリソースをオーバーライドする必要があります。

他の可能性は、単にクラスパスにないということですhadoop-hdfs.jarが、これは確率が低いです。通常、正しいhadoop-client依存関係がある場合、それはオプションではありません。

于 2013-08-31T17:59:54.200 に答える