@fumito_itoのHadoopブログ

Windows向けのHadoopディストリビューションについて書いていきます。現在のところはApache Hadoop on Azure CTPがメイン。リリースされ次第、Apache Hadoop for Windows Serverについても書く予定。

Hadoop on AzureとBlob Storageを接続した時のsplit sizeの扱い

Hadoop on AzureではHadoopで処理するデータをAzure BlobやAmazon S3上から取得することができます。
オンデマンドで利用するというサービスの性質上、これは非常に有用な機能なのですが、HDFS上に置いたファイルを取得する場合と少し動きが違ってくるので注意が必要です。

何が違うのか?

具体的に言うとファイルをノードに分配する際の分割ルールが違います。

  • HDFS上にファイルが置かれている場合、HDFSのブロックサイズ(デフォルト 64MB)で分割する
  • Azure Blob上にファイルが置かれている場合、ファイルの数で分割する

たとえば1GBのファイルをHDFS上とAzure Blob上においてそれぞれ処理した場合を考えてみましょう。

  • HDFS上に置かれたファイルはブロックサイズごとに分割されてMapタスクに渡されるので、15個くらいのノードがMapジョブを実行します。
  • 一方でAzure Blob上に置かれたファイルは分割されませんのでMapタスクが一つだけしか起動されません。

これでは分散処理をしている意味が全然無いですね。Azure Blob上にあるファイルを処理する場合は、適切なサイズにファイルを分割しておくように配慮する必要があります。