SlideShare a Scribd company logo
Hiveを高速化するLLAP
ヤフー株式会社
小澤 祐也
@__john_smith__
About me
• 小澤 祐也( @__john_smith__ )
• ヤフー株式会社
• データ&サイエンスソリューション統括本部
• データインフラ本部 開発2部 OSS開発
←平常時の自己紹介
アジェンダ
Hiveの復習
– MR, Tez, Spark
– Hiveの限界
LLAP(Live Long and Process)の紹介
– LLAPとは
– LLAPの特徴と動作
– LLAP vs Spark SQL
– 実行速度
LLAPの今後
アジェンダ
Hiveの復習
– MR, Tez, Spark
– Hiveの限界
LLAP(Live Long and Process)の紹介
– LLAPとは
– LLAPの特徴と動作
– LLAP vs Spark SQL
– 実行速度
LLAPの今後
LLAPその前に..
少しだけHiveについて復習
• 実行エンジン
• 利用シーン
Hiveの実行エンジン
• MapReduce
• 今でもこれを想定する人は多い
• YARN時代においてはHadoop1系に名残と言ってもよい
• Tez
• Sparkのライバル的存在として語られることも多い
• YARNでしかうごかないがHiveやPigの実行エンジンとして欠かせ
ない
• Spark
• Hive on Spark
• Not Spark SQL
• かつてSharkというものもあった…
Hiveの限界
• インタラクティブな処理には使えない
• SQL likeな記述でMRジョブを実行するために作られた
• レイテンシ < スループットな設計
• インタラクティブを求めるなら別なアーキテクチャを選択すべき?
• HiveはETLまで、分析はR, Python, Sparkなどを使う
• 元データが大きすぎる場合など
• とはいえデータの切り出し方は試行錯誤したいので高速化されると便利
Hiveの限界
とはいえ最近のHiveは速い
• 魔法のおまじない(※違います)
• SET hive.execution.engine=tez;
• カラムナ型のファイルフォーマットをサポート
• ORC(やParquet)
• 必要なDisk I/Oが減らせる
• CBO(Cost Based Optimizer)
• データの統計情報を使ったオプティマイザ
• ルールベースより効率の良い最適化がされること請け合い
• Vectorization
• SIMD命令を利用した一括処理
アジェンダ
Hiveの復習
– MR, Tez, Spark
– Hiveの限界
LLAP(Live Long and Process)の紹介
– LLAPとは
– LLAPの特徴と動作
– LLAP vs Spark SQL
– 実行速度
LLAPの今後
LLAPとは
バッチ処理では速くなったHiveをさらに高速化したい
• 扱えるデータ量はそのままよりインタラクティブに!
Hive2.0からの新機能
LLAPの基本的な思想
• Daemon
• Cache
• Multi Thread, Pipeline
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
Tez一部Vertexを
Daemon化
Daemon
• Daemonの立ち上げによる起動コストの削減
• Containerの立ち上げにはJVM起動などのコストがかかる
• Daemon化にはApache Sliderを利用
• Hadoop上でDaemonとして起動し任意のプロセスを走らせる
• StormやMemcachedなどサンプル有
• 起動コンテナ数を動的に変更可能
• Pigと同じくらい検索しづらい
Hybridな環境の実現
• TezのVertexをDaemon化するのがLLAP
• LLAP自体は実行エンジンではない
• Resource Manager上でもDaemonとジョブは別なものとして動
作
• LLAPの発想自体は他の実行エンジンでも実現可能
• TEZ-2003
• Vertexの一部にTezコンテナの外部サービスを利用
• Daemonとして立ち上げておいたコンテナを利用
• この仕組みを利用しているため現在はTezのみに対応
• Vertexの一部または全部の実行NodeでLLAPを利用
• Hiveのジョブ自体はLLAPの有無には依存しない
• 必要に応じて通常のcontainerかllapかは選択可能
LLAPとmode
LLAPによって新たに加わるmodeという概念
• 特定のVertexがどちらのmodeで動いているか
• TezのジョブをCLIが視覚的にわかりやすい
• modeという項目にcontainer/llapのどちらかが記載されている
• DAG中のどのVertexにLLAPを使うか
• hive.llap.execution.modeで設定されるmode
• LLAP deamonで動くVertex, Tezコンテナで動くVertexの設定
• none/map/auto/allがある
ModeとDaemon
M M
R
none LLAPを使わない
Tezのみと同じ
M M
R
map Mapタスクのみで
LLAPを使う
M M
R
all すべてLLAPを利用
M M
R
auto Hiveの実行計画に
任せる
ModeとDaemon
M M
R
none LLAPを使わない
Tezのみと同じ
M M
R
map Mapタスクのみで
LLAPを使う
M M
R
all すべてLLAPを利用
M M
R
auto Hiveの実行計画に
任せる
none/map/all/auto
DAG中のどのVertexに
LLAPを使うかの設定
ModeとDaemon
M M
R
none LLAPを使わない
Tezのみと同じ
M M
R
map Mapタスクのみで
LLAPを使う
M M
R
all すべてLLAPを利用
M M
R
auto Hiveの実行計画に
任せる
container/llap
各Vertexがどちらの
modeで動いているか
ModeとDaemon
M M
R
none LLAPを使わない
Tezのみと同じ
M M
R
map Mapタスクのみで
LLAPを使う
M M
R
all すべてLLAPを利用
M M
R
auto Hiveの実行計画に
任せる
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
In-Memory
Columnar Cache
Cache
LLAPのDaemon内でデータをcacheする
• Columnar cache
• In-memoryなcache機能
• データを行単位ではなく列単位でキャッシュ
• ORCファイルにのみ対応
• Columnar型のデータフォーマット
• インデックスを利用し必要な部分のみをキャッシュ
Cache
LLAPのDaemon内でデータをcacheする
• キャッシュアルゴリズム
• FIFO, LRFU
• DaemonのNodeごとにcacheを持つ
• 中央集権的な仕組みはない
• Node間での共有は行わない
• Off-Heapの利用
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
LLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
Multi Tread
Pipeline
Multi Thread, Pipeline
LLAPのDaemon内で複数のスレッドを起動
• 各スレッドがExecutorとして処理を実行
• 1デーモンあたりで複数の処理を実行可能
• Node数 * Executor数が実際に実行できる処理の並列数
• Queue
• 一般的な実行待ち行列に対する扱い
• 実行可能になったExecutorにアサインされる
• Preemption
• 長時間動きがない処理は一度諦める
• Executorにアサインされたがなんらかの理由で処理を続けられないなど
Multi Thread, Pipeline
Container
LLAP Daemon
Executor Queue
Map 1
Query
Fragment
Query
Fragment
Executor
Reduce 3
Query
Fragment
Query
Fragment
Map 2
Query
Fragment
Query
Fragment
Map 0
…
Reduce 9
…
Multi Thread, Pipeline
Container
LLAP Daemon
Executor Queue
Map 1
Query
Fragment
Query
Fragment
Executor
Reduce 3
Query
Fragment
Query
Fragment
Map 2
Query
Fragment
Query
Fragment
Map 0
…
Reduce 9
…
一つのDaemonに
複数のThread
Multi Thread, Pipeline
Container
LLAP Daemon
Executor QueueExecutor
Reduce 3
Query
Fragment
Query
Fragment
Map 2
Query
Fragment
Query
Fragment
Map 0
…
Reduce 9
…
Queueにある
次の処理を実行
Multi Thread, Pipeline
Container
LLAP Daemon
Executor Queue
Map 1
Query
Fragment
Query
Fragment
Executor
Reduce 3
Query
Fragment
Query
Fragment
Map 2
Query
Fragment
Query
Fragment
Map 0
…
Reduce 9
…
Preemptionによって
次の処理が先に実行され
る
×
改めてLLAP全体像
Container
Tez Job
Container
Tez Job
Slider
Container
LLAP
Executor
Cache
Executor
Queue
CLIやHS2から
Query発行
※AMなどは省略
Container
LLAP
Executor
Cache
Executor
Queue
LLAP vs Spark SQL
• LLAP固有の概念
• Daemon内共通で使えるcacheはSparkにはない
• Tez vs Spark
• データがメモリに乗り切らない場合はTezが有利
• 既存の資産の活用
• クエリの互換性
• HQLはSQL LikeだがSQLではない
• 分析環境への繋ぎこみではSparkが有利
• SQLだけではETL以上の処理をやるのは難しい
• R, Pythonでの分析環境との連携
• DataFrameAPIやMLlib, GraphX
• ストリーム処理
• Spark Streaming
• HiveもACIDやトランザクションに対応はしてる
LLAPの実行速度
• Hive on TezとLLAPの速度比較
• LLAPを使うとどれくらい速くなるのか
• 3回同じ処理を実行しての平均速度
• 各クエリはシーケンシャルに実行
• 設定の変更などはなし
LLAPの実行速度
• TPC-DSの結果(一部抜粋)
• ほとんどのqueryにおいてLLAPを利用した方がはやい
0
20
40
60
80
100
120
140
160
180
200
Tez	
  vs	
  LLAP
tezAVG
llapAVG
LLAPの実行速度
• その他、様々な条件でのパフォーマンステストを現在実施中
• Daemon数
• 並列数
• 各種設定の変更による影響
• キャッシュヒットの有無による影響
• クエリごとの性質に依存した影響
• etc.
アジェンダ
Hiveの復習
– MR, Tez, Spark
– Hiveの限界
LLAP(Live Long and Process)の紹介
– LLAPとは
– LLAPの特徴と動作
– LLAP vs Spark SQL
– 実行速度
LLAPの今後
LLAPの今後
実際にLLAPを使おうと思った際に課題として上がった点
• バグ周り
• 出来たばかりの機能なのでこれから使われると色々出てくるかも
• 最近もデッドロックするバグがあった[HIVE-12904]
• セキュリティ周り
• Kerberosには対応
• キャッシュされたデータの扱い
• HS2からの接続(Daemonの実行ユーザとDoAsの設定)
• Cacheの洗練, Locality
• HDFS Localityは考慮してくれる
• cache現状では個々のNodeが個別に持っている
• どこのノードがどのデータをキャッシュしてるかの考慮はなし
• そもそもDaemonが立ち上がってるNodeにデータがない場合
• Cacheアルゴリズムは適切か?
• タスクリストやWIPは[HIVE-7926]

More Related Content

Hiveを高速化するLLAP