1000台規模のHadoopクラスタを
Hive/Tezアプリケーションにあわせて
パフォーマンスチューニングした話
Rejected  HCJ  2016
http://www.yahoo.co.jp/
ヤフー株式会社
杉⼭山 朋広/畑間 啓哉/藤本 謙志/鄭 輝/深澤 開/⽇日⽐比野 哲也/古⼭山 慎悟
2016年年2⽉月13⽇日
このセッションについて
ヤフーの広告⽤用Hadoopクラスタ(773台構成)で発⽣生した性能
上のさまざまな問題と、それらを解決するまでの試⾏行行錯誤の
過程、効果があったチューニングパラメータをご紹介します
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 2
広告レポートについて
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 3
要求は1時間あたり 100,000  Query
テーブル(最⼤大)
• 30  億⾏行行 /  1⽇日
• 7,000  億⾏行行 /  13  ヶ⽉月
• 7  TB  /  13  ヶ⽉月
Query
• 平均処理理時間 30  秒前後
• 必ず⼩小さなテーブルとのJOINが発⽣生する
その他
• Daily,Weekly登録されたジョブが、データ更更新後⼀一気に流流れる
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 4
2016/01/20(⽔水)
2016/01/21(⽊木)
2016/01/22(⾦金金)
2016/01/25(⽉月)
2016/01/26(⽕火)  
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 5
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木)
2016/01/22(⾦金金)
2016/01/25(⽉月)
2016/01/26(⽕火)  
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/20(⽔水) 問題の発覚
Slaveノード数 725 nodes
クラスタメモリ 70 TB
Hiveserverノード数 3  nodes
ソフトウェアバージョン HDP2.3.0
Hadoop 2.7.1
Hive 1.2.1
Tez 0.7.0
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 6
リソースは⼗十分・ソフトウェアも最新!
2016/01/20(⽔水) 問題の発覚
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 7
スループットを稼ぐための新機能も⼊入れた!
Hiveの実⾏行行エンジンをTezへ
• hive.execute.engine =  tez
Tezセッションの再利利⽤用
• tez.session.am.dag.submit.timeout.secs = 120
• Hiveserver2のconnectionを維持すること
Tezコンテナの再利利⽤用
• tez.am.container.reuse.enabled =  true
AM AM AM AM AM AM
client
client
client
client
client
client
HS2HS2 HS2Tez session
Tez container
01/20(⽔水) 問題の発覚
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 8
独⾃自のベンチマークツールを作成
ベンチマークツール
• 今回のテストのために独⾃自に作成
• 指定した数のスレッドが起動して、並列列にSQLを実⾏行行
• SQLのサンプルをあらかじめ保存
• Javaで作成
SQL
HS2d
thread
thread
thread
thread
thread
thread
SQL
SQL
SQL
SQL
SQL
SQL
SQL
SQL
Benchmark
process
Sample  directory
01/20(⽔水) 問題の発覚
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 9
いざテスト!しかし性能出ず・・・
1時間あたりSQL実⾏行行数
• 7,000 Query/hour
• 要求の10分の1
主な問題
• クエリの並列列度度を引き上げても途中で頭打ち
• Hadoopクラスタはスカスカ
• Hiveserver2もスカスカ
ヤバイ。。。
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 10
設計
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金)
2016/01/25(⽉月)
2016/01/26(⽕火)  
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/21(⽊木) スタート!
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 11
対応チーム結成
ビジネスサイドへテスト結果を報告
• 対応期限が1⽉月いっぱいであることを告げられる
以下の3チームから⼈人選
• 広告アプリケーションチーム
• Hadoopインフラチーム
• Hive開発チーム
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 12
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック①
2016/01/25(⽉月)
2016/01/26(⽕火)  
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/22(⾦金金) ボトルネック①(1/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 13
並列列度度に関わる設定を⾒見見直し
項⽬目 変更更前 変更更後
yarn.scheduler.minimum-‐‑‒allocation-‐‑‒mb 1.7 GB 1.7  GB
hive.tez.container.size 2  GB 1.7  GB
最⼤大同時実⾏行行コンテナ数 約 21,000 約 43,000
最⼤大同時実⾏行行App数(=SQL数) 約 2,100 約 4,300
条件
• 1クエリあたりの平均コンテナ数:10
• クラスタメモリ:7,300  GB
• コンテナサイズはyarn.scheduler.minimum-‐‑‒allocation-‐‑‒mbの整数倍
2016/01/22(⾦金金) ボトルネック①(2/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 14
Hiveserver2のボトルネックを発⾒見見
HS2の接続数に対してAMが少ない
• 通常、HS2の1接続につき、1つのAMが起動
• 接続数1,000に対して、500くらいしかAMが起動しない
hive.server2.thrift.max.worker.threads
• Hiveserver2のリクエスト受付側のスレッド数
• いじっても変化なし
• クライアントからのリクエストは受け付けている
• 受け付けたリクエストをResourceManagerに渡せてないと判断
2016/01/22(⾦金金) ボトルネック①(3/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 15
Metastoreデータベースを直接参照
Hiveserver2の仕事
• Metastoreの情報取得
• クエリのコンパイルと結果セットの集約
hive.metastore.uris
• HDPでは空⽂文字列列指定(DB直接接続)を推奨
• MetastoreAPIを使うようにカスタマイズしていたのが裏裏⽬目に
Hiveserver2の接続数が上昇
• 20,000  Query/hour に到達
ここまでの成果
16Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 17
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック②
2016/01/26(⽕火)  
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/25(⽉月)  ボトルネック②(1/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 18
ResourceManagerのボトルネックを発⾒見見
Hiveserver2→Metastoreのボトルネックが解消
• Hiverserver2のリソースが使われ始める
• しかし、リクエスト数に対して、まだAMが少ない
⼤大量量のPendingAppsが発⽣生
• HS2の接続数が増えていくと、PendingステータスのAppが多発
• RMが効率率率よくAMを起動できてないかもしれない
2016/01/25(⽉月)  ボトルネック②(2/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 19
TimelineServerの利利⽤用を停⽌止
YARN  TimelineServer
• YARNアプリケーションのログやstatisticsを保管
• ローカルのleveldbを使うため、ボトルネックになりやすい
従来のHistoryServerの使⽤用も可能
• tez.history.logging.service.class =
org.apache.tez.dag.history.logging.impl.SimpleHistoryLoggingService
• HDFSの負荷があがることに注意
2016/01/25(⽉月)  ボトルネック②(3/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 20
ApplicationMasterの起動効率率率の向上
⼤大量量のAM起動中にPendingが発⽣生
• PendingステータスのAMが多いことに気づく
yarn.resourcemanager.amlauncher.thread-‐‑‒count
• RMがAMを起動する時に使うスレッドの数
• 50(デフォルト)→200に引き上げ
結果
• 22,000 Query/hour
• 思ったより効果出ず。。
ここまでの成果
21Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 22
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック② RM
2016/01/26(⽕火)  ボトルネック③
2016/01/27(⽔水)
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/26(⽕火)  ボトルネック③(1/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 23
ResourceManagerのボトルネックが継続
Pendingステータスのコンテナが多発
• ⼤大量量のAMに対して、コンテナが少なすぎることに気付く
• コンテナの起動に関わる設定を模索索
2016/01/26(⽕火)  ボトルネック③(2/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 24
コンテナの起動速度度を最適化
プロパティ default 変更更後
tez.am.am-‐‑‒rm.heartbeat.interval-‐‑‒ms.max 250 1500
yarn.resourcemanager.
nodemanagers.heartbeat-‐‑‒interval-‐‑‒ms
2000 1000
HeartBeat間隔を調整し、RMへの要求伝達を効率率率化
コンテナ起動が効率率率よくなり、再びHS2がボトルネックに
2016/01/26(⽕火)  ボトルネック③(3/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 25
再びHiveserver2のボトルネックを発⾒見見
Hiveserver2の特徴
• クエリのコンパイルや結果セットの集約を⾏行行うので
並列列度度が⾼高いとボトルネックになりやすい
Hiveserver2を3ノードから10ノードへ増設
• 46,000 Query/hour に到達
• 少し効果が出てきた
ここまでの成果
26Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 27
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック② RM
2016/01/26(⽕火)  ボトルネック③ AM
2016/01/27(⽔水) ボトルネック④
2016/01/28(⽊木)  
2016/01/29(⾦金金)
2016/01/27(⽔水) ボトルネック④(1/2)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 28
再びResourceManagerがボトルネックへ
並列列数を引き上げ
• 現段階で考えられるボトルネックが解消
• 並列列数を256から段階的に引き上げ
1,000並列列前後で性能が頭打ち
• ResourceManagerが⾼高負荷になっていることを発⾒見見
2016/01/27(⽔水) ボトルネック④(2/2)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 29
ResourceManagerのヒープサイズ引き上げ
⼤大量量のAM実⾏行行によりRMが⾼高負荷に
• RMのメモリ使⽤用率率率が上昇
• テスト中にフルGC→Failover
RMのヒープを調整しフルGCを回避
• HDPはAmbariから調整
• 86,000 Query/hourに到達
• あとひと息!
ここまでの成果
30Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 31
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック② RM
2016/01/26(⽕火)  ボトルネック③ AM
2016/01/27(⽔水) ボトルネック④ コンテナ
2016/01/28(⽊木)  ボトルネック⑤
2016/01/29(⾦金金)
2016/01/28(⽊木)  ボトルネック③(1/3)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 32
HDFSのボトルネックを発⾒見見
著しくパフォーマンスが悪いSQLを発⾒見見
• 同じSQLを再実⾏行行すると速い
• 構⽂文やデータ構造の問題でない
⼤大量量のAppから同じDatanodeへアクセス集中
• DatanodeのConnection  Timeout
• その他不不明なHDFSアクセスエラー
2016/01/28(⽊木) ボトルネック⑤
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 33
Datanodeのビジーを解消
HDFSのReplicationFactorを引き上げることでbusyを回避
• ReplicationFactor:3(Default) → 10
• hadoop fs –setrep 10 /user/hive/warehouse/...
• hive> set  dfs.replication=10;
2016/01/28(⽊木) ボトルネック⑤
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 34
Namenodeのチューニンング
⼤大量量のAM終了了時にNamenodeがダウン
• AM終了了時のJobHistoryの⼤大量量書き込みが原因
Namenodeスレッド数の調整
• dfs.namenode.handler.count -‐‑‒>  40
HDFSユーザのnofile引き上げ
• too many open filesエラーが発⽣生
• nofileを1,280,000へ引き上げ
• Ambariから調整
ここまでの成果
35Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 36
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック② RM
2016/01/26(⽕火)  ボトルネック③ AM
2016/01/27(⽔水) ボトルネック④ コンテナ
2016/01/28(⽊木)  ボトルネック⑤ HDFS
2016/01/29(⾦金金)
2016/01/29(⾦金金)
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 37
スイートスポットの探索索
768並列列以降降は、DNのネックで頭打ち
サンプル数を増やして実測値でも100,000qphをクリア!
並列列数 60,000SQLの処理理時間 1時間あたり換算
512 2,508  sec 86,106  qph
768 2,289  sec 94,354  qph
1,024 2,514  sec 85,899  qph
2,560 3,106  sec 69,541  qph
⽬目標達成!!!
38Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止
0  
20,000  
40,000  
60,000  
80,000  
100,000  
120,000  
1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016
SQL/Hour
実測値(最⼤大) ⽬目標
アジェンダ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 39
2016/01/20(⽔水) 問題の発覚
2016/01/21(⽊木) スタート!
2016/01/22(⾦金金) ボトルネック① MetastoreServer
2016/01/25(⽉月) ボトルネック② RM
2016/01/26(⽕火)  ボトルネック③ AM
2016/01/27(⽔水) ボトルネック④ コンテナ
2016/01/28(⽊木)  ボトルネック⑤ HDFS
2016/01/29(⾦金金) ⽬目標達成!
おまけ
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 40
その他効果があったと思われるパラメータ(1/5)
Reuse  on/off
• tez.am.container.reuse.rack-‐‑‒fallback.enabled=true
=>  同じrackのcontainerをreuseする設定
• tez.am.container.reuse.non-‐‑‒local-‐‑‒fallback.enabled=true  
=>  rack外のcontainerをreuseする設定
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 41
reuseまわり
その他効果があったと思われるパラメータ( 2/5 )
Containerの保持期間を調整
• tez.am.session.min.held-‐‑‒containers=10
• tez.am.container.idle.release-‐‑‒timeout-‐‑‒max.millis=5000
• tez.am.container.idle.release-‐‑‒timeout-‐‑‒min.millis=2000
Containerのreuseが効果を維持するため
• tez.session.am.dag.submit.timeout.secs=120
=>  次のクエリが来る間隔以上で設定しておく必要がある
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 42
reuseまわり
その他効果があったと思われるパラメータ( 3/5 )
clientの接続数が多い場合は、以下を引き上げる
• hive.server2.thrift.min.worker.threads=5   -‐‑‒>  100  
• hive.exec.parallel.thread.number=8   -‐‑‒>  32
Join最適化
• hive.auto.convert.join.noconditionaltask.size=209715200
• hive.auto.convert.join=true
=>  メモリ上にのるデータならMapフェーズでJoinしStageがひとつ減る
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 43
Hiveserver2まわり
その他効果があったと思われるパラメータ( 4/5 )
node  localityの変更更
• yarn.scheduler.capacity.node-‐‑‒locality-‐‑‒delay=-‐‑‒1   -‐‑‒>  26
RMとATSの通信削減
• yarn.resourcemanager.system-‐‑‒metrics-‐‑‒publisher.enabled=false
=>  もし使ってなければ、falseにして無駄な通信を無くしたほうがいい
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 44
etc
その他効果があったと思われるパラメータ(5/5)
Pre-‐‑‒warm
• hive.prewarm.enabled=true
• hive.prewarm.numcontainers=25
• hive.server2.tez.sessions.per.default.queue=96
• hive.server2.tez.default.queues=queue_̲name
=>  今回は、DoASを有効にしているので使いませんでした。
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 45
etc
最後に
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 46
反省省点
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 47
⼤大規模環境からくる慢⼼心
サーバがたくさんあるからと安⼼心していた
• 700ノードもあるから⼤大丈夫だろうと⾼高を括っていた
• スレーブノードが増えれば、HDFSやYARNの基本的な設定も⾒見見直すべき
チーム間の連携
• クラスタ本体とHiveの設定の担当が別チームで設計の整合性が⽋欠如
• ⼤大きなクラスタを⼤大きな組織で運営する問題
収穫
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 48
⼤大規模環境の運営で培った⼒力力が活きた
YARNやHDFSのノウハウが通⽤用する
• HiveやTezなどベーシックなエコシステムを利利⽤用
• YARNやHDFSの経験を積んだ⼈人材が育っていた
短期間に各領領域の専⾨門家が集結
• 設計時は複数チームの意思疎通がまずかったが、
それぞれの領領域の専⾨門家が集まることで短期間に問題を解決できた
• この中には当社のHiveコントリビュータもいて、⼒力力強い助っ⼈人になった
EOP
Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 49

1000台規模のHadoopクラスタをHive/Tezアプリケーションにあわせてパフォーマンスチューニングした話

  • 1.
  • 2.
  • 3.
    広告レポートについて Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 3 要求は1時間あたり 100,000  Query テーブル(最⼤大) • 30  億⾏行行 /  1⽇日 • 7,000  億⾏行行 /  13  ヶ⽉月 • 7  TB  /  13  ヶ⽉月 Query • 平均処理理時間 30  秒前後 • 必ず⼩小さなテーブルとのJOINが発⽣生する その他 • Daily,Weekly登録されたジョブが、データ更更新後⼀一気に流流れる
  • 4.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 4 2016/01/20(⽔水) 2016/01/21(⽊木) 2016/01/22(⾦金金) 2016/01/25(⽉月) 2016/01/26(⽕火)   2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 5.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 5 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) 2016/01/22(⾦金金) 2016/01/25(⽉月) 2016/01/26(⽕火)   2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 6.
    2016/01/20(⽔水) 問題の発覚 Slaveノード数 725nodes クラスタメモリ 70 TB Hiveserverノード数 3  nodes ソフトウェアバージョン HDP2.3.0 Hadoop 2.7.1 Hive 1.2.1 Tez 0.7.0 Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 6 リソースは⼗十分・ソフトウェアも最新!
  • 7.
    2016/01/20(⽔水) 問題の発覚 Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 7 スループットを稼ぐための新機能も⼊入れた! Hiveの実⾏行行エンジンをTezへ • hive.execute.engine =  tez Tezセッションの再利利⽤用 • tez.session.am.dag.submit.timeout.secs = 120 • Hiveserver2のconnectionを維持すること Tezコンテナの再利利⽤用 • tez.am.container.reuse.enabled =  true AM AM AM AM AM AM client client client client client client HS2HS2 HS2Tez session Tez container
  • 8.
    01/20(⽔水) 問題の発覚 Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 8 独⾃自のベンチマークツールを作成 ベンチマークツール • 今回のテストのために独⾃自に作成 • 指定した数のスレッドが起動して、並列列にSQLを実⾏行行 • SQLのサンプルをあらかじめ保存 • Javaで作成 SQL HS2d thread thread thread thread thread thread SQL SQL SQL SQL SQL SQL SQL SQL Benchmark process Sample  directory
  • 9.
    01/20(⽔水) 問題の発覚 Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 9 いざテスト!しかし性能出ず・・・ 1時間あたりSQL実⾏行行数 • 7,000 Query/hour • 要求の10分の1 主な問題 • クエリの並列列度度を引き上げても途中で頭打ち • Hadoopクラスタはスカスカ • Hiveserver2もスカスカ ヤバイ。。。
  • 10.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 10 設計 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) 2016/01/25(⽉月) 2016/01/26(⽕火)   2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 11.
    2016/01/21(⽊木) スタート! Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 11 対応チーム結成 ビジネスサイドへテスト結果を報告 • 対応期限が1⽉月いっぱいであることを告げられる 以下の3チームから⼈人選 • 広告アプリケーションチーム • Hadoopインフラチーム • Hive開発チーム
  • 12.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 12 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① 2016/01/25(⽉月) 2016/01/26(⽕火)   2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 13.
    2016/01/22(⾦金金) ボトルネック①(1/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 13 並列列度度に関わる設定を⾒見見直し 項⽬目 変更更前 変更更後 yarn.scheduler.minimum-‐‑‒allocation-‐‑‒mb 1.7 GB 1.7  GB hive.tez.container.size 2  GB 1.7  GB 最⼤大同時実⾏行行コンテナ数 約 21,000 約 43,000 最⼤大同時実⾏行行App数(=SQL数) 約 2,100 約 4,300 条件 • 1クエリあたりの平均コンテナ数:10 • クラスタメモリ:7,300  GB • コンテナサイズはyarn.scheduler.minimum-‐‑‒allocation-‐‑‒mbの整数倍
  • 14.
    2016/01/22(⾦金金) ボトルネック①(2/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 14 Hiveserver2のボトルネックを発⾒見見 HS2の接続数に対してAMが少ない • 通常、HS2の1接続につき、1つのAMが起動 • 接続数1,000に対して、500くらいしかAMが起動しない hive.server2.thrift.max.worker.threads • Hiveserver2のリクエスト受付側のスレッド数 • いじっても変化なし • クライアントからのリクエストは受け付けている • 受け付けたリクエストをResourceManagerに渡せてないと判断
  • 15.
    2016/01/22(⾦金金) ボトルネック①(3/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 15 Metastoreデータベースを直接参照 Hiveserver2の仕事 • Metastoreの情報取得 • クエリのコンパイルと結果セットの集約 hive.metastore.uris • HDPでは空⽂文字列列指定(DB直接接続)を推奨 • MetastoreAPIを使うようにカスタマイズしていたのが裏裏⽬目に Hiveserver2の接続数が上昇 • 20,000  Query/hour に到達
  • 16.
    ここまでの成果 16Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 17.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 17 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② 2016/01/26(⽕火)   2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 18.
    2016/01/25(⽉月)  ボトルネック②(1/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 18 ResourceManagerのボトルネックを発⾒見見 Hiveserver2→Metastoreのボトルネックが解消 • Hiverserver2のリソースが使われ始める • しかし、リクエスト数に対して、まだAMが少ない ⼤大量量のPendingAppsが発⽣生 • HS2の接続数が増えていくと、PendingステータスのAppが多発 • RMが効率率率よくAMを起動できてないかもしれない
  • 19.
    2016/01/25(⽉月)  ボトルネック②(2/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 19 TimelineServerの利利⽤用を停⽌止 YARN  TimelineServer • YARNアプリケーションのログやstatisticsを保管 • ローカルのleveldbを使うため、ボトルネックになりやすい 従来のHistoryServerの使⽤用も可能 • tez.history.logging.service.class = org.apache.tez.dag.history.logging.impl.SimpleHistoryLoggingService • HDFSの負荷があがることに注意
  • 20.
    2016/01/25(⽉月)  ボトルネック②(3/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 20 ApplicationMasterの起動効率率率の向上 ⼤大量量のAM起動中にPendingが発⽣生 • PendingステータスのAMが多いことに気づく yarn.resourcemanager.amlauncher.thread-‐‑‒count • RMがAMを起動する時に使うスレッドの数 • 50(デフォルト)→200に引き上げ 結果 • 22,000 Query/hour • 思ったより効果出ず。。
  • 21.
    ここまでの成果 21Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 22.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 22 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② RM 2016/01/26(⽕火)  ボトルネック③ 2016/01/27(⽔水) 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 23.
    2016/01/26(⽕火)  ボトルネック③(1/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 23 ResourceManagerのボトルネックが継続 Pendingステータスのコンテナが多発 • ⼤大量量のAMに対して、コンテナが少なすぎることに気付く • コンテナの起動に関わる設定を模索索
  • 24.
    2016/01/26(⽕火)  ボトルネック③(2/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 24 コンテナの起動速度度を最適化 プロパティ default 変更更後 tez.am.am-‐‑‒rm.heartbeat.interval-‐‑‒ms.max 250 1500 yarn.resourcemanager. nodemanagers.heartbeat-‐‑‒interval-‐‑‒ms 2000 1000 HeartBeat間隔を調整し、RMへの要求伝達を効率率率化 コンテナ起動が効率率率よくなり、再びHS2がボトルネックに
  • 25.
    2016/01/26(⽕火)  ボトルネック③(3/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 25 再びHiveserver2のボトルネックを発⾒見見 Hiveserver2の特徴 • クエリのコンパイルや結果セットの集約を⾏行行うので 並列列度度が⾼高いとボトルネックになりやすい Hiveserver2を3ノードから10ノードへ増設 • 46,000 Query/hour に到達 • 少し効果が出てきた
  • 26.
    ここまでの成果 26Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 27.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 27 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② RM 2016/01/26(⽕火)  ボトルネック③ AM 2016/01/27(⽔水) ボトルネック④ 2016/01/28(⽊木)   2016/01/29(⾦金金)
  • 28.
    2016/01/27(⽔水) ボトルネック④(1/2) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 28 再びResourceManagerがボトルネックへ 並列列数を引き上げ • 現段階で考えられるボトルネックが解消 • 並列列数を256から段階的に引き上げ 1,000並列列前後で性能が頭打ち • ResourceManagerが⾼高負荷になっていることを発⾒見見
  • 29.
    2016/01/27(⽔水) ボトルネック④(2/2) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 29 ResourceManagerのヒープサイズ引き上げ ⼤大量量のAM実⾏行行によりRMが⾼高負荷に • RMのメモリ使⽤用率率率が上昇 • テスト中にフルGC→Failover RMのヒープを調整しフルGCを回避 • HDPはAmbariから調整 • 86,000 Query/hourに到達 • あとひと息!
  • 30.
    ここまでの成果 30Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 31.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 31 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② RM 2016/01/26(⽕火)  ボトルネック③ AM 2016/01/27(⽔水) ボトルネック④ コンテナ 2016/01/28(⽊木)  ボトルネック⑤ 2016/01/29(⾦金金)
  • 32.
    2016/01/28(⽊木)  ボトルネック③(1/3) Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 32 HDFSのボトルネックを発⾒見見 著しくパフォーマンスが悪いSQLを発⾒見見 • 同じSQLを再実⾏行行すると速い • 構⽂文やデータ構造の問題でない ⼤大量量のAppから同じDatanodeへアクセス集中 • DatanodeのConnection  Timeout • その他不不明なHDFSアクセスエラー
  • 33.
    2016/01/28(⽊木) ボトルネック⑤ Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 33 Datanodeのビジーを解消 HDFSのReplicationFactorを引き上げることでbusyを回避 • ReplicationFactor:3(Default) → 10 • hadoop fs –setrep 10 /user/hive/warehouse/... • hive> set  dfs.replication=10;
  • 34.
    2016/01/28(⽊木) ボトルネック⑤ Copyright  (C) 2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 34 Namenodeのチューニンング ⼤大量量のAM終了了時にNamenodeがダウン • AM終了了時のJobHistoryの⼤大量量書き込みが原因 Namenodeスレッド数の調整 • dfs.namenode.handler.count -‐‑‒>  40 HDFSユーザのnofile引き上げ • too many open filesエラーが発⽣生 • nofileを1,280,000へ引き上げ • Ambariから調整
  • 35.
    ここまでの成果 35Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 36.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 36 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② RM 2016/01/26(⽕火)  ボトルネック③ AM 2016/01/27(⽔水) ボトルネック④ コンテナ 2016/01/28(⽊木)  ボトルネック⑤ HDFS 2016/01/29(⾦金金)
  • 37.
    2016/01/29(⾦金金) Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 37 スイートスポットの探索索 768並列列以降降は、DNのネックで頭打ち サンプル数を増やして実測値でも100,000qphをクリア! 並列列数 60,000SQLの処理理時間 1時間あたり換算 512 2,508  sec 86,106  qph 768 2,289  sec 94,354  qph 1,024 2,514  sec 85,899  qph 2,560 3,106  sec 69,541  qph
  • 38.
    ⽬目標達成!!! 38Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 0   20,000   40,000   60,000   80,000   100,000   120,000   1/22/2016 1/23/2016 1/24/2016 1/25/2016 1/26/2016 1/27/2016 1/28/2016 1/29/2016 SQL/Hour 実測値(最⼤大) ⽬目標
  • 39.
    アジェンダ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 39 2016/01/20(⽔水) 問題の発覚 2016/01/21(⽊木) スタート! 2016/01/22(⾦金金) ボトルネック① MetastoreServer 2016/01/25(⽉月) ボトルネック② RM 2016/01/26(⽕火)  ボトルネック③ AM 2016/01/27(⽔水) ボトルネック④ コンテナ 2016/01/28(⽊木)  ボトルネック⑤ HDFS 2016/01/29(⾦金金) ⽬目標達成!
  • 40.
    おまけ Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 40
  • 41.
    その他効果があったと思われるパラメータ(1/5) Reuse  on/off • tez.am.container.reuse.rack-‐‑‒fallback.enabled=true => 同じrackのcontainerをreuseする設定 • tez.am.container.reuse.non-‐‑‒local-‐‑‒fallback.enabled=true   =>  rack外のcontainerをreuseする設定 Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 41 reuseまわり
  • 42.
    その他効果があったと思われるパラメータ( 2/5 ) Containerの保持期間を調整 •tez.am.session.min.held-‐‑‒containers=10 • tez.am.container.idle.release-‐‑‒timeout-‐‑‒max.millis=5000 • tez.am.container.idle.release-‐‑‒timeout-‐‑‒min.millis=2000 Containerのreuseが効果を維持するため • tez.session.am.dag.submit.timeout.secs=120 =>  次のクエリが来る間隔以上で設定しておく必要がある Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 42 reuseまわり
  • 43.
    その他効果があったと思われるパラメータ( 3/5 ) clientの接続数が多い場合は、以下を引き上げる •hive.server2.thrift.min.worker.threads=5   -‐‑‒>  100   • hive.exec.parallel.thread.number=8   -‐‑‒>  32 Join最適化 • hive.auto.convert.join.noconditionaltask.size=209715200 • hive.auto.convert.join=true =>  メモリ上にのるデータならMapフェーズでJoinしStageがひとつ減る Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 43 Hiveserver2まわり
  • 44.
    その他効果があったと思われるパラメータ( 4/5 ) node localityの変更更 • yarn.scheduler.capacity.node-‐‑‒locality-‐‑‒delay=-‐‑‒1   -‐‑‒>  26 RMとATSの通信削減 • yarn.resourcemanager.system-‐‑‒metrics-‐‑‒publisher.enabled=false =>  もし使ってなければ、falseにして無駄な通信を無くしたほうがいい Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 44 etc
  • 45.
    その他効果があったと思われるパラメータ(5/5) Pre-‐‑‒warm • hive.prewarm.enabled=true • hive.prewarm.numcontainers=25 •hive.server2.tez.sessions.per.default.queue=96 • hive.server2.tez.default.queues=queue_̲name =>  今回は、DoASを有効にしているので使いませんでした。 Copyright  (C)  2016  Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 45 etc
  • 46.
    最後に Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 46
  • 47.
    反省省点 Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 47 ⼤大規模環境からくる慢⼼心 サーバがたくさんあるからと安⼼心していた • 700ノードもあるから⼤大丈夫だろうと⾼高を括っていた • スレーブノードが増えれば、HDFSやYARNの基本的な設定も⾒見見直すべき チーム間の連携 • クラスタ本体とHiveの設定の担当が別チームで設計の整合性が⽋欠如 • ⼤大きなクラスタを⼤大きな組織で運営する問題
  • 48.
    収穫 Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 48 ⼤大規模環境の運営で培った⼒力力が活きた YARNやHDFSのノウハウが通⽤用する • HiveやTezなどベーシックなエコシステムを利利⽤用 • YARNやHDFSの経験を積んだ⼈人材が育っていた 短期間に各領領域の専⾨門家が集結 • 設計時は複数チームの意思疎通がまずかったが、 それぞれの領領域の専⾨門家が集まることで短期間に問題を解決できた • この中には当社のHiveコントリビュータもいて、⼒力力強い助っ⼈人になった
  • 49.
    EOP Copyright  (C)  2016 Yahoo  Japan  Corporation.  All  Rights  Reserved.  無断引⽤用・転載禁⽌止 49