MapReduceの次世代について

The Next Generation of Apache Hadoop MapReduce( http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/ ) の和訳です。自分めもなので結構適当です。

最初に

膨大なデータを利用する際は小さいクラスタを多数利用するよりも少ないけど大きなクラスタを利用した方がより安価に利用できます。大きなクラスタは利用する際は大きなデータを利用する事はもちろんより多くのjobやユーザをサポートする必要があります。

MapReduceは現状4,000台ほどのサーバにスケールアウト可能です。次世代のMapReduceは共通のResourceスケジューラを持ち、ジョブごとにアプリケーションの実行管理をユーザが定義したコンポーネントを利用して行う事ができるようにしようと考えています。スケールする際のダウンタイムはユーザにとって大きなコストになるため、起動した時点で常に高可用性を提供できるようにしようとしています。

これらにより大きなクラスタ上でユーザにセキュリティとマルチテナントを提供する事が可能になります。

このアーキテクチャはより革新的で早く、そしてハードウェアの使用率を向上できるでしょう。

背景

現状のMapReduceの概要をもう一度言及しておきましょう。

クラスタのサイズと負荷を監視するため、JobTrackerはメモリ使用率はスレッドモデル、信頼性やパフォーマンスを徹底的に監視します。ここ5年この仕様に関してはかえずにきましたが違う部分ではframeworkに変更を加えています。この仕様については以下のURLにドキュメントを添付していますので見ていただければと思います。(https://issues.apache.org/jira/browse/MAPREDUCE-278)
ユーザからの意見から、MapReduceはバグフィックス、パフォーマンス向上、そして新しい機能をマイナーもしくはメジャーバージョンアップすることで対応してきました。これらを続けていくと最悪、バージョンアップを引き金にユーザが利用しているアプリケーションが動かなくなり、修正に大きなコストが必要になるでしょう。

次世代MapReduceの原則

MapReduceを改良していく際、様々な要求を必要とされていることを常に意識しています。特に意識する事は以下の事柄です。

  • 信頼性
  • 可用性
  • スケーラビリティ(10,000台のサーバで20,000core持っていても動くように)
  • 互換性(現状動いているアプリケーションが動くように)
  • 進化
  • 遅延時間の計測(ユーザがわかるように)
  • クラスタ構成で利用できるように

次に意識しているのが以下のことです。

  • MapReduceに利用するプログラムの互換性
  • ちょっとしたサービスの提供

上記の特徴をふまえて、Hadoop上でデータを扱う設計をもう一度考えていきます。
事実この再設計は大体かたまりつつあります。詳しくは以下のチケットを見てください。(https://issues.apache.org/jira/browse/MAPREDUCE-279)

次世代MapReduce

次に考えているJobTrackerは主にジョブをスケージューリングする機能とモニタリングする機能の二つに分割されます。ResourceManagerは全体のアプリケーション群を管理します。各アプリケーションはApplicationManagerを持ち、それぞれのスケジュールや状態を管理します。
アプリケーションは従来のMapReduceの一つのjobかDAG(directed-acyclic graph)のどちらかを意味します。ResourceManager及び各サーバ上でユーザプロセスを監視しているNodeMangerは各jobの構成を作り出します。
ApplciationManagerはフレームワーク上の特異ライブラリでありResourceManagerからリソースを取得し、NodeManagerと一緒に実行する事でモニタリングしながらタスクを実行することができます。ResourceManagerは階層的なキューを持ちクラスタはキューを利用して資源の割当を行う事ができます。このキューはアプリケーションの状態やパフォーマンスのモニターを行わない事から純粋なスケジューラとして扱われます。また、このキューはハードウェアの故障やアプリケーションの失敗でジョブが失敗したときに再度実行する保証はありません。

ResourceManagerは各アプリケーションの要求によってジョブをスケジューリングします。各アプリケーションは複数のResourceRequestTypeを持っており、それをコンテナに要求します。ResourceRequestにはメモリやCPUやディスク,ネットワークなどが含まれます。これは今までのMapReduceとは大きな違う点です。ResourceManagerはプラグインでスケジューラを持っています。現在はデフォルトのスケジューラ以外にFairスケジューラとCapacityスケジューラがあります。
アプリケーションに一つあるApplicationMasterはスケジューラからResourceを要求したり、タスクを設定したり、ステータスを見たり、モニタリングしたり、エラー時のハンドリングを実施します。

現状のMapREduceからの改善点