Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

HBase CompleteBulkLoadその仕組み&発生した問題

291 views

Published on

テーマ: HBase CompleteBulkLoadその仕組み&発生した問題
内容:
・CompleteBulkLoadの概要
・発生した問題とCompleteBulkLoadの仕組み

Published in: Software
  • Be the first to comment

  • Be the first to like this

HBase CompleteBulkLoadその仕組み&発生した問題

  1. 1. takemikamiʼs note ‒ http://takemikami.com/ HBase CompleteBulkLoad その仕組み&発⽣した問題 Copyright (C) Takeshi Mikami. All rights reserved. 1 三上威(アーリース情報技術株式会社 代表) twitter: @takemikami 2019.6.4 Repro Tech: 実践・並列分散処理基盤 @ Repro株式会社
  2. 2. takemikamiʼs note ‒ http://takemikami.com/ はじめに •テーマ HBase CompleteBulkLoad その仕組み&発⽣した問題 •内容 • CompleteBulkLoadの概要 • 発⽣した問題とCompleteBulkLoadの仕組み Copyright (C) Takeshi Mikami. All rights reserved. 2 本⽇のLTでお話しする内容について説明します ※「HBaseが分散KVSである」と知っていれば理解できる内容です
  3. 3. takemikamiʼs note ‒ http://takemikami.com/ ⾃⼰紹介 • 三上威 (@takemikami) • データエンジニア・サイエンティスト • タスク: 分析・予測モデル開発・基盤構築 etc • 対象: マーケティングデータ etc • 略歴 • 甲南⼤学理学部応⽤数学科 卒 • EC, CRM等のシステム構築 @ NEC系SIer • ECサイトのマーケティングデータ分析 @ DeNA • データ分析・予測モデル開発・基盤構築 @アーリース情報技術(株) Copyright (C) Takeshi Mikami. All rights reserved. 3 発表者のプロフィールを紹介します ※フリーランスの法⼈成り
  4. 4. takemikamiʼs note ‒ http://takemikami.com/ ⾃⼰紹介 開発プロダクト • digdag-plugin-shresult • ワークフローエンジン「Digdag」のプラグイン • シェルスクリプトを実⾏し、標準出⼒をDigdagの変数に格納するオペレータ • https://github.com/takemikami/digdag-plugin-shresult • objectify-appengine-memcacheclient • Google Cloud DatastoreのJava⽤ライブラリ「Objectify」(v6以降)で、 Google AppEngine Memcache のキャッシュを利⽤するためのサービス • https://github.com/takemikami/objectify-appengine-memcacheclient Copyright (C) Takeshi Mikami. All rights reserved. 4 発表者が作ったプロダクトを紹介します etc
  5. 5. takemikamiʼs note ‒ http://takemikami.com/ ⾃⼰紹介 技術同⼈誌 • Apache Hadoop & Sparkビッグデータプログラミング⼊⾨ • ビッグデータの加⼯や機械学習のためのプログラミングガイド • 2019.4.14 技術書典6 @ 池袋サンシャインシティ2F 展⽰ホールD Copyright (C) Takeshi Mikami. All rights reserved. 5 発表者が執筆した同⼈誌を紹介します https://takemikami.booth.pm/
  6. 6. takemikamiʼs note ‒ http://takemikami.com/ CompleteBulkLoadの全体像 • HBaseのCompleteBulkLoadは2stepで実施 • importtsv: mapreduceでtsvファイルをHFile (HBaseの内部形式)に変換 • completebulkload: HFileをHBaseのテーブルにロード Copyright (C) Takeshi Mikami. All rights reserved. 6 HBaseのCompleteBulkLoad全体の流れについて説明します tsv ファイル HFile HBase table importtsv complete bulkload Step1 Step2 事前に内部形式に変換 短時間でロード HBaseの内部形式
  7. 7. takemikamiʼs note ‒ http://takemikami.com/ 発⽣した問題 •前提 • CompleteBulkLoadでデータを洗い替え(⽇次バッチ) • importtsv → truncate(drop/create) → completebulkload •流れ • 新機能追加でデータ量が⼤幅に増加 • ロードに⾮常に時間がかかる • ロードに時間がかかり過ぎるため → 機能を⾒直して、データ量を削減 • エラーが出てロード出来なくなる! Copyright (C) Takeshi Mikami. All rights reserved. 7 CompleteBulkLoadによるデータ洗い替えで発⽣した問題について説明します
  8. 8. takemikamiʼs note ‒ http://takemikami.com/ HBaseのテーブルの理解 〜tableとregion • HBaseのテーブル: Rowキー・カラム・タイムスタンプに対し値を持つ • データはRowキーの範囲で分割し保存 (分割された単位をRegionと呼ぶ) Copyright (C) Takeshi Mikami. All rights reserved. 8 HBaseのテーブルのregionについて説明します Rowキー カラム タイムスタンプ 値 03 名前 1484890815454 佐藤 03 年齢 1484890815454 32 12 名前 1484890815454 ⼭⽥ 12 年齢 1484890815454 47 15 名前 1484890815454 ⼭本 15 年齢 1484890815454 21 76 名前 1484890815454 鈴⽊ 76 年齢 1484890815454 25 95 名前 1484890815454 ⾼橋 95 年齢 1484890815454 18 Region① 00〜50 Region② 51〜99 注:columnfamilyの 説明は省く
  9. 9. takemikamiʼs note ‒ http://takemikami.com/ HBaseのテーブルの理解 〜regionの分割 • Region内のデータサイズが閾値を超えると、Regionがsplit(分割) (明⽰的にコマンドを⼊⼒してsplitすることも可能) Copyright (C) Takeshi Mikami. All rights reserved. 9 HBaseのテーブルのregionの分割について説明します Rowキー カラム タイムスタンプ 値 03 名前 1484890815454 佐藤 03 年齢 1484890815454 32 12 名前 1484890815454 ⼭⽥ 12 年齢 1484890815454 47 15 名前 1484890815454 ⼭本 15 年齢 1484890815454 21 76 名前 1484890815454 鈴⽊ 76 年齢 1484890815454 25 95 名前 1484890815454 ⾼橋 95 年齢 1484890815454 18 Region① 00〜50 Region② 51〜99 Region① 00〜15 Region② 15〜50 Region③ 51〜99
  10. 10. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み Copyright (C) Takeshi Mikami. All rights reserved. 10 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase step1 mapreduceでtsvファイルを HFile (HBaseの内部形式)に変換 step2 HFileを HBaseテーブルに ロード バルクロードは、この2stepで実施 次スライドから順を追って説明します
  11. 11. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 1. tsvファイルの準備 Copyright (C) Takeshi Mikami. All rights reserved. 11 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase HDFSに⼊⼒TSVファイルをアップロードします
  12. 12. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 2. mapper/reducerの起動 Copyright (C) Takeshi Mikami. All rights reserved. 12 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase ⼊⼒TSVファイル数に応じた数の mapperを起動します インポート先テーブルのRegion数の Reducerを起動します
  13. 13. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 3.map処理 Copyright (C) Takeshi Mikami. All rights reserved. 13 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase ⼊⼒TSVファイル数を インポート先テーブルの「キー」と「属性値のMap」 の形式にmapします
  14. 14. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 4.shuffle処理 Copyright (C) Takeshi Mikami. All rights reserved. 14 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase 出⼒先テーブルの regionのキー範囲に合わせ、 各reducerにshuffleします 00〜50の範囲00〜50の範囲 51〜100の範囲51〜100の範囲
  15. 15. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 5.reduce処理 Copyright (C) Takeshi Mikami. All rights reserved. 15 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase regionのキー範囲ごとに、 Reduce処理で、 HFileを⽣成します
  16. 16. takemikamiʼs note ‒ http://takemikami.com/ HFile バルクロードの仕組み 6.completebulkload処理 Copyright (C) Takeshi Mikami. All rights reserved. 16 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Complate BulkLoad Map Complate BulkLoad Reduce Reduce Shuffle HBase 各region毎に、 Hfileをテーブルにロードします
  17. 17. takemikamiʼs note ‒ http://takemikami.com/ 何が起きていたのか? •前提 • CompleteBulkLoadでデータを洗い替え(⽇次バッチ) • importtsv → truncate(drop/create) → completebulkload •流れ • 新機能追加でデータ量が⼤幅に増加 • ロードに⾮常に時間がかかる • ロードに時間がかかり過ぎるため → 機能を⾒直して、データ量を削減 • エラーが出てロード出来なくなる! Copyright (C) Takeshi Mikami. All rights reserved. 17 発⽣した問題で起こっていた内容を説明します 1度⽬のロード 2度⽬のロード
  18. 18. takemikamiʼs note ‒ http://takemikami.com/ HFile 何が起きていたのか? 1度⽬のロード Copyright (C) Takeshi Mikami. All rights reserved. 18 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Map Reduce Reduce Shuffle HBase CompleteBulkLoad時に 何度もSplitが発⽣ CompleteBulkLoad時に 何度もSplitが発⽣ ・新機能追加でロードするデータ量が⼤幅に増加 ・ロードに⾮常に時間がかかる ・ロードに時間がかかり過ぎるため データ量を削減 ・エラーが出てロード出来なくなる! Complate BulkLoad Complate BulkLoad
  19. 19. takemikamiʼs note ‒ http://takemikami.com/ 何が起きていたのか? 2度⽬のロード Copyright (C) Takeshi Mikami. All rights reserved. 19 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region② 51〜100 Region① 00〜50 Map Map Shuffle HBase ・新機能追加でロードするデータ量が⼤幅に増加 ・ロードに⾮常に時間がかかる ・ロードに時間がかかり過ぎるため データ量を削減 ・エラーが出てロード出来なくなる! 00〜50の範囲 細かい範囲 多数のRegionがあるので 多数のHFileを作成 HFileHFileHFileHFile Complate BulkLoad Reduce 細かい範囲 HFileHFileHFileHFileHFile Reduce Complate BulkLoad細かい範囲 多数のRegionがあるので 多数のHFileを作成
  20. 20. takemikamiʼs note ‒ http://takemikami.com/ 何が起きていたのか? 2度⽬のロード Copyright (C) Takeshi Mikami. All rights reserved. 20 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Map Map Shuffle HBase ・新機能追加でロードするデータ量が⼤幅に増加 ・ロードに⾮常に時間がかかる ・ロードに時間がかかり過ぎるため データ量を削減 ・エラーが出てロード出来なくなる! HFileHFileHFileHFile Reduce HFileHFileHFileHFileHFile Reduce Region Complate BulkLoad Complate BulkLoad complatebulkload前に truncateするのでRegionは1つに
  21. 21. takemikamiʼs note ‒ http://takemikami.com/ 何が起きていたのか? 2度⽬のロード Copyright (C) Takeshi Mikami. All rights reserved. 21 バルクロード(ImportTSV〜CompleteBulkLoad)の流れについて順を追って説明します TSV TSV キー 名前 年齢 76 鈴⽊ 25 03 佐藤 32 12 ⼭⽥ 47 25 ・・・ ・・・ キー 値 76 名前:鈴⽊, 年齢:25 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 25 ・・・ キー 値 03 名前:佐藤, 年齢:32 12 名前:⼭⽥, 年齢:47 15 名前:⼭本, 年齢:21 25 ・・・ HFile キー 値 95 名前:⾼橋, 年齢:18 76 名前:鈴⽊, 年齢:25 65 ・・・ キー 名前 年齢 95 ⾼橋 18 15 ⼭本 21 65 ・・・ ・・・ キー 値 95 名前:⾼橋, 年齢:18 15 名前:⼭本, 年齢:21 65 ・・・ compltebulkloadimporttsv Region Map Map Shuffle HBase ・新機能追加でロードするデータ量が⼤幅に増加 ・ロードに⾮常に時間がかかる ・ロードに時間がかかり過ぎるため データ量を削減 ・エラーが出てロード出来なくなる! HFileHFileHFileHFile Complate BulkLoad Reduce HFileHFileHFileHFileHFile Reduce Complate BulkLoad 単⼀Regionにロード可能な HFile数の閾値を超えてエラー 単⼀Regionにロード可能な HFile数の閾値を超えてエラー
  22. 22. takemikamiʼs note ‒ http://takemikami.com/ ⾏った対処 •対処① importtsvのカスタマイズ • 指定した数でHFileを分割するようにカスタマイズ • 元データがHiveにあったので、HiveQLで分割位置を取得 • importtsvでHBaseからsplit位置取得する処理を差し替え •対処② 事前にRegionをSplit • completebulkload実⾏前に、 HFileの分割位置でRegionをSplit (hbaseコマンド) Copyright (C) Takeshi Mikami. All rights reserved. 22 発⽣した問題に対して⾏った対処を⽰します
  23. 23. takemikamiʼs note ‒ http://takemikami.com/ CompleteBulkLoad実施時の注意点 • CompleteBulkLoad実施時、以下のバランスが悪いと問題が⽣じる • ①ロードするデータサイズ ②テーブルのregion分割数 Copyright (C) Takeshi Mikami. All rights reserved. 23 CompleteBulkLoad実施時の注意点を説明します 『①ロードするデータサイズ > ②テーブルのregion分割数』の場合 ロードするデータがregionに収まりきらず、 completebulkloadの途中で、何度もauto-splitが発⽣し、ロードに時間がかかる。 『①ロードするデータサイズ < ②テーブルのregion分割数』の場合 region分割数が多いと多数のHFileができる。 テーブルを洗い替え(truncate→complatebulkload)しようとすると、 単⼀regionにロードできるHFile数の閾値を超えて、エラーになってしまう。 → (importtsv実⾏前にregionを⼿動splitするなど) ロードするデータサイズとregion数をバランスさせておく必要がある。

×