Hive on Spark
の設計指針を読
んでみた
Yu Ishikawa
2014-07-24
はじめに
 Apache Hive の実行エンジンとして Spark に
対応する機能が開発中
 [HIVE-7292] Hive on Spark - ASF JIRA
 https://issues.apache.org/jira/browse/HIVE-7292
 2014-06-25 に Hive on Spark の設計指針など
が, Cloudera 社の Xuefu Zhang らによって
公開された
Table of Contents
 Hive on Spark の導入
 高レベルの機能性の解説
 高レベルの設計概要
 各コンポーネントの解説
 まとめ
Hive on Spark の導入
Hive on Spark の目的
 (Hadoop) MapReduce, Tez につづいて第3の
Hive 実行エンジンとして Spark に対応させる
 Spark とはHadoop MapReduce より高速に処
理できるオープンソースのデータ分析分散処理
フレームワーク
 Spark は Resilient Distributed Dataset (RDD) と
いうデータコレクションでデータを表現
Motivation: 実装する動機
 すでに Spark を利用しているユーザとっては,
処理環境が標準化されることでオペレーショ
ン的なコスト削減
 SQL on Hadoop として,Hive を Spark ユー
ザに提供
 Hive on Tez のようにパフォーマンスの向上
設計指針:Design Principle
 既存の Hive のコードには影響を(可能な限
り)与えない
 現在 MapReduce と Tez の実行エンジンを簡
単に切り替えられるように,Spark も簡単に
切り替えられる
 Spark への特別な対処をする必要することな
く,既存の MapReduce や Tez の処理と共通
化できるところは最大限共通化
 Hive 側の拡張に対して,Hive on Spark の部
分も自動的に対応されるような実装
Shark や Spark SQL との比較
 Hive on Spark は,すべての Hive の特徴を Spark の実
行エンジンでも利用可能にする
 Hive QL, 認証, モニタリング, 監視 など
 Shark
 Hive で生成されたクエリプランを Spark で実行できる
ように変換
 Spark SQL
 SQL-like (Hive QL も含む)を Spark アプリケーション
で実行できるようにするためのパーサ
 Hive のように対話的に使うというより,Scala のコー
ドの中で利用
高レベルの機能性の解説
Hive の実行エンジンとして Spark を指定
する方法
 デフォルト:mr (MapReduce)
 もし Spark を実行する環境がないときは,MapReduce
か Tez を実行
 Spark 用に Hive QL を一切変更することなく実行できる
ように実装する
 Spark にジョブを投げるには,MapReduce の用に実行
する Spark クラスタの URI などを設定
hive> set hive.execution.engine=spark;
その他実装するにあたっての要件
 “explain” による実行計画の表示
 MapReduce での Hive 実行のように,処理の
進行状況のフィードバック
 ジョブの統計や診断法の提供
高レベルの設計概要
実装にあったっての機能分類
 Query planning
 Hive QL の意味解析により Hive のオペレータ
プランが Spark で実行できるタスクプランに変
換
 Query execution
 生成された Spark のタスクプランが実際に
Spark クラスタで実行
Query Planning(1)
 Operator Plan は,TableScanOperator,
ReduceSink, FileSink,
GroupByOperator などの論理オペレータ
のグラフで構成
HiveQL
Operator
plan
Hive Semantic Analzer
Graph of
MapReduceTask
MapReduceCompiler
Query Planning(2)
 SparkCompiler は Hive の論理オペレータプラ
ンから Spark で実行できるプランにコンパイル
 ジョブとして実行できる形として SparkWork の
インスタンスを作る
 SparkWork は Spark のタスクの実行プランを表
現
 実行計画の最適化はつぎのフェーズにして,まず
は機能を実装することに専念
HiveQL
Operator
plan
Hive Semantic Analzer
Graph of SparkTask
SparkCompiler
Job Execution
 SparkCompiler によって生成された
SparkTask のインスタンスは,Hive のタス
ク実行フレームワークで MapReduce と同様
に実行できる
 Spark にジョブが投げられたら,ジョブの実
行状況をモニタリングできる仕組みを
SparkListener として実装
特筆すべき各コンポーネン
トの解説
採用する基本原則は?
 Spark 側の SQL 解析を利用するのではなく,
MapReduce の機構を利用
 Spark の操作は Spark 側が公開している Java
API で対応
 Spark で実行できるように MapReduce 側の
基本原則を拡張
Table as RDD
 Hive テーブルを Spark のデータ形式である
RDD として扱えるように実装
 現時点でも HDFS のデータを扱える RDD が
あるので,それを Hive に特化した形で拡張
する必要がある
 Scala として拡張するのは簡単だが,Java
API として扱えるようにはなっていないので
課題
SparkWork と SparkTask
 SparkWork は SparkTask から利用
 SparkWork は Spark ジョブを実行し続ける
ためのタスクプランを表現
 SparkWork は,MapWork と ReduceWork
(たまに UnionWork)で構成
Shuffle, Group, and Sort
 Spark は,partitionBy, groupByKey,
sortByKey などのような MapReduce の
Shuffle を簡単にするための API があるのでそ
れを利用して group by や sort by を実装
 Hive QL の JOIN 句についても,Spark の join
API を利用することで実装
まとめ
Hive on Spark を実装するにあたって必要
そうな作業
 Spark のジョブモニタリング Java APIs
 SparkContext をスレッドセーフにする
 シャッフルの機能性や API の改修
 RDD を Hive テーブルで扱えるようにするた
めの Java API の実装
実装のすすめ方
 いくつかのフェーズに分けて実装を進めてい
く
 まずは基本的な機能の実装
 その後に最適化や改良を行っていく
 Hive on Spark を進めていくには,Hive コ
ミュニティと Spark コミュニティが密に連携
を取っていく必要がある

Hive on Spark の設計指針を読んでみた

  • 1.
  • 2.
    はじめに  Apache Hiveの実行エンジンとして Spark に 対応する機能が開発中  [HIVE-7292] Hive on Spark - ASF JIRA  https://issues.apache.org/jira/browse/HIVE-7292  2014-06-25 に Hive on Spark の設計指針など が, Cloudera 社の Xuefu Zhang らによって 公開された
  • 3.
    Table of Contents Hive on Spark の導入  高レベルの機能性の解説  高レベルの設計概要  各コンポーネントの解説  まとめ
  • 4.
    Hive on Sparkの導入
  • 5.
    Hive on Sparkの目的  (Hadoop) MapReduce, Tez につづいて第3の Hive 実行エンジンとして Spark に対応させる  Spark とはHadoop MapReduce より高速に処 理できるオープンソースのデータ分析分散処理 フレームワーク  Spark は Resilient Distributed Dataset (RDD) と いうデータコレクションでデータを表現
  • 6.
    Motivation: 実装する動機  すでにSpark を利用しているユーザとっては, 処理環境が標準化されることでオペレーショ ン的なコスト削減  SQL on Hadoop として,Hive を Spark ユー ザに提供  Hive on Tez のようにパフォーマンスの向上
  • 7.
    設計指針:Design Principle  既存のHive のコードには影響を(可能な限 り)与えない  現在 MapReduce と Tez の実行エンジンを簡 単に切り替えられるように,Spark も簡単に 切り替えられる  Spark への特別な対処をする必要することな く,既存の MapReduce や Tez の処理と共通 化できるところは最大限共通化  Hive 側の拡張に対して,Hive on Spark の部 分も自動的に対応されるような実装
  • 8.
    Shark や SparkSQL との比較  Hive on Spark は,すべての Hive の特徴を Spark の実 行エンジンでも利用可能にする  Hive QL, 認証, モニタリング, 監視 など  Shark  Hive で生成されたクエリプランを Spark で実行できる ように変換  Spark SQL  SQL-like (Hive QL も含む)を Spark アプリケーション で実行できるようにするためのパーサ  Hive のように対話的に使うというより,Scala のコー ドの中で利用
  • 9.
  • 10.
    Hive の実行エンジンとして Sparkを指定 する方法  デフォルト:mr (MapReduce)  もし Spark を実行する環境がないときは,MapReduce か Tez を実行  Spark 用に Hive QL を一切変更することなく実行できる ように実装する  Spark にジョブを投げるには,MapReduce の用に実行 する Spark クラスタの URI などを設定 hive> set hive.execution.engine=spark;
  • 11.
    その他実装するにあたっての要件  “explain” による実行計画の表示 MapReduce での Hive 実行のように,処理の 進行状況のフィードバック  ジョブの統計や診断法の提供
  • 12.
  • 13.
    実装にあったっての機能分類  Query planning Hive QL の意味解析により Hive のオペレータ プランが Spark で実行できるタスクプランに変 換  Query execution  生成された Spark のタスクプランが実際に Spark クラスタで実行
  • 14.
    Query Planning(1)  OperatorPlan は,TableScanOperator, ReduceSink, FileSink, GroupByOperator などの論理オペレータ のグラフで構成 HiveQL Operator plan Hive Semantic Analzer Graph of MapReduceTask MapReduceCompiler
  • 15.
    Query Planning(2)  SparkCompilerは Hive の論理オペレータプラ ンから Spark で実行できるプランにコンパイル  ジョブとして実行できる形として SparkWork の インスタンスを作る  SparkWork は Spark のタスクの実行プランを表 現  実行計画の最適化はつぎのフェーズにして,まず は機能を実装することに専念 HiveQL Operator plan Hive Semantic Analzer Graph of SparkTask SparkCompiler
  • 16.
    Job Execution  SparkCompilerによって生成された SparkTask のインスタンスは,Hive のタス ク実行フレームワークで MapReduce と同様 に実行できる  Spark にジョブが投げられたら,ジョブの実 行状況をモニタリングできる仕組みを SparkListener として実装
  • 17.
  • 18.
    採用する基本原則は?  Spark 側のSQL 解析を利用するのではなく, MapReduce の機構を利用  Spark の操作は Spark 側が公開している Java API で対応  Spark で実行できるように MapReduce 側の 基本原則を拡張
  • 19.
    Table as RDD Hive テーブルを Spark のデータ形式である RDD として扱えるように実装  現時点でも HDFS のデータを扱える RDD が あるので,それを Hive に特化した形で拡張 する必要がある  Scala として拡張するのは簡単だが,Java API として扱えるようにはなっていないので 課題
  • 20.
    SparkWork と SparkTask SparkWork は SparkTask から利用  SparkWork は Spark ジョブを実行し続ける ためのタスクプランを表現  SparkWork は,MapWork と ReduceWork (たまに UnionWork)で構成
  • 21.
    Shuffle, Group, andSort  Spark は,partitionBy, groupByKey, sortByKey などのような MapReduce の Shuffle を簡単にするための API があるのでそ れを利用して group by や sort by を実装  Hive QL の JOIN 句についても,Spark の join API を利用することで実装
  • 22.
  • 23.
    Hive on Sparkを実装するにあたって必要 そうな作業  Spark のジョブモニタリング Java APIs  SparkContext をスレッドセーフにする  シャッフルの機能性や API の改修  RDD を Hive テーブルで扱えるようにするた めの Java API の実装
  • 24.
    実装のすすめ方  いくつかのフェーズに分けて実装を進めてい く  まずは基本的な機能の実装 その後に最適化や改良を行っていく  Hive on Spark を進めていくには,Hive コ ミュニティと Spark コミュニティが密に連携 を取っていく必要がある