Hive over EMRを実行していて、すべてのEMRインスタンスにいくつかのファイルをコピーする必要があります。
私が理解している1つの方法は、各ノードのローカルファイルシステムにファイルをコピーすることです。もう1つは、ファイルをHDFSにコピーすることですが、S3からHDFSにstrightをコピーする簡単な方法は見つかりませんでした。
これについて最善の方法は何ですか?
これを行う最良の方法は、Hadoopのdistcpコマンドを使用することです。例(クラスターノードの1つ):
% ${HADOOP_HOME}/bin/hadoop distcp s3n://mybucket/myfile /root/myfile
これにより、myfileという名前のファイルがmybucketという名前のS3バケットからHDFSの/root/myfile
にコピーされます。この例では、S3ファイルシステムを「ネイティブ」モードで使用していることを前提としています。つまり、HadoopはS3の各オブジェクトをファイルとして認識します。代わりにブロックモードでS3を使用する場合、上の例ではs3nをs3に置き換えます。ネイティブS3とブロックモードの違いの詳細、および上記の例の詳細については、 http://wiki.Apache.org/hadoop/AmazonS を参照してください。
Distcpは非常に強力なツールであることがわかりました。 S3の内外に大量のファイルをコピーするために使用できることに加えて、大きなデータセットを使用してクラスター間の高速コピーを実行することもできます。すべてのデータを単一のノードにプッシュする代わりに、distcpは複数のノードを並行して使用して転送を実行します。これにより、すべてをローカルファイルシステムにコピーする代わりに、大量のデータを転送する場合に、distcpがかなり高速になります。
これで、Amazon自体にdistcpを介して実装されたラッパー、つまり:s3distcpが実装されました。
S3DistCpは、Amazon Webサービス(AWS)、特にAmazon Simple Storage Service(Amazon S3)と連携するように最適化されたDistCpの拡張です。 S3DistCpをジョブフローのステップとして追加して使用します。 S3DistCpを使用すると、大量のデータをAmazon S3からHDFSに効率的にコピーして、Amazon Elastic MapReduce(Amazon EMR)ジョブフローの後続のステップで処理できます。 S3DistCpを使用して、Amazon S3バケット間またはHDFSからAmazon S3にデータをコピーすることもできます
例Amazon S3からHDFSにログファイルをコピーします
次の例は、Amazon S3バケットに保存されているログファイルをHDFSにコピーする方法を示しています。この例では、-srcPatternオプションを使用して、デーモンログにコピーされるデータを制限しています。
elastic-mapreduce --jobflow j-3GY8JC4179IOJ --jar \
s3://us-east-1.elasticmapreduce/libs/s3distcp/1.latest/s3distcp.jar \
--args '--src,s3://myawsbucket/logs/j-3GY8JC4179IOJ/node/,\
--dest,hdfs:///output,\
--srcPattern,.*daemons.*-hadoop-.*'
Amazonによると、 http://docs.amazonwebservices.com/ElasticMapReduce/latest/DeveloperGuide/FileSystemConfig.html "Amazon Elastic MapReduce-File System Configuration"では、S3ブロックFileSystemは非推奨であり、そのURI接頭辞はs3bfs://になり、「ジョブフローの失敗の原因となる可能性がある競合状態をトリガーする可能性がある」ため、URI接頭辞の使用は特に推奨されません。
同じページによると、HDFSは一時的なものですが(Hadoopジョブが終了すると消えます)、S3では「ファーストクラス」のファイルシステムになりました。