2017-09-09 16 views
0

EMRクラスターのHDFSファイルシステムからS3バケットへデータを移動する方法を知りたいと思います。私はSparkのS3に直接書き込むことができると認識していますが、原則として後でそれを行うのも簡単でなければならず、これまで実際にはそうでないことが分かりました。EMRのhdfs://パスへのhadoop fsパスの変換

AWSドキュメントでは、HDFSとS3間でデータを移動する目的で、s3-dist-cpをお勧めします。 s3-dist-cpdocumentationには、HDFSソースをURL形式、つまりhdfs://path/to/fileに指定する必要があることが記載されています。 HDFSと私のローカルファイルシステム間でhadoop fs -getを使ってデータを移動しましたが、これはhdfs://path/to/fileではなくpath/to/fileの構文をとります。両者をどのようにマップするかは不明です。

私はSSHからマスターノードに取り組んでいます。それぞれの場合において

  • hdfs:///[public IP]/path/to/file
  • hdfs:///[public IP]:8020/path/to/file
  • hdfs:///localhost/path/to/file
  • hdfs:///path/to/file
  • /path/to/file(および多くの変形)

:私は、次の両方の2つのおよび3つのスラッシュとのそれぞれを試み、私のコマンドは書類ごとにフォーマットされています:

S3-distの-CP --src HDFS:// ... --dest S3://私のバケット/先

私は、個々のファイルやディレクトリ全体の両方で試してみました。どちらの場合も、ソースファイルが存在しないというエラーが表示されます。私は間違って何をしていますか?

答えて

1

デフォルトのファイルシステム(core-site.xmlではfs.defaultFSとして、EMRではデフォルトでhdfsとして設定されています)と現在の作業ディレクトリに基づいて、相対パスまたは完全修飾パスが自動的に完全修飾パスに解決されますディレクトリ(デフォルトは/ user /)です。

EMRでは、/ path/to/fileのような絶対パスは、hdfs:/// path/to/fileと同等です。 path/to/fileのような相対パスは、hdfs:/// user/hadoop/path/to/fileに解決されます(あなたがhadoopユーザとしてコマンドを実行していると仮定します)。

hdfs://パスで「ファイルが見つかりません」というエラーが発生する理由は、ほとんどの例で、前にスラッシュが多すぎるためにホスト名を間違った場所に置いているためですホスト名ホスト名を含める場合は、その前に2つのスラッシュを付けるだけです。あなたは実際にはホスト名を含める必要はありませんので、hdfs:/// path/to/fileと書くこともできます。ほとんどの例では、スラッシュがのホスト名が含まれていたため、ホスト名はパスの一部であり、ホスト名ではありませんでした(すべての例では、3つのスラッシュはデフォルトのホスト名が使用されることを意味します) 。

4番目の例(hdfs:/// path/to/file)では、実際には有効なパスですが、path/to/fileと同じものを参照しません。これは相対パスですパス。上記と同様に、/ path/to/fileはhdfs:/// path/to/fileと同等ですが、path/to/fileはhdfs:/// user/hadoop/path/to/fileと同等です。

ちなみに、ホスト名を使用する場合は、パブリックIPではなくプライベートマスターホスト名を使用する必要があります。(ただし、ホスト名を残しておけば、ホスト名を含めないことを示すために3つのスラッシュを続けて使用することができます)。ホスト名を使用することをお勧めします。なぜなら、いつでもパスを変更する必要があるからです別のクラスタでコマンドを実行しました。

最後に、「hadoop fs -get」は非uri形式のパスのみを使用し、s3-dist-cpはuri形式のパスのみを使用することは間違いありません。これらのいずれかはどちらかのパスのスタイルをとります。 "hadoop fs -get/path/to/file"と "hadoop fs -get hdfs:/// path/to/file"は有効で同等です。

関連する問題