内製パッケージによる
Hadoopデータ解析基盤の構築と運用
2017 Jun 27
CyberAgent, Inc. All Rights Reserved
善明 晃由
●2011年3月中途入社
●所属:技術本部秋葉原ラボ
●データ解析基盤Patriotの開発運用を担当
●前職はメーカの研究所で分散コンピューティングなどの研究開
発を担当
● 背景
○ データ解析基盤Patriotの概要
○ 今回の取り組みの目的
● 内製パッケージによるデータ解析基盤の構築と運用
○ Hadoopパッケージの内製化
○ 継続的改善のためのシステム構成
● 現在の取り組み
本日の内容
● 背景
○ データ解析基盤Patriotの概要
○ 今回の取り組みの目的
● 内製パッケージによるデータ解析基盤の構築と運用
○ Hadoopパッケージの内製化
○ 継続的改善のためのシステム構成
● 現在の取り組み
本日の内容
● Hadoopベースのデータ解析基盤
○ HDFS, YARN, Hive, HBase, Flume, Spark, etc
● メディアサービスのデータを集約
○ 2.5 PB / 3.0 PB (3 replica)
■ 5〜7 TB / day
○ 約700テーブル、12,000,000パーティション
○ 6000スケジュールジョブ + アドホックジョブ
データ解析基盤Patriot
リアルタイム処理基盤
システム構成
Patriot
MySQL
etc...
機械学習基盤
HTTP API /
WebUI
データ
転送管理
Flume
● 2010年 7月:初期リリース (CDH3)
● 2012年 5月:SPプラットフォーム向けPatriotの構築 (CDH4)
● 2013年 7月:データセンター移設とアップグレード (CDH4)
● 2013年 8月:SPプラットフォーム向けPatriotを統合
  ...
● 2017年 5月:データセンター移設とアップグレード
Patriotのこれまで
● 継続的なアップグレードが困難
○ 実データを利用可能なテスト環境がない
○ 場当たり的なパッチの管理
● 新しい手法やツールの導入が困難
○ アップデートが困難なのでレガシーなバージョンに束縛
これまでの課題
● CDH4.7 (0.10.0) から 0.11.0へのアップグレード
○ 分析関数などが導入
○ メタストアのスキーマ変更はなし
○ HDFS等はアップグレードしない
● 結果 :
○ 動作しないクエリが頻出
■ MAPJOIN関連の挙動変更など
○ 部分的なアップデートのみ
■ スケジュールジョブ用のサーバの一部
■ アドホック用はユーザ影響を考えて見送り
事例:Hiveのアップデート
● 目的
○ 必要なアップグレードや新規手法やツールの導入を継続的に行
える環境作り
○ 自分たちで必要な改善を行うための技術力の強化
○ オープンソースへの貢献を増やす
● 目標
○ 内製パッケージでもHadoopエコシステムを構築・運用できる状態
今回の取り組みの目的
● インフラ的な事情でデータセンターを移設
● それに合わせてアップデートとシステム構成の見直し
データセンター移設と今回の取り組み
旧環境 新環境
並行稼働させてながら
新環境の構築・検証
● 背景
○ データ解析基盤Patriotの概要
○ 今回の取り組みの目的
● 内製パッケージによるデータ解析基盤の構築と運用
○ Hadoopパッケージの内製化
○ 継続的改善のためのシステム構成
● 現在の取り組み
本日の内容
● Apache Bigtopを用いた内製化
○ OSSビッグデータコンポーネントのパッケージング、テスト、設定
などを行うツール
■ RPMのためのスペックファイルや起動スクリプトなどを提供
■ Gitのタグ等を指定してパッケージング
■ パッチの組み込みも可能
Hadoopパッケージの内製化
● 所定のディレクトリにパッチを設置
● GHE上でプルリクエストベースで管理
Apache Bigtopを用いた内製化
● Jenkinsにパッケージングジョブを作成
○ Gradlewを実行してるだけ
● 各種レポジトリ(Yum, Nexus)も構築
○ Nexusへの登録ジョブも作成
Apache Bigtopを用いた内製化
● Hadoop 2.7.3
○ Hadoop 3.0.0 にしたかったが出ないので
● Zookeeper 3.4.6
● HBase 1.3.0
● Hive 2.1.1 + patch
● Tez 0.8.4
● Flume 1.8.0 (trunk) + patch
● Spark 2.1.0 + patch
● Presto 0.179 (予定)
現在利用中のパッケージ
● Hive
○ HIVE-14029 : Update Spark version to 2.0.0
○ HIVE-14999 : SparkClientUtilities does not support viewFS
○ HIVE-15101 : Spark client process can be stuck when UNHEALTHY
NodeManager exists
○ HIVE-15237 : Propagate Spark job failure to Hive
○ HIVE-15239 : hive on spark combine equivalent work get wrong result
because of TS operation compare
○ HIVE-15513 : GroupByOperator should initialize GenericUDAFEvaluator
before AggregationBuffer (recurrence of HIVE-697)
○ HIVE-15580 : Eliminate unbounded memory usage for orderBy and
groupBy in Hive on Spark
適用しているパッチ
● Flume
○ FLUME-3026 : Add Kafka 0.10 support for Flume
○ FLUME-3065 : Enable multiple monitoring types
○ FLUME-3100 : Support arbitrary header substitution for topic of Kafka
● Spark
○ SPARK-14958 : Failed task hangs if error is encountered when getting task
result
適用しているパッチ
● 本番環境と同じデータが流れるステージング環境
○ Flumeによるファンアウト
■ Failover + Null Sinkで本番環境への影響を防ぐ
○ ハードウェア構成もほぼ同様
■ 台数が少ないだけ
○ スケジュールジョブの削減
■ 類似ジョブは除去
● アクセス解析など
継続的改善のためのシステム構成
継続的改善のためのシステム構成
サンドボックス環境 ステージング環境 本番環境
本番の同等のデータ転送、ジョブ実行し
本番環境への導入前の確認
サービスステージング環
境 サービス本番環境
ステージングログの確
認など
開発環境
最新機能等の調査用
● 構成管理
○ AnsibleでInventoryを環境ごとに用意
● 監視・モニタリング
○ Sensu, Grafana/OpenTSDB
■ HBaseにモニタリングデータも集約
構成管理、監視・モニタリングなど
● 当初 2.1.0 + Patchを利用
○ HIVE-14652 : incorrect results for not in on partition columns
● HIVE-15239が発覚
○ 同じテーブルを複数回参照するクエリの結果がおかしくなる
○ パッチはあるがリリースされているバージョンでは未修正
● バグ特定から本番リリースまで3営業日くらい
○ パッケージの作成、問題のあるクエリの確認
○ ステージングでの確認
○ 本番アップデート
事例:Hiveのアップデート
● 背景
○ データ解析基盤Patriotの概要
○ 今回の取り組みの目的
● 内製パッケージによるデータ解析基盤の構築と運用
○ Hadoopパッケージの内製化
○ 継続的改善のためのシステム構成
● 現在の取り組み
本日の内容
現在の取り組み
ステージング環境 本番環境開発環境
Hive on Tez
Hive on LLAP
Presto on
Yarn/Slider
Hadoop-2.8.0
● Hive on Tez
○ 省メモリバッチジョブのためのMapReduceの代替
● Hive on LLAP / Presto on Yarn/Slider
○ YARNでメモリ管理できる低レイテンシクエリエンジン
● Hadoop-2.8.0
○ 最新バージョンへの追従
● データ解析基盤の内製Hadoopパッケージによる構築・運用
● 内製化した上での取り組み
○ OSSに対する取り組み
○ 最新のツールや手法の検証・導入
● 現在の取り組み
○ 継続的に新手法やツールの検証・導入
○ WebUIやデータ管理システムなど社内事情に特化したシステム開発
まとめ

内製パッケージによるHadoopデータ解析基盤の構築と運用