AWS / PHP / Python ちょいメモ

amazon web service , PHP, Python を使ったときのメモ。日本語でググってもわからなかった事を中心に。

EMR利用時のURI Prefix "s3:// " と "s3n://" の違い

EMRからS3へアクセスする時に、次の2種類のURI記述方法があります。

  • s3://hogehoge...
  • s3n://hogehoge...

ふとどうやって使い分けするんだっけ?と思ったので調べてみました(どこかで、s3n://が今後推奨されるという表記を見た気がしたのですが、次の情報を読むと違うようです)。荒っぽい翻訳ですが、何かの参考になれば幸い。

公開時の情報がOSS版にだけ特化した情報となっており、EMR上の実装が考慮されていなかった為、ポストを修正しました。もし参考にしていただいた方がいましたら、不完全な情報申し訳ありませんでした。。。(2013/09/06)

EMRの場合

Note

Amazon EMR上で動作するHadoopの設定は、Apache Hadoopプロジェクトが提供する
デフォルト設定とは異なります。
Amazon EMRでは、s3n:// と s3:// の両方が、Amazon S3 ネイティブ・ファイルシステムにマップされます。
Apache Hadoopプロジェクトが提供するデフォルト設定中の s3:// は、Amazon S3 ブロック・ファイルシステムにマップされています。

とあり、Prefixはどちらを使っても、S3ネイティブとなるとのこと。

ちなみに推奨されないが s3bfs:// と指定することで、レガシーのブロック・ファイルシステムが使えて、 hdfs:// or no prefix で、

参考

こちらの情報をみて、自分の間違いに気づきました。ありがとうございます!「Apache Hadoop との差異」の箇所がとても参考になります。

OSS版の場合

Hadoopは、2種類のファイルシステムをS3向けに提供

- S3 ネイティブ ファイルシステム (URI scheme: s3n)
   これは、S3上のレギュラーファイルを読み書きするファイルシステム。このファイルシステムの有利な点は、
   S3上の他のツールで記述されたファイルにアクセスが出来ます。逆に言えば、他のツールは、
   Hadoopを使って書かれたファイルにアクセスできます。
   不利な点は、S3による5GBのファイルサイズの限界があることです。
   この理由の為、HDFSの置き換えとしては適切ではありません。
- S3 ブロック ファイルシステム (URI scheme: s3)
   S3によるブロック ベースのファイルシステム。ファイルはブロックとして保存され、
   HDFSにあるのと同じようになります。・一部訳なし・。このファイルシステムは、対象バケットを
   このファイルシステムとしてのみ使う事を必要とします - 既存のファイルを含むバケットを使ったり、
   他のファイルを対象バケットに書き込むことは出来ません。
   このファイルシステムに保存されるファイルは5GB以上が可能ですが、他のS3ツールとは相互利用が出来ません。
S3n:// の意味は 「レギュラーファイル(外の世界から読み込みができる)」 。
S3:// は、AWSストレージクラスター上のS3にマップされた、HDFSファイルシステムを参照できる。
なので、通常ファイルを使うときには 「s3n」 を使う事になる。

結論

ということで、 s3:// と明示されてない時は、自分の使い方であれば s3n:// と記述すればいいと腑に落ちました。 EMR上では、どちらを使っても同じということでした。OSS側の記述だけじゃなく、サービス提供者(今回だとAmazon)のドキュメントを、ちゃんと探して読まないとですね。