$30 off During Our Annual Pro Sale. View Details »

20161212jawsbigdata-161214152052.pdf

Avatar for Keigo Suda Keigo Suda
December 12, 2016
1

 20161212jawsbigdata-161214152052.pdf

Avatar for Keigo Suda

Keigo Suda

December 12, 2016
Tweet

Transcript

  1. * 2012年新卒⼊社(今年5年⽬ orz) * Technology Innovation Group スペシャリスト * 最近の専⾨

    -> ビッグデータ領域(インフラ〜アプリ) * 最近はもっぱらKafkaとストリーム処理エンジンの諸々 須⽥桂伍 (すだ けいご)
  2. 店舗発注業務の裏側 ローソン全業務で利⽤されるマスタデータを ⽇次バッチで最新化 1 最新化された全業務マスタデータの更新差分を 各店舗へファイル連携 店舗へ更新分データのファイル連携 2 本部センター ファイル

    連携基盤 ストアコンピュータ データ反映 発注端末 商品を発注 しますね 更新データ 全業務マスタデータ ⽇次バッチ処理 最新化 1 2 3 4 全業務マスタデータの最新化処理 連携されたファイルデータを各店舗にある ストコン内のDBへ反映する。 3 最新化されたマスタデータをもとに発注業務を実施 発注時の商品データ参照 4 更新分データのDB反映処理
  3. 店舗発注業務の裏側 ローソン全業務で利⽤されるマスタデータを ⽇次バッチで最新化 1 最新化された全業務マスタデータの更新差分を 各店舗へファイル連携 店舗へ更新分データのファイル連携 2 本部センター ファイル

    連携基盤 ストアコンピュータ データ反映 発注端末 商品を発注 しますね 更新データ 全業務マスタデータ ⽇次バッチ処理 最新化 1 2 3 4 全業務マスタデータの最新化処理 連携されたファイルデータを各店舗にある ストコン内のDBへ反映する。 3 最新化されたマスタデータをもとに発注業務を実施 発注時の商品データ参照 4 更新分データのDB反映処理 これまでは処理負荷を 各店舗に分散していたイメージ
  4. 店舗DB 発注業務 データ参照 加⼯処理 加⼯処理 取込処理 取込処理 発注 端末 発注

    端末 発注 端末 発注 端末 発注 端末 発注 端末 発注 端末 API API API API API API API 全店舗分の発注業務に利⽤する マスタデータをバッチ処理(⽇次)で作成 全業務マスタDBから店舗毎に必要な マスタデータの更新差分をファイルで連携 これまで店舗毎に配信されていた 全店舗分の更新差分ファイルを連携 受信⽤DB 公開⽤DB 1. 全業務マスタDBから各店舗へ更新差分ファイルを配信 2. 店舗毎にDBへ差分反映後、発注利⽤マスタデータを作成 3. 作成されたマスタデータは発注業務時に発注端末から参照 1. 全業務マスタDBから全店舗分の更新差分ファイルを配信 2. 受信⽤DBへ差分反映後、全店舗分の発注利⽤マスタデータを作成 3. 作成されたマスタデータはREST APIで公開し、発注端末より参照 データ参照 発注業務 Before After 機能のセンター集約
  5. アーキテクチャ全体概要 共有マスタ 本部 システム フ ァ イ ル 連 携

    基 盤 API参照DB 加⼯処理クラスタ×2 常時起動、ピーク時起動 受信マスタDB Ⅰ.取込処理 Ⅱ.加⼯処理 Ⅲ.参照処理 参照API マスタ反映 ファイル連携 データ加⼯ APIデータ反映 APIデータ参照 データを返す 過去データ蓄積⽤バケット MySQL DOT/POT センター機能 店 舗 DOT POT データ取得 ファイル取込 サーバ MySQL MySQL CDNキャッシュ 動画・添付 画像 CDN アップロード SQLバッチ(HiveQL) 参照APIで取得したURL情報を元に画像ファイルなどをGET
  6. 性能テスト実施環境 共有マスタ 本部 システム フ ァ イ ル 連 携

    基 盤 API参照DB 加⼯処理クラスタ×2 常時起動、ピーク時起動 受信マスタDB Ⅱ.加⼯処理 Ⅲ.参照処理 参照API データ加⼯ APIデータ反映 APIデータ参照 データを返す 過去データ蓄積⽤バケット MySQL DOT/POT センター機能(擬似) ファイル取込 サーバ MySQL MySQL CDNキャッシュ 動画・添付 画像 CDN アップロード SQLバッチ(HiveQL) JMeter 性能テスト環境 Ⅰ.取込処理 マスタ反映 ファイル連携 ファイル連携基盤にて性能テスト環 境へのファイルを配信してもらい本番 と同じ流量かつデータ量を再現
  7. 性能テスト実施環境 共有マスタ 本部 システム フ ァ イ ル 連 携

    基 盤 API参照DB 加⼯処理クラスタ×2 常時起動、ピーク時起動 受信マスタDB Ⅱ.加⼯処理 Ⅲ.参照処理 参照API データ加⼯ APIデータ反映 APIデータ参照 データを返す 過去データ蓄積⽤バケット MySQL DOT/POT センター機能(擬似) ファイル取込 サーバ MySQL MySQL CDNキャッシュ 動画・添付 画像 CDN アップロード SQLバッチ(HiveQL) JMeter 性能テスト環境 Ⅰ.取込処理 マスタ反映 ファイル連携 ファイル連携基盤にて性能テスト環 境へのファイルを配信してもらい本番 と同じ流量かつデータ量を再現
  8. 特 徴 l とにかくジョブの同時投⼊数、稼働数が多い l 1マスタ作成処理につき平均20ワーク作成ほど * 80マスタテーブル * 店舗数分

    l ⼀つ⼀つのクエリは結構重たい l ⾮正規化処理が中⼼のため⼤量読み取り&⼤量書き出し
  9. パラメータチューニング l 処理エンジンの変更 l 処理エンジンをTezに変更することでオンメモリで処理を⾏い、ディスクIOを減らす l Reducer数の変更 l 最後のファイル書き込みがボトルネックとなる処理が多かったため、起動Reducer数を増やして対応 l

    MapJoinの積極的活⽤ l MapJoinをどんどん誘導していく l ファイルフォーマットの選択と圧縮⽅式の選択 l 処理に適したファイルフォーマット選択とディスクIO負荷を軽減するための適切な圧縮⽅式選択
  10. Reducer数の変更/コンテナサイズの調整 l 調整パラメータ⼀覧 -- Reducer関連 SET hive.tez.auto.reducer.parallelism=true; SET hive.exec.reducers.bytes.per.reducer=64000000; --

    YARN Container関連 SET hive.tez.container.size=4096; SET hive.tez.java.opts=-Xmx3200m; SET hive.tez.cpu.vcores=1; SET hive.prewarm.enabled=true; SET hive.prewarm.numcontainers=30;
  11. MapJoinへの積極的誘導 l 最初は各クエリの各ワークをレビューしながらヒント句で固定 l 発狂 アヒャヒャヒャ(゚∀゚≡゚∀゚)ヒャヒャヒャ l そもそもクエリ内のロジックやら処理データ量やら変わったらどうするのこれ・・・ l もうAutoにまかせちゃう

    l MapJoinだとまずいものだけをMap Joinさせない l がむしゃらにMapJoinさせようとするとHashテーブルがメモリに乗り切らずOOM -- Map Join関連 SET hive.auto.convert.join=true; SET hive.auto.convert.join.noconditionaltask.size=1300000000;
  12. ファイルフォーマットの選択/圧縮⽅式の選択 l (中間テーブルの)ファイルフォーマット選択にあたっての要件としては以下 l どうせ終わったら消すだけのワークなので早く終わればそれでよし! l スキーマ情報はクエリの中でDDL発⾏していたのでファイルフォーマットでカバーする必要なし l カラムナ型のファイルフォーマッットも試したものの処理特性もありぱっとせず l

    ⾮正規化に近い処理をひたすら繰り返すため、カラムナフォーマットの利点をいかしきれず -- ファイルフォーマット関連&圧縮関連 SET hive.default.fileformat=sequencefile; SET mapred.output.compression.type=BLOCK; SET hive.exec.orc.default.compress=SNAPPY; SET hive.exec.compress.intermediate=true; SET hive.exec.compress.output=true; SET mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;
  13. MySQL MySQL TEXTFILE SEAQUENCEFILE+Snappy TEXTFILE ・・・・ 加⼯元テーブル ワークテーブル 加⼯後テーブル Hive

    HDFS ファイルフォーマットの選択/圧縮⽅式の選択 受信マスタDB API参照⽤DB EMR Sqoopエクスポート時の対応フォー マットの制約のため Sqoopインポート時のHive連携オ プションにより⾃動でスキーマ作成
  14. ファイルフォーマット 圧縮アルゴリズム 圧縮タイプ 処理時間 TEXT SNAPPY - 24:41:00 SEAQUENCE SNAPPY

    BLOCK 24:10:00 SNAPPY RECORD 27:22:00 ORC SNAPPY ファイルレベル 27:17:00 ビルトイン 27:00:00 (参考)ファイルフォーマットの選択/圧縮⽅式の選択
  15. リソースコントロールのための対応 l コンテナ配布の最適化 l スケジューラの調整 クラスタリソース(コンテナ) 割当 割当 割当 リソース割当待ち状態の

    滞留ジョブを発⽣させない 同時稼働ジョブ数を増やすために、 効率的なリソース配分を実施させる そのうえで、各マスタ作成処理の 最適化を実施する
  16. キュー設定によるリソース割り当て優先度の調整 キュー設定 root ├ peak(業務優先度⾼&リソース要求⾼) └ shohin └ hatchu_shohin └

    ichiran_sansho_yo_shohin └ plu ├ others(業務優先度低&リソース要求低) └ sqoop(Sqoop処理⽤) └ import └ export 前 提 l YARNスケジューラとして「Fair Scheduler」を利⽤する。 l Fair Schedulerにより、マスタ作成処理に重みづけを⾏い、クラスタのリソースを綿密にコントロールすることを⽬的とする。 ※Capacity Schedulerはキュー内ではリソースを均等分配できずペンディング状態の処理が発⽣してしまう可能性があるため。
  17. EMRと同じぐらい⼤変だったRDSチューニング l 最初は最初はほんとにSqoopによるエクスポートが終わらなかった・・・ l Sqoopエクスポートの多重度があがるとRDS(MySQL)のIOがつまる・・・ l しまいにはセッションきられる l 以下を中⼼にチューニングし、なんとか流し切れるまでに l

    エクスポート対象のテーブルを事前にPKでソート l なるべくディスクへの書き込みによるIOを遅延させる l innodb_buffer_pool_size l innodb_max_dirty_pages_pct l 書き込み周りのスレッド数を微調整 l innodb_write_io_threads l innodb_thread_concurrency
  18. (参考)エクスポート並列数による処理時間結果 0:00:00 0:00:20 0:00:40 0:01:00 0:01:20 0:01:40 0:02:00 0:02:20 1テーブルあたりの処理時間

    同時テーブルエクスポート数 Aurora 8xrlage Aurora 4xlarge MySQL 4xlarge No RDS AZ構成 パラ [table] map数 処理時間 処理時間/table 参考処理時間 (MySQL) 参考処理時間/ table(MySQL) 7 r3.4xlarge なし 9 1 0:15:26 0:01:43 0:12:35 0:01:24 8 r3.4xlarge なし 18 1 0:25:50 0:01:26 0:32:00 0:01:47 13 r3.4xlarge あり 36 1 0:56:18 0:01:34 1:18:46 0:02:11 16 r3.8xlarge なし 9 1 0:12:30 0:01:23 17 r3.8xlarge なし 18 1 0:22:22 0:01:15 18 r3.8xlarge なし 36 1 0:46:10 0:01:17 21 r3.8xlarge なし 72 1 1:37:21 0:01:21 RDS(JM)
  19. (参考)Multi AZによる処理時間 101% 104% 123% 140% 0% 20% 40% 60%

    80% 100% 120% 140% 160% 9パラ1map 18パラ1map AZなしの場合を100%とした場合の 処理時間の伸び率 Aurora MySQL No RDS AZ構成 パラ [table] map数 処理時間 処理時間/table 参考処理時間 (MySQL) 参考処理時間/ table 7 r3.4xlarge なし 9 1 0:15:26 0:01:43 0:12:35 0:01:24 8 r3.4xlarge なし 18 1 0:25:50 0:01:26 0:32:00 0:01:47 11 r3.4xlarge あり 9 1 0:15:36 0:01:44 0:15:26 0:01:43 12 r3.4xlarge あり 18 1 0:26:45 0:01:29 0:44:49 0:02:29
  20. まとめ:教訓 l とにかくワークは⼩さく保つ!!(迫真) l プランの可読性が全然違う l ちまたのチューニング情報はとっかかりとして有効 l ワークロードが異なれば傾向も変わる l

    リソース配分部分は結構盲点 l 情報も少なく⼀番業務要件できまる部分なのでちゃんと特性を知った上で設計する l Auroraって万能ですね! l 重たいデータのオフロードもいけるじゃん