Hadoopはどのように動くのか ─並列・分散システム技術から読み解くHadoop処理系の設計と実装

第16回 並列データ処理系 Apache Tez

この記事を読むのに必要な時間:およそ 2 分

はじめに

今回は,Apache Hadoop上で動作する並列データ処理系Apache Tezについて解説します。

MapReduceの制約

本連載第13回で述べたように,Hadoop MapReduceは,MapとReduceからなる単純なインタフェースを有し,多くのデータ処理を記述できる汎用的な並列データ処理系(フレームワーク)である反面,その単純さによりいくつかの性能的な課題が存在すると考えられます。

たとえば,複雑なジョブをMapReduceで実行する場合,MapとReduceからなるMapReduceジョブを複数段連ねて実行する必要があります図1)。当該ケースにおいては,MapReduceジョブの間において,分散ファイルシステムを介したデータの入出力が行われてしまい,当該入出力は,性能の観点においてはオーバーヘッドであるため,ジョブの実行時間を長くする原因の1つとなりえます。

図1 複数のMapReduceジョブから構成される複雑な処理をMapReduce上で動作させた際の実行例

図1 複数のMapReduceジョブから構成される複雑な処理をMapReduce上で動作させた際の実行例

また,複数のMapReduceジョブの間においては,前段のMapReduceジョブが完了するまで後段のMapReduceジョブを開始することができません。このアーキテクチャでは,当然,パイプライン並列性第5回を活用するようなデータ処理方式をとることはできません。

加えて,MapReduceは一種の整列(ソート)処理フレームワークであることから第7回),必ずしも整列が必要でない処理においても整列処理をしてしまう可能性があり,当該ケースにより性能が低下する場合があります。

さらに,処理するデータ量が小さい場合においては,MapReduceジョブの起動と終了のオーバーヘッドは無視できないものとなります。

近年,MapReduceはHiveやPigを始めとするMapReduce上で動作するSQL処理系やDSLから用いられることが多く,当該ケースにおいて生成されるジョブは多くの場合複数のMapReduceジョブから構成されるため,上述のMapReduceの制約は,性能的に大きな問題となる可能性があります。

Apache Tezの概要と仕組み

Hadoop MapReduceの制約を取り払うべく,Hortonworks,Yahoo! Inc.,Twitterのエンジニアが中心となりApache Tez[1]と称される汎用的な並列データ処理系の開発が始まりました。

図2 Tezにおける図1と同じの処理の実行例

図2 Tezにおける図1と同じの処理の実行例

Apache Tezにおいては,ジョブを非循環有向グラフ(Directed Acyclic Graph,以下DAG)なるグラフ構造により表現するため図2),ジョブをMapReduceジョブの木構造で構成するMapReduce(図1)よりもジョブを直感的に記述することが可能です※1)。

Tezのジョブにおいては,グラフの頂点が処理の内容を表わし,グラフの枝が頂点間のデータの流れを表します。頂点においては,基本的には任意の処理を記述することができます。また,枝においては,頂点間のデータの移動を柔軟に記述することができます。たとえば,データをどの頂点からどの頂点に転送するかに関する設定や,頂点間の中間データをどのように永続化させるかに関する設定を記述することができます。

Tezのこのような特徴により,たとえば,複数のMapReduceジョブで構成されていたジョブを,1つのTezのジョブとして表すことができます(図2)。当然,複数のMapReduceジョブから構成されるジョブと比較して,(ジョブの記述方法によるものの)分散ファイルシステムへの入出力回数は削減され,パイプライン並列性を活用できるなど,MapReduceの制約に起因する多くの性能的な課題を改善することができます。

既存のMapReduceジョブを高速化すべく,Tezを用いたMapReduceランタイムの開発も進められています。当該実装には,たとえば以下に挙げているような,Hadoop MapReduceでは後方互換性のために加えられなかったさまざまな改良が加えられています。

  • CPUキャッシュを高効率に活用する外部ソート
  • Reducer数の動的再構成
  • 起動時のオーバーヘッドの削減
※1)
木はグラフのサブセットであるため,TezはMapReduceよりも汎用であるといえ,当然,Tezを用いてMapReduce処理系を作ることができます。DAGを利用することで,MapReduceよりも記述性が高く,かつ高速な処理を行うというアイデアは,Apache Sparkにもよく似ています。これは,Apache TezとApache Sparkの両方がMicrosoftにより提案されたDryadというシステムの影響を受けているためです[2]

おわりに

今回は,Hadoop MapReduceが有する技術的課題を概説し,当該課題を解決する1つのデータ処理系として,Apache Tezと,Tezが高速に動作する仕組みについて概要を説明しました。次回からは,Clouderaの矢野さんが,並列データ処理系であるImpalaについて解説していきます。

参考文献
[1]Apache Tez: Accelerating Hadoop Query Processing
[2]Michael Isard, Yuan Yu, Andrew Birrell, Dennis Fetterly,Dryad: Distributed Data-parallel Programs from Sequential Building Blocks, EuroSys 2007,

著者プロフィール

小沢健史(おざわつよし)

2010年日本電信電話(株)に入社。2013年度コンピュータサイエンス領域奨励賞受賞。2014年第9回日本OSS奨励賞受賞。2014年12月より Apache Hadoopコミッタとして活動中。現在,NTT ソフトウェアイノベーションセンタ所属。


山田浩之(やまだひろゆき)

日本アイ・ビー・エム株式会社を経て,ヤフー株式会社にて分散型全文検索エンジンの研究開発に従事。2008年上期未踏IT人材発掘・育成事業において高性能分散型検索エンジンの開発によりスーパークリエータに認定。現在は東京大学生産技術研究所にて高性能並列データ処理系の研究開発に従事。博士(情報理工学)。

著書に『検索エンジン自作入門』。

コメント

コメントの記入