マルチテナント環境でのHBaseの改善

HBase

Hadoop関連(全部俺) Advent Calendar 2014:10日目の記事です

「HBase徹底入門」発売決定!

O’ReillyのHBase(馬本)も第2版に向けて執筆が進んでいるようですが、日本でも、翔泳社から「HBase徹底入門」が発売されるとのビッグニュースがありました。(Amazonで予約が開始されたようです。発売日は2015/1/28)。楽しみですね。発売されたらじっくり拝読して勉強します!

マルチテナントでのHBase

さて、昨日のClouderaのブログに「New in CDH 5.2: Improvements for Running Multiple Workloads on a Single HBase Cluster」という記事が掲載されました。HBaseは現在 1.0.0版に向けて作業が進んでいます。(最新版は2014/12/10時点で、0.98.8と0.99.2)
マルチテナント環境でHBase(やHadoop)を使用する場合、パフォーマンスの影響、容量を制限、セキュリティなどを考慮する必要があります。
CDH5.2でのHBase 0.98+αでは、複数のユーザが複数のワークロードを、同じクラスタで実行したときにうまく扱うための機能が追加されています。Clouderaのブログから(個人的に)興味深い点を取り上げてみます。
※詳細が必要な方は原文をご覧下さい。また、間違いを発見した方はご指摘ください。

マルチテナントでの問題

  • 物理的な分離やパーティショニング
  • スケジューリング
  • クォータ

HBaseでは、HBASE-10994 – HBase Multitenancy でこれらの課題に関する作業が行われています。

Throttling

HDFS-11598の新しいスロットル機能では、特定のユーザーやテーブル、ネームスペースに対して、時間あたりのリクエスト回数、またはデータあたりのリクエスト回数の制限を強制することができます。
例:

  • テーブルAは、1分あたりX回の要求に制限
  • ネームスペースBは、1時間あたりY回の要求に制限
  • テーブルZのユーザーKは、1秒あたりKZ MBに制限

設定はhbase shellから行うことができます。
[shell gutter=”false”]
hbase> set_quota TYPE => THROTTLE, USER => ‘u1′, LIMIT => ’10req/sec’
hbase> set quota TYPE => THROTTLE, USER => ‘u1’, NAMESPACE => ‘ns1′, LIMIT => ’10M/sec’
[/shell]
これは面白い、、。しかし設定するのは簡単ですが、どのように割り当てるかは難しそうです。

Request Queue

リージョンサーバーが複数のリクエストを受け取ったとき、空いている実行スロット(free execution slot)を待つために、キューに置かれます。単純なキューはFIFOキューであり、新しい「deadline」というキューを設定することができます。

複数の種類のキュー、複数のキュー

キューの使用により、異なる種類の要求の優先度を与えることができるので、一つのキューに対するscan要求を分離することができます。
また、複数のキューがあることで、多くのプライオリティを与えることでreadとwriteの要求を分離できるようです。
今後はユーザーごとのキュー、コストベースのスケジューリングの対応などが行われそうなので、マルチテナント環境でもHBaseを利用しやすくなりそうですね。

 G1GCとHBase

HBaseにおけるGC(特にstop the world)は大惨事になることが多いです。これをJava7のG1GCで停止時間が短くなる、というブログも公開されています。
http://blog.cloudera.com/blog/2014/12/tuning-java-garbage-collection-for-hbase/
元ネタはインテルのブログです:-> リンク。(未だPart2が公開されないのが残念)
jdk7u21とjdk7u60での比較資料によると、u60ではGCの回数が増えてますが、平均時間はかなり短くなっていますね。チューニング方法(パラメータ)などはインテルのブログに書かれています。
安定したHBaseの運用の手助けとなりそうです。

コメント