Apache HBase Committerによる Apache HBase/Apache Phoenix …€¦ · Apache...

Post on 03-Jun-2020

22 views 0 download

Transcript of Apache HBase Committerによる Apache HBase/Apache Phoenix …€¦ · Apache...

Apache HBase Committerによる

Apache HBase/Apache Phoenixの最新情報

ClouderaApache HBase Committer鈴木 俊裕 (すずき としひろ)

自己紹介• 鈴木俊裕 (すずきとしひろ)

• Apache HBase Committer

• Cloudera• Staff Software Engineer

• サポートチームで働いています

• エスカレーションされたサポートチケットのトラブルシューティング

• プロダクトのバグフィックス(主にHBase/Phoenix)

• 著書「HBase徹底入門」

アジェンダ• Apache HBaseについて

• HBase on Cloud

• HBaseの最新運用ツール

• Apache Phoenixについて

Apache HBaseについて

Apache HBaseとは• Googleの分散DBである「BigTable」のオープンソースクローン

• ほとんどがJavaで実装されている

Apache HBaseの特徴• スケーラブル

• 自動シャーディング

• TableをRegionという単位に分割して管理

• 大規模データに対応

• 高可用性

• 自動フェイルオーバー機能

• ハイパフォーマンス

• LSM-tree(Log Structured Merge Tree)

• 特に書き込みが速い

• 読み込みも低レイテンシ (BlockCache/BucketCache)

Apache HBaseのシステム構成• マスタ型• Master

• RegionServerの管理やRegionのアサインなど

• 冗長化可能

• RegionServer• アサインされたRegionを管理する

• クライアントと実際にデータのやり取り (Masterは介さない)

Master

RegionServer RegionServer

Zookeeper

HDFS

・・・RegionServer

Apache HBaseのシステム構成• Zookeeper• 障害検知や各コンポーネント間のコーディネーション

• HDFS(Hadoop Distributed File System)上に構築されている

• (デフォルトで)レプリカを3つ持つので信頼性が高い

• HBaseのデータの信頼性はHDFSに依存している

Master

RegionServer RegionServer

Zookeeper

HDFS

・・・RegionServer

HBase on Cloud

HBase on Cloud• これまでは、HBaseは主にオンプレミス環境下で構築・運用されることが多かった

• 近年のクラウドの普及によりIaaS (Amazon EC2, Google Compute Engine, Microsoft Azure Compute)上にHBaseを作るという選択肢

• クラウドのメリット

• 初期費用が安い

• 管理・運用コストを削減できる等

HBase on Cloud• HBaseをクラウド上で動かすためのチャレンジ

• IaaSの一般的な料金体系は稼働時間に対しての従量課金

• 料金を安くするために、Amazon EC2ではスポットインスタンスがある

• 使われていないEC2インスタンスに値段をつけ、その入札価格が現在のスポット価格を上回っている限り、そのインスタンスを利用することができる

• 料金を安くするためにスポットインスタンスを使いたいが、意図しないタイミングでインスタンスが中断してしまう可能性がある

HBase on Cloud• HBaseをクラウド上で動かすためのチャレンジ

• スポットインスタンスでHDFS を運用する場合

• スポットインスタンスが中断して、DataNodeが落ちると、ブロックのコピーが発生してしまう

• スポットインスタンスが中断される前に通知はくるが、それからDataNodeのデコミッションをしても間に合わない

• 対策として、Amazon EBS (Elastic Block Store)やGoogle Persistent Storageを使ったらデータロス・コピーは防げるが、料金が高くなってしまうことがある

HBase on Cloud• HBaseをクラウド上で動かすためのチャレンジ

• そこで、Amazon S3やGoogle Cloud Storage等のオブジェクトストアサービス

• Amazon EBSやGoogle Persistent Storageと比べて安い

• しかし、 Amazon S3やGoogle Cloud StorageはHDFSに比べて弱い整合性モデルを採用している

• HBaseに完全にフィットしない

RegionServerRegion

HBase on Cloud• HBaseをクラウド上で動かすためのチャレンジ

• HBaseはStoreFileとWAL (Write Ahead Log)をHDFSに書き込む

• WAL:ログファイル。クラッシュ時にMemStoreのリカバリに必要

• StoreFile:データファイル

HDFSHFile

HFileStoreFile

WAL

Puts MemStore

Flush

Client

HBase on Cloud• HBaseをクラウド上で動かすためのチャレンジ

• WAL• Short-lived, Sub-second durability requirements

• オブジェクトストアを使うことができない (Azure Blob Storage (Page blob)/Azure Data Lake Storeは使用可能)

=> HDFS or Ratis LogService backed WALs (WIP)

• StoreFile• イミュータブルでキャッシュ可能

• 弱い整合性モデルのオブジェクトストアを使うことができる

• ただし、そのままでは使うことができない

=> HBOSS (HBase Object Store Semantics)

HBOSS• HBase Object Store Semanticsの略

• Apache HBaseのサブプロジェクト

• https://github.com/apache/hbase-filesystem/tree/master/hbase-oss

• HBaseでオブジェクトストアを使うためのソリューション

• これを用いてStoreFileをオブジェクトストアに保存できる

• WALに関しては対象外

HBOSS• 現在のところAmazon S3 (S3Aクライアント)でのみテストされているので、ここからはS3に特化した話になります

• テストはされてないが、理論的にはGoogle Cloud Storageやその他のオブジェクトストアでも動作可能

HBOSS• Amazon S3• AWSが提供するオブジェクトストアサービス

• 高いスケーラビリティ、可用性、耐障害性

• 主に保存されたデータサイズと、リクエストに対して課金

• ファイルシステムではない

• あくまで保存される単位はオブジェクト

• ディレクトリはない

• S3Aクライアント

• S3のHadoop Filesystem API実装の1つ

• S3をファイルシステムのように扱うことができる

• あくまでもバックエンドはオブジェクトストア

HBOSS• Amazon S3の整合性モデル

• 新規オブジェクトのPUT:書き込み後の読み込み整合性

• PUTしたオブジェクトを直後にGETすると一貫した結果が得られる

• PUTおよびDELETEの上書き:結果整合性

• 既存オブジェクトをPUTしてGETすると古いデータが返却される場合がある

• 既存オブジェクトをDELETEしてGETすると削除済データが返却される場合がある

HBOSS• Amazon S3の整合性モデル

• オブジェクトの LIST:結果整合性

• 新規オブジェクトをPUTして直後にLISTすると、追加されたオブジェクトがリストに含まれない場合がある

• 既存オブジェクトをDELETEして直後にLISTすると、削除済のオブジェクトがリストに含まれる場合がある

• 参考:S3 整合性モデルと Hadoop/Spark の話

• https://www.slideshare.net/ssuserca76a5/s3-hadoopspark

HBOSS• HBaseは各オペレーションがアトミックになることを想定している

• S3の結果整合性を採用した整合性モデルでは、エラーが発生したり、最悪の場合データロスが起こる可能性がある

HBOSS• S3Guard• S3Aクライアントの機能

• S3の結果整合性問題を軽減するためのソリューション

• Amazon DynamoDBをメタデータストアとして使う

• S3へのアクセスを減らすこともできるので、パフォーマンスも改善する

HBOSS• S3Guard• PUTやDELETEのオペレーションをするときにメタデータストア

(DynamoDB)を更新する

• PUT時はそのメタデータをメタデータストア(DynamoDB)に追加

• DELETE時は削除マーカーをメタデータストア(DynamoDB)に追加

• GET/LISTするときにはメタデータストア(DynamoDB)を参照する

• 整合性が取れた状態の結果が取得できる

• S3のアクセスも減らすことができるのでパフォーマンスも改善

HBOSS• S3Guardでできないこと

• 更新されたデータの整合性の保証

• 更新されたデータにアクセスすると古いデータが返ってくることがある

• これがWALでS3を使うことができない理由

• ディレクトリのRename時の整合性の保証

• ディレクトリのRename中の不整合な状態が見えてしまう

• 途中で失敗した場合は不整合な状態になってしまう

HBOSS• HBOSSはStoreFileの保存で必要な整合性と、S3Guardでできないことのギャップを埋めるためのソリューション

• ディレクトリのRename時の整合性の保証

• Hadoop Filesystem APIを実装していて、オブジェクトストアに分散ロック機構を追加する

• 各オペレーション時にファイルパス階層構造に合わせたロックを取る

• ディレクトリのRenameを含むStoreFileの保存で必要なファイルシステム系のオペレーションをアトミックにする

HBOSS• 分散ロックの実装

• Null Implementation• テスト用のモック

• Local Implementation• 開発用の実装。スタンドアロンな環境で使える

• Zookeeper Implementation• 本番用を想定された実装

• ZookeeperはHBaseで使っているものを使う想定 (2重に立てる必要はない)

• DynamoDB Implementation (未実装)

• S3GuardでDynamoDBを使うので、それを使った実装を想定

• ただし、DynamoDBには、ロックの階層構造のトラバースの効率的な方法がない

HBOSS• StoreFileにオブジェクトストアを使うメリット

• Amazon EBSやGoogle Persistent Storageに比べてコストが安い

• ストレージとコンピューティングノードを分離できる

• HBaseにアクセスしないときには、コンピューティングノードをシャットダウンできる (コスト削減)

• 使いたいときに同じS3上のデータを参照して起動すればよい

• コンピューティングノードにスポットインスタンス等の安価なインスタンスを使用しやすくなる

HBOSS• 課題

• HDFSに比べてS3にアクセス時のレイテンシが高い

• S3のレイテンシは数十ミリ秒から数百ミリ秒

• HDFSのレイテンシは数ミリ秒以下

• BlockCache/BucketCacheで軽減

• 現時点ではディレクトリのRenameの失敗時に不整合な状態になってしまう問題は解決できていない

HBase on Cloud• まとめ:現在のクラウド用のHBaseの構成

• HBOSS (StoreFile) + HDFS (WAL)

HBaseの最新運用ツール

HBaseの最新運用ツール• HBCK2• HBase-2.xからのクラスタ修復ツール

• hbtop• UnixのtopコマンドライクなHBaseメトリクスのリアルタイムモニタリングツール

HBCK2• HBase-1.xではHBCK(1)

• HBaseのメインプロジェクトに同梱されていたクラスタ修復ツール

• レポーティングと修復系(-fix* オプション)の機能がある

• HBase-2.xでは修復系のオプションが使えなくなっている

• レポーティングの機能は引き続き使える

HBCK2• HBase-2.xではHBCK2

• HBaseのメインプロジェクトとは別のプロジェクトで管理されている

• https://github.com/apache/hbase-operator-tools

• HBaseに同梱されてないので注意

• これまでは、自分でビルドする必要があったが、v1.0.0がリリースされたので下記からダウンロード可能

• https://repo1.maven.org/maven2/org/apache/hbase/operator/tools/hbase-hbck2/1.0.0/

HBCK2• なぜHBCK2が開発されたのか

• HBase-2.xで、Regionのアサイン周りの安定性の改善のためにAssignmentManager v2が再開発された

• HBCK(1)は、AssignmentManager v1を前提としているので使えなくなった

• レポーティング機能は引き続き使える

• AssignmentManager v2のために開発されたのがHBCK2

• HBCK2の使い方

• $ hbase hbck -j hbase-hbck2-1.0.0.jar <COMMAND> <ARGS>

HBCK2• 現時点(2019-09-27)のHBCK2のコマンド

• assigns• unassigns• bypass• setTableState• setRegionState• filesystem• replication• scheduleRecoveries• fixMeta• reportMissingRegionsInMeta• addFsRegionsMissingInMeta

• コマンドの詳細はREADMEへ

• https://github.com/apache/hbase-operator-tools/blob/master/hbase-hbck2/README.md

• HBaseのバージョンによっては使えないコマンドもある

HBCK2• HBCK2のよくあるユースケース

• META/NAMESPACEテーブルのRegionがアサインされない

• 原因:/hbase/MasterProcWALsの破損や手動削除

• HBCK2コマンド

• $ hbase hbck -j hbase-hbck2-1.0.0.jar assigns 1588230740

• NAMESPACEテーブルのRegionがアサインされない場合も同様

WARN org.apache.hadoop.hbase.master.HMaster: hbase:meta,,1.1588230740 is NOT online; state={1588230740 state=OPENING, ts=1550754721289, server=regionserver01.example.com,16020,1550676598448}; ServerCrashProcedures=true. Master startup cannot progress, in holding-pattern until region onlined.

HBCK2• HBCK2のよくあるユースケース

• Region-In-Transition問題

• 原因:複数のRegionServerがダウンしたときなど

• HBCK2コマンド

• $ hbase hbck -j hbase-hbck2-1.0.0.jar assigns 11bf6b18ddacdd864728e6cf1199b2a7

WARN org.apache.hadoop.hbase.master.assignment.AssignmentManager: STUCK Region-In-Transition rit=OPENING, location=regionserver01.example.com,16020,1542314816394, table=hbase:acl, region=11bf6b18ddacdd864728e6cf1199b2a7 … WARN org.apache.hadoop.hbase.ipc.RpcServer: Dropping timed out call: callId: 702 service: ClientService methodName: Mutate size: 272 connection: 1.1.1.1:56492 deadline: 1542316740911 param: region= hbase:meta,,1, row=hbase:acl,,1404406671604.11bf6b18ddacdd864728e6cf1199b2a7. connection: 1.1.1.1:56492

HBCK2• HBCK2のよくあるユースケース

• テーブルの状態がおかしい

• 原因:テーブルのdisable/enableがハング

• hbase> scan 'hbase:meta', {COLUMN => “table:state”}

• hbase> enable ‘usertable’

• HBCK2コマンド

• $ hbase hbck -j hbase-hbck2-1.0.0.jar setTableState usertable DISABLED

column=table:state, timestamp=1555406568751, value=\x08\x03

ERROR: Table tableName=usertable, state=ENABLING should be disabled!

hbtop• Unixのtopコマンドライクなツール

• CLIツール

• 一定時間毎に画面がリフレッシュされて、現在のメトリクスを見ることができる

• HBaseメトリクスのリアルタイムモニタリングができる

• Introduction "hbtop", a real-time monitoring tool for HBase modeled after Unix's 'top' command• https://blogs.apache.org/hbase/entry/introduction-hbtop-a-

real-time

hbtop• デモ

• hbtopの画面

• Namespace/Table/RegionServer/Region モード

• ソートフィールドの変更

• フィールドの表示・非表示

• フィールドの並び替え

• フィルタ

• ドリルダウン

hbtop• 今後の展望

• branch-1 (HBase-1.x)へのサポート (WIP)

• メトリクスの追加

• レスポンスタイムのメトリクス

• ColumnFamily/User/Operation(GET, PUT, SCAN, etc)単位のメトリクス

• システム系メトリクス(CPU, Memory, etc.)

Apache Phoenixについて

Apache Phoenixとは• HBaseでSQLを使えるように

• SQLを用いてデータの定義や操作をすることができる

• もともとはSalesforceで開発されていた

• HBaseのデータに対して低レイテンシでアクセス

• クエリエンジンがSQLをHBase API (Put, Delete, Scan)に変換して実行される

• JDBCをサポートしている

• セカンダリインデックス、Join、Group by等の機能を持っている

なぜPhoenixか• HBase APIを直接使ってコードを書くよりシンプルになる

• SELECT COUNT(*) FROM WEB_STAT WHERE HOST='EU' and CORE > 35 GROUP BY DOMAIN;

• SQLからパフォーマンス最適化が可能

• 統計情報を使った並列スキャン

• セカンダリインデックスの使用

• サーバサイド push down

• Filters, Skip scans, Partial aggregations, TopN, Hash joins

Phoenixには向いていないこと• 広範囲のスキャンを伴うクエリ

• ETL• データのクレンジング・変換

Phoenix Semantics Support Semantics Supported?

UPSERT/DELETE Yes

SELECT Yes

WHERE/HAVING Yes

GROUP BY, ORDER BY Yes

LIMIT Yes

VIEWS Yes

JOINS Yes

TRANSACTIONS Yes (Experimental)

Phoenixのアーキテクチャ

HBase Client

RegionServer RegionServer RegionServer

HDFS

ZooKeeper

ZooKeeper

ZooKeeper

Master

Master

Phoenix CoProc

Phoenix JDBC

Application

Phoenix CoProc Phoenix CoProc

Phoenixのデータモデル

HBase Table

• HBaseのテーブルにマッピングされる

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Row Key 3 KeyValue

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 Value

Row Key 2 Value Value

Row Key 3 Value

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 Value

Row Key 2 Value Value

Row Key 3 Value

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Row Key 3 KeyValue

Multiple Versions

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Row Key 3 KeyValue

Phoenix Table

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Row Key 3 KeyValue

Phoenix Table

Columns

Phoenixのデータモデル• HBaseのテーブルにマッピングされる

HBase TableColumn Family A Column Family B

Qualifier 1 Qualifier 2 Qualifier 3Row Key 1 KeyValue

Row Key 2 KeyValue KeyValue

Row Key 3 KeyValue

Phoenix Table

ColumnsPrimary Key Constraint

Phoenixのデータモデル• 例)SERVER_METRICS テーブル

Row Key

SERVER_METRICS

HOST CHAR(2)

DOMAIN VARCHAR

FEATURE VARCHAR

DATE DATE

USAGE.CORE BIGINT

USAGE.DB BIGINT

STATS.ACTIVE_VISITOR INTEGER

Phoenixのデータモデル• 例)SERVER_METRICS テーブル

SERVER_METRICS

HOST CHAR(2)

DOMAIN VARCHAR

FEATURE VARCHAR

DATE DATE

USAGE.CORE BIGINT

USAGE.DB BIGINT

STATS.ACTIVE_VISITOR INTEGER

Key Values

Column Family

Phoenixのデータモデル• 例)SERVER_METRICS テーブル

CREATE TABLE SERVER_METRICS ( HOST CHAR(2) NOT NULL, DOMAIN VARCHAR NOT NULL, FEATURE VARCHAR NOT NULL, DATE DATE NOT NULL, USAGE.CORE BIGINT, USAGE.DB BIGINT, STATS.ACTIVE_VISITOR INTEGER CONSTRAINT PK PRIMARY KEY (HOST, DOMAIN, FEATURE, DATE) );

Phoenixの機能• セカンダリインデックス

• 一般的なRDBと同様に、クエリの効率を上げるためにセカンダリインデックスを作ることができる

• TableかViewに対して作ることができる

• 基本的にはCREATE INDEX文を発行後に自動的に構築される

• SELECT時にクエリエンジンが最適なインデックスを選択する

• HINTを指定することも可能

Phoenixの機能• セカンダリインデックス

• GLOBAL INDEX• 読み込みが多いワークロードに向いている

• Coprocessorを使ってインデックスを構築する

• インデックス用に別テーブルが作成される

• 書き込み時に複数のテーブルに書かれる

• 読み込み時は1つのテーブルへ

• INCLUDEを指定してインデックスに含めるカラムを指定できる (COVERED INDEX)

Phoenix> CREATE INDEX index_name ON table_name (indexed_column1, indexed_column2, ...) [INCLUDE (covered_column1, covered_column2, ...)]

Phoenixの機能• セカンダリインデックス

• LOCAL INDEX• 書き込みが多いワークロードに向いている

• インデックス用の新しいColumnFamilyが作成される

• 書き込み時は1つのRegionへ

• 読み込み時には、基本的に複数のRegionにアクセスする

Phoenix> CREATE LOCAL INDEX index_name ON table_name (indexed_column1, indexed_column2, ...)

Phoenixの機能• Phoenix Query Server• PhoenixのHTTPゲートウェイ

• クエリはPhoenix Query Server経由で発行される

• JVM言語以外のアプリケーションからもアクセスできる

• Phoenix Query Server用のJDBCドライバ

Phoenixの機能• View• PhoenixはViewもサポートしている

• 現在のところ1つのテーブルへのViewのみサポート

• 条件によってRead-only ViewかUpdatable Viewになる

• Updatable Viewの例

Phoenix> CREATE VIEW mobile_product_metrics (carrier VARCHAR, dropped_calls BIGINT) AS SELECT * FROM product_metrics WHERE metric_type = ‘m';

Phoenix> UPSERT INTO mobile_product_metrics(created_by, create_date, metric_id, carrier, dropped_calls) VALUES('John Doe', CURRENT_DATE(), NEXT VALUE FOR metric_seq, 'Verizon', 20);

Phoenix> CREATE VIEW view_name AS SELECT column(s) FROM table_name [WHERE condition]

Phoenixの機能• Transaction• Apache TephraとApache Omidを使ったトランザクション実装

• どちらの実装もトランザクションマネージャーが必要

• まだ、プロダクションレディではない

Transaction Manager(Active)

Transaction Manager(Standby)

HBase

ZooKeeper

Client

まとめ• Apache HBaseについて

• HBase on Cloud• StoreFileのためのHBOSS

• HBaseの最新運用ツール

• HBCK2:HBase-2.xからのクラスタ修復ツール

• hbtop:UnixのtopコマンドライクなHBaseメトリクスのリアルタイムモニタリングツール

• Apache Phoenixについて

おわり• ご清聴ありがとうございました