20120423 hbase勉強会
DESCRIPTION
O'reilly HBase The Definitive Guide Chapter 6 Available ClientsTRANSCRIPT
Hbase勉強会 Chapter 6 Available Clients
2012年4月23日 遠山敏章
内容
• 利用可能なクライアントの紹介/説明 – インタラクティブなクライアント • Na8ve Java, REST, Thri?, Avroなど
– バッチクライアント • MapReduce, Hive, Pig, Cacading
– Shellコマンド • Hbase shellコマンド、スクリプティング(JRuby)
– Web-‐based UI • Master UI, RegionServer UI, Shared Pages
REST, Thri?, Avro の紹介(p241)
• Hbase のアクセス方法 – クライアントAPI: Java – プロキシ: あらゆる言語 • 内部はHtableのクライアントAPI
• Gatewayとクライント間のプロトコルはリモートクライアントの要求しだいで決まる – REST (Representa8onal State Transfer)
REST
• Webアプリの標準プロトコルであるHTTP経由なので、ヘテロなシステム間での通信に適している
• プロトコルを変更せずに既存の技術と互換性がある。
• URIでユニークにリソースにアクセス可。一方、SOAPは新しい標準に合わせるために新しいプロトコルを定義する。
• テキスト/XMLは冗長で帯域を消費する • → オーバーヘッドを減らす場合はProtocol Buffers, Thri?, Avroを使う
Protocol Buffersと Thri?, Avroの違い(p242)
• Protocol Bufferers – RPC スタックを持たない – RPCの定義のみを生成 – HbaseのRESTサーバーをgatwayとして利用
• Thri?, Avro – 独自のRPCの実装を持つ • Hbaseのgatewayサーバーはその実装のラッパーを提
供する
※RESTの実装はhbaseが独自に用意している
Gatewayとデプロイ先(p242) • Gateway サーバーはHtableベースのClient APIを利用 • Gatewayサーバーのデプロイ先
– RegionServerと同じマシン – GatwayServer専用のマシン – GatewayClientのマシン
• 例:webServerにデプロイすると、 – clientとgateway間通信をローカルで行う – gatewayとhbase間のRPCはna8ve protocolで行う。
Figure 6-‐2 gatewayサーバー経由で接続したクライアント
デプロイ先を決めるにあたっての考慮すべき点
– マシンへの負荷 – 転送されるデータ量 – CPUサイクル、ネットワークバンド幅の枯渇しない
か
コネクション(p243)
• パフォーマンスの 大化にはコネクションの再利用が必要(p199 Htable Pool) – 短命のプロセスはコネクションの確立とメタデータ
の準備が実際の操作よりも時間がかかる。 – リージョン情報のキャッシングのためにコネクショ
ンを再利用するのは特に重要。 • しないと、row-‐to-‐region lookupをアクセスする度に行う。
RESTとThri?/Avroのユースケース(p244)
• RESTユースケース – 少数のリクエスト数でリクエストのサイズが大きいとき、有
効 – ウェブベースなので、リバースプロキシやキャッシュの技
術が利用可能。 – 負荷分散のためにRESTサーバーを並列にデプロイする。
• 例:全てのappサーバーにデプロイ(single-‐app-‐to-‐server rela8onship)
• Thri?/Avro – スループットの 大化したい時に有効 – デプロイするサーバー数を少なくできる。
• 例:Regionサーバーごとにデプロイ(many-‐app-‐to-‐server cardinality)
Interac8veクライアント
• クライアントAPIを必要に応じて発行(get, put, delete) – Na8ve Java(Chapter 3, 4) • Gateway serverは不要。HTableを使ってRPC経由で通
信
– REST • HbaseはClient APIとadmin APIをサポートしたRESTサー
バーを提供する。また、異なったフォーマットもサポート。
REST オペレーション(p244) • RESTサーバーはHbase tableの全ての操作が可
能 • オペレーションとXMLスキーマのドキュメント
h]p://hbase.apache.org/apidocs/org/apache/hadoop/hbase/rest/package-‐summary.html
• ステートレスなので、複数のサーバーで起動して負荷分散する事ができる(例:ラウンドロビン)。
$ bin/hbase rest # ヘルプの表示 $ bin/hbase rest start # 起動 $ bin/hbase-‐daemon.sh start rest # デーモンの起動 $ bin/hbase-‐daemon.sh stop rest # デーモンの停止 $ curl h]p://<servername>:8080/ # テーブルノリスト $ curl h]p://<servername>:8080/version #バージョンの表示
サポートしているフォーマット(p246)
• H]pのContents-‐Type と Accept ヘッダーを指定してRESTサーバーと異なるフォーマットで通信できる
サポートしているフォーマット text/plain (p246)
• バイトデータをURLエンコーディングして指定可能。
• ‘tes]able’テーブル, rowKey ‘%01%02%03’, colfam1:col1 のvalueを取得
• 複雑なresultをplain text にフォーマットできない。
$ curl -‐H "Accept: text/plain" h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 <html> <head> <meta h]p-‐equiv="Content-‐Type" content="text/html; charset=ISO-‐8859-‐1"/> <8tle>Error 406 Not Acceptable</8tle> </head>…
サポートしているフォーマット XML(text/plain) (p247)
• XMLはデフォルトのフォーマット • カラム名とvalueはBase64にエンコードされる。 • Base64 コマンドでコンテンツを取得できる。
$ curl h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 <?xml version="1.0" encoding="UTF-‐8" standalone="yes"?> <CellSet>
<Row key="AQID"> <Cell 8mestamp="1334479509580" column="Y29sZmFtMTpjb2wx">dmFsdWUx</Cell> </Row>
</CellSet> $ echo AQID | base64 -‐d | hexdump 0000000 01 02 03 0000003 $ echo Y29sZmFtMTpjb2wx | base64 -‐d colfam1:col1 $ echo dmFsdWUx | base64 -‐d Value1
サポートしているフォーマット JSON(applica8on/plain) (p247)
• ヘッダーで指定
• XMLとJSONの違いはJSONはkey/valueで指定しなければならない。’$’keyはcellのデータをを意味する。
$ curl -‐H "Accept: applica8on/json" h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 {"Row":[{"key":"AQID","Cell":[{"8mestamp": 1334479509580,"column":"Y29sZmFtMTpjb2wx","$":"dmFsdWUx"}]}]}
サポートしているフォーマット Protocol Buffer(applica8on/x-‐protobuf) (p247)
• ProtocolBufferはna8veのRPCスタックを提供しないのでRESTサーバーがencodingをサポート
• Schemaの定義はドキュメントを参照 • Hexdump コマンドでバイナリーフォーマットで
表示 $ curl -‐H "Accept: applica8on/x-‐protobuf" h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 | \ hexdump -‐C % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Le? Speed 0 38 0 38 0 0 11695 0 -‐-‐:-‐-‐:-‐-‐ -‐-‐:-‐-‐:-‐-‐ -‐-‐:-‐-‐:-‐-‐ 19000 00000000 0a 24 0a 03 01 02 03 12 1d 12 0c 63 6f 6c 66 61 |.$.........colfa| 00000010 6d 31 3a 63 6f 6c 31 18 cc b0 b5 a9 eb 26 22 06 |m1:col1......&".| 00000020 76 61 6c 75 65 31 |value1| 00000026
サポートしているフォーマット Raw binary(applica8on/octet-‐stream) (p249)
• 戻り値はcellのデータのみ
• RESTサーバーは構造データをカスタムヘッダーに詰める。
curl -‐D-‐ -‐H "Accept: applica8on/octet-‐stream" h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 HTTP/1.1 200 OK Content-‐Length: 6 X-‐Timestamp: 1334479509580 # raw getはcellの8mestampをresponse header に詰める Content-‐Type: applica8on/octet-‐stream
$ curl -‐H "Accept: applica9on/octet-‐stream" h]p://localhost:8080/tes]able/%01%02%03/colfam1:col1 | \ hexdump –C % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Le? Speed 0 6 0 6 0 0 196 0 -‐-‐:-‐-‐:-‐-‐ -‐-‐:-‐-‐:-‐-‐ -‐-‐:-‐-‐:-‐-‐ 206 00000000 76 61 6c 75 65 31 |value1| 00000006
REST Java client (p250) • RESTのJava API client – org.apache.hadoop.hbase.rest.client – 主要なクラス
• RemoteHTable (Example 6-‐1) • RemoteAdmin
• RemoteHTableはGet/Scanなどの標準のJava Client APIを使いながら、多くのRESTサーバーと通信するのに便利な手段
• Java REST client はprotocol buffer encodingをRESTサーバーの通信に利用 – RESTサーバーがサポートする1番コンパクトなプロトコル
なので、帯域効率が一番良い
Thri? (p251) • C++で実装 • 多くの言語のスキーマのコンパイラーを提供し、異なる言
語間で透過的にメッセージ交換できる。 • Hbaseにはclient/admin APIのスキーマファイルが同梱され
ている。 • Thri?と通信するJavaの生成されたコードはHbaseに同梱済
み。 • php の設定例(p253、省略)
[ hbase-‐0.90.4-‐cdh3u2 でのコードの生成例 ] $ cd hbase-‐0.90.4-‐cdh3u2/src/examples/thri? $ thri? -‐-‐gen cpp -‐-‐gen java -‐-‐gen rb -‐-‐gen py -‐-‐gen php \ ../../../src/main/resources/org/apache/hadoop/hbase/thri?/Hbase.thri? $ ls ./ | grep gen | tr '\012' ' ' gen-‐cpp gen-‐java gen-‐php gen-‐py gen-‐rb
Avro (p255) • Thri?と同様に、多くの言語のスキーマのコンパイラーを提供し、異なる言
語間で透過的にメッセージ交換できる。 • Hbaseテーブルの全ての操作をAvroサーバーは提供する • ドキュメント
– Javadoc: • h]p://hbase.apache.org/apidocs/org/apache/hadoop/hbase/avro/package-‐
summary.html#pbufschema – スキーマ:
• $HBASE_HOME/src/main/java/org/apache/hadoop/hbase/avro/hbase.avdl • ステートレスなので負荷分散のために複数のAvroサーバーをデプロイし、
ラウンドロビンでロードバランスするのも有効。
[ hbase shell 操作 ] $ bin/hbase avro # ヘルプの表示 $ bin/hbase avro start # 起動 $ bin/hbase-‐daemon.sh start avro # デーモンの起動 $ bin/hbase-‐daemon.sh stop avro # デーモンの停止
その他のクライアント(p256)
• Jvm上で動いたり、gatewayサーバーと通信したりするクライアントが存在する
• プロジェクト例 – JRuby: jvmベースの言語。例はhbase shell – HBsql: SQLライクな構文を提供 – Hbase-‐DSL: Builderライクにクエリーを構築できるクラスを
提供 – JPA/JPO: JPA/JPOアクセス層を提供。例はDataNucleus – PyHBase: Avro gataway server経由のHbase client – AsyncHBase: 非同期、ノンブロッキング、スレッドセーフな
クライアント。Na8veのRPCプロトコルを利用。 • メンテされていないプロジェクトもあるので注意
バッチクライアント(p257)
• 大規模データの構築にバックグラウンドで非同期に実行される – 使用例:インデックスの構築、機械学習ベースの
数学モデル、レポートに必要な統計
• ユーザー駆動型のアクセスではないためサービス品質保証はバッチの実行時間に連動する
MapReduce(p257)
• 数PBのデータ処理を信頼性を確保して容易にプログラミングできる
• MapReduceジョブでHbaseをソース/ターゲットにする方法はいろいろある
• 手法 – Na8ve Java (ch. 7) – Clojure: Hbase-‐runnerはClojureでMapReduceジョ
ブを書くことができる
Hive (p258)
• Hadoop上のデータウェアハウスインフラ • HiveQL – SQL-‐likeなクエリー言語 – クエリはMRジョブに変換される – データはジョブ実行時にパースされる
• Storage Handler – データソースの抽象レイヤー – 例 • HDFS、HBase(Hive ver. >= 0.6.0)
Hive (p258)
• Hive version 0.6.0 はHbaseのhandlerを同梱 • 必要に応じて、カラムのマッピングをできる • Row keyは1つのカラムとして扱える
Hbase Versionサポート(p258)
• Hive ver. 0.7.0はHbase 0.89.0-‐SNAPSHOTのみサポート(執筆時) – RPCはversionの変更にセンシティブなためマイ
ナーな違いもbail out する。 • 現在のHbaseのバージョンで利用するにはHbaseのjarを置き換えて、hiveをソースからコンパイルする方法がある
• Hbaseにアクセスするための手順 – Conf/hive-‐env.shの修正
Hive (p260)
• テーブルの作成とデータのロード
$ build/dist/bin/hive Hive history file=/tmp/larsgeorge/hive_job_log_larsgeorge_201105251455_2009910117.txt hive> CREATE TABLE pokes (foo INT, bar STRING); OK Time taken: 3.381 seconds hive> LOAD DATA LOCAL INPATH '/opt/hive-‐0.7.0/examples/files/kv1.txt' OVERWRITE INTO TABLE pokes; Copying data from file:/opt/hive-‐0.7.0/examples/files/kv1.txt Copying file: file:/opt/hive-‐0.7.0/examples/files/kv1.txt Loading data to table default.pokes Deleted file:/user/hive/warehouse/pokes OK Time taken: 0.266 seconds
Hive (p260) • Hbaseテーブルとのマッピング – SERDEPROPERTIES:
• “Hbase.columns.mapping”=“:key,cf1:val” – Hiveの”key”カラムをhbaseのrowKeyにする
– TBLEPROPERTIES: • “hbase.table.name”=“hbase_table_1”
– Hiveのテーブル名”hbase_table_1” – HbaseとHiveで異なった名前の時のみ必要
hive> CREATE TABLE hbase_table_1(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES ("hbase.table.name" = "hbase_table_1"); OK Time taken: 0.144 seconds
Hive (p261)
• HiveテーブルpokesからHbaseのテーブルへのデータのロード – pokes.foo -‐> rowKey – pokes.bar -‐> hbase “cf:val”
• エラーが出たらlocalモードでやるとよい(Hive v0.70) – Hive> SET mapred.job.tracker=local
hive> INSERT OVERWRITE TABLE hbase_table_1 SELECT * FROM pokes; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks is set to 0 since there's no reduce operator Execu8on log at: /tmp/larsgeorge/larsgeorge_20110525152020_de5f67d1-‐9411-‐446f-‐99bb-‐35621e1b259d.log Job running in-‐process (local Hadoop) 2011-‐05-‐25 15:20:31,031 null map = 100%, reduce = 0% Ended Job = job_local_0001 OK Time taken: 3.925 seconds
Hive (p261-‐262)
• Hiveのpokes テーブルとhbase_table_1 テーブルのCount – Hbaseのテーブルのcountが100以上少ないのは、Hbaseにロードした時にrowKeyが上書きされたため
hive> select count(*) from pokes; … 500 Time taken: 3.627 seconds hive> select count(*) from hbase_table_1; … 309 Time taken: 4.542 seconds hive> select count(dis8nct foo) from pokes; … 309 Time taken: 3.5325 seconds
hive> drop table pokes; OK Time taken: 0.741 seconds hive> drop table hbase_table_1; OK Time taken: 3.132 seconds
Hive (p262) • 既存のHbaseテーブルをHiveのテーブルにマップする事も可能。
– 複数のHiveテーブルへのマッピングも可能 • Hiveの EXTERNALキーワードを使用
– Hiveでdropした場合、Hbaseのテーブルは削除されず、メタデータのみ除去される。 • その他のマッピングの種類
– HbaseのどのカラムをHiveの1つのカラムにマッピング – カラムファミリ全体をHiveのMAPタイプにマッピング
• (足跡)HiveでマッピングしていないHbaseのカラムはHiveクエリからアクセスできない。
hive> CREATE EXTERNAL TABLE hbase_table_2(key int, value string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val") TBLPROPERTIES("hbase.table.name" = "<exis8ng-‐table-‐name>");
Hive (p262)
• StorageHandlerは高レベルのレイヤーとして透過的に機能するためUDFも使用できる。
• 欠点 – Serializa8onがカスタムできない • Hbaseは byte[] のみ保存するので、HiveはStringに全
て変換する – Ex. Hive の INT カラムの 12 は Bytes.toBytes(“12”)として扱わ
れ、文字列になる
– Hbase のversionの指定をサポートしない
• 新のversionをHiveは返す
Pig (p263) • Pig La8n言語を持つ高レベルクエリー言語 • 命令的なプログラミングスタイル
– 入力データを出力データにするまでの変換手順を記述できる • Pig v0.7.0の LoadFunc/StoreFunc はHDFS以外をデータ
ソースにできる • HBaseStorage クラスはHbaseをソースとする
– 既存のテーブルのread/writeができる – TableのカラムをPigのtupleにマッピングできる
• Readでは 初のフィールドをrowKeyとして扱える(オプション) • Writeでは 初のフィールドは常にrowKeyになる
– 基本的なfilteringをrowの粒度でサポート – 比較演算子もサポート(p139)
Pig(p.264)
• Pigはlocalモードで起動すれば、1つのプロセスでMRが実行されるのでテストやプロトタイピングに役立つ
• DUMPやSTOREで結果を出力する • Pig La8nは名前やフィールドの大文字、小文字を区別
する。通常は大文字で記述する。
hbase(main):001:0> create 'excite', 'colfam1’ $pig –x local
Pig(p.264, 265) • Exciteの検索ログファイルのHbaseテーブルへのSTORE
– Tuple: user ID, 8mestamp, search term – rowKey: user ID と 8mestamp の複合キー
• Keyをユニークにするため – STOREはMRジョブをsubmitする
• colfam1:query にsearch termを保存
$ cat /usr/local/pig/tutorial/data/excite-‐small.log | head -‐n 2 2A9EABFB35F5B954 970916105432 +md foods +proteins BED75271605EBD0C 970916001949 yahoo chat grunt> raw = LOAD '/usr/local/pig/tutorial/data/excite-‐small.log' \ USING PigStorage('\t') AS (user, 8me, query); T = FOREACH raw GENERATE CONCAT(CONCAT(user, '\u0000'), 8me), query; STORE T INTO 'excite' USING \ org.apache.pig.backend.hadoop.hbase.HBaseStorage('colfam1:query');
Pig(p.266)
• HbaseのexciteテーブルのLOAD (その1) – rowKeyを 初のフィールドとする – AS()でPigの文字列型で取得するように指定 • デフォルトはbytearray
grunt> R = LOAD 'excite' USING \ org.apache.pig.backend.hadoop.hbase.HBaseStorage('colfam1:query', '-‐loadKey') \ AS (key: chararray, query: chararray); grunt> DUMP R; ... Success! ... (002BB5A52580A8ED970916150445,margaret laurence the stone angel) (002BB5A52580A8ED970916150505,margaret laurence the stone angel) ... # キーはuser ID と 8mestamp を連結した文字列
Pig(p.266)
• HbaseのexciteテーブルのLOAD (その2) – 初のフィールドをsplitして2つのフィールド(user, 8me)にする
– AS()でPigの文字列型, long型で取得するように指定
grunt> S = foreach R generate FLATTEN(STRSPLIT(key, '\u0000', 2)) AS \ (user: chararray, 8me: long), query; grunt> DESCRIBE S; S: {user: chararray,8me: long,query: chararray} grunt> DUMP S; (002BB5A52580A8ED,970916150445,margaret laurence the stone angel) (002BB5A52580A8ED,970916150505,margaret laurence the stone angel) …
Pig(p.266)
• 欠点 – Hbase のversionの指定をサポートしない
• 新のversionをPigは返す
– 固定のカラムマッピング • rowKeyは必ず 初のフィールドにしなければならない • FOREAH … GENERATE 文でフィールドの順序を変更す
る事ができる
Cascading (p267) • MapReduceの代替のAPI
– MapReduceので考えずに開発が行え、Hadoop上でジョブの実行ができる
• 構成要素 – Pipe – データソース: tap – 出力ソース: sink
• Tapとsinkをpipeでつなげて、処理フローを構成できる。 • 複数のpipeを互いにつなげて、より大きなpipeを組み立てられる • データはパイプラインを通って、split, merge, grouping, join するこ
とができる。 • データはtupleで表現される • v1.01でHbaseクラスターから読み書きするモジュールを提供する • Cascading上のDSLを提供するプロジェクトもある
– Ex. cascalog, scalding, cascading.jruby
Shell (p268, p269)
• Hbase shell は local/remoteのHbaseクラスターをインタラクティブに操作するCLI
• クライアントとadminのオペレーションができる • Jrubyベースのshell – コマンド履歴、コマンドの補完、rubyのコマンドを
サポート
• Jrubyを実行するためのJARを同梱しているのでrubyのインストールは不要
Shell (p269, p270) • 基本コマンド – help: ヘルプ表示 – exit: 終了 – $HBASE_HOME/bin/hbase shell –h
• コマンドラインオプションの表示 – debug:
• Debugモードの切り替え 。OFFだとERRORレベルで出力。 • 設定ファイルはHBASE_HOMEディレクトリが適用され
る • 特定のディレクトリ配下の設定を指定する場合 – $ HBASE_CONF_DIR="/<your-‐other-‐config-‐dir>/" bin/hbase shell
Commnds (p271) • ガイドライン
– 名前のクオート • テーブル名/カラム名はシングル/ダブルクオートする
– Valueのクオート • 8/16進数表記のバイナリvalueの入出力をサポート • シングルクオートはリテラルとして扱う • ダブルクオートは8進/16進をバイトに変換する
– Ex. hbase> put 't1', "test\xef\xff", 'f1:', "\x01\x33\x70" – コンマ区切りのパラメータ
• Ex. hbase(main):001:0> get 'tes]able', 'row-‐1’, 'colfam1:qual1’ – プロパティのためのRuby ハッシュ
• Ex. hbase(main):001:0> create 'tes]able', {NAME=>'colfam1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}
• コマンドごとの詳細なヘルプの表示するhelp – Ex. hbase(main):001:0> help 'status'
出力の制限(p271)
• MAXLENGTH パラメータでconsoleに出力するvalueの長さの 大値を指定できる
hbase(main):001:0> put 'tes]able','rowlong','colfam1:qual1','abcdefghijklmnopqrstuvwxyzabcdefghi \ jklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcde \ ... xyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz' hbase(main):018:0> get 'tes]able', 'rowlong', MAXLENGTH => 60 COLUMN CELL colfam1:qual1 8mestamp=1306424577316, value=abcdefghijklmnopqrstuvwxyzabc
その他のコマンド(p272-‐274) • 一般的なコマンド(table 6-‐1): cluster status
– status, version • データの定義(table 6-‐2): admin API
– alter, create, describe, disable, drop, enable, exists, is_disabled, is_enabled, list
• データ操作 (table 6-‐3): client API – count, delete, deleteall, get, get_counter, incr, put, scan, truncaste
• ツール(table 6-‐4): admin API – assign, balance_switch, balancer, close_region, compact, flush, major_compact, move, split, unassign, zk_dump
• レプリケーション(table 6-‐5): – add_peer, disable_peer, enable_peer, remove_peer, start_replica8on, stop_replica8on
Scrip8ng (p274)
• cron/atなどでスケジュールしてメンテナンスしたり、クラスターのモニタリングに活用
• パイプ、rbスクリプト、jrubyを用いる $ echo "status" | bin/hbase shell $ cat ~/hbase-‐shell-‐status.rb status $ bin/hbase shell ~/hbase-‐shell-‐status.rb 1 servers, 0 dead, 44.0000 average load HBase Shell; enter 'help<RETURN>' for list of supported commands. Type "exit<RETURN>" to leave the HBase Shell Version 0.91.0-‐SNAPSHOT, r1127782, Thu May 26 10:28:47 CEST 2011 hbase(main):001:0> exit
Scrip8ng (p275)
• Jrubyでjavaのクラスを使用できる
$ cat ~/hbase-‐shell-‐status-‐2.rb include Java import org.apache.hadoop.hbase.HBaseConfigura8on import org.apache.hadoop.hbase.client.HBaseAdmin conf = HBaseConfigura8on.new admin = HBaseAdmin.new(conf) tables = admin.listTables tables.each { |table| puts table.getNameAsString() } $ bin/hbase org.jruby.Main ~/hbase-‐shell-‐status-‐2.rb Tes]able
Scrip8ng (p275, 256)
• irbの組み込み機能である、コマンド補完、コマンド履歴を使用できる
• Irb上でjavaのクラスを使用できる
$ cat ~/.irbrc require 'irb/ext/save-‐history' IRB.conf[:SAVE_HISTORY] = 100 IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-‐save-‐history” hbase(main):001:0> org.apache.hadoop.hbase.u8l.Bytes.toInt( "\x00\x01\x06[".to_java_bytes) => 67163
Scrip8ng (p256) # epoch時刻の取得 hbase(main):002:0> java.text.SimpleDateFormat.new("yyyy/MM/dd HH:mm:ss").parse( \ "2011/05/30 20:56:29").getTime() => 1306781789000 # 時刻の取得 hbase(main):002:0> java.u8l.Date.new(1306781789000).toString() => "Mon May 30 20:56:29 CEST 2011" #ループを使ってテストデータをPUT hbase(main):003:0> for i in 'a'..'z' do for j in 'a'..'z' do put 'tes]able', \ "row-‐#{i}#{j}", "colfam1:#{j}", "#{j}" end end # 年月日の文字列をqualifier、 # ランダムなLongの数値を配列にし、文字列に変換した値をvalueにPUT hbase(main):004:0> require 'date'; import java.lang.Long import org.apache.hadoop.hbase.u8l.Bytes (Date.new(2011, 01, 01)..Date.today).each { |x| put "tes]able", "daily", \ "colfam1:" + x.str?ime("%Y%m%d"), Bytes.toBytes(Long.new(rand * \ 4000).longValue).to_a.pack("CCCCCCCC") }
Web-‐based UI (p277)
• Web-‐based UIのポート – Master UIポート: 60010 – ResgionServer ポート: 60030
• Hbase-‐site.xmlの Hbase.master.info.port, hbase.regionserver.info.port で変更可能
• Master UI ページの構成 – Mainページ(Figure 6-‐2) – User Tableページ(Figure 6-‐5) – ZooKeeperページ(Figure 6-‐7)
Web-‐based UI (p277-‐279) • Mainページ(Figure 6-‐8)
– RegionServer属性 • クラスター全体の詳細
– 実行中のタスク(Figure 6-‐3) • マスターによって行われた内部オペレーション • 背景の色:白→実行中、緑→成功、黄→中止
– Catalog テーブル • .META., -‐ROOT-‐ の詳細
– ユーザーテーブル • 全てのテーブルのリスト
– リージョンサーバー • マスターに登録されているリージョンサーバーのリスト
– 移行中のリージョン(Figure 6-‐4) • ロードバランシング中のリージョンのリスト。リージョンのopen, close, splitしているリージョン。リージョンのライフサイクルはp348を参照。
Web-‐based UI (p279-‐281) • User Table Page: ユーザーテーブルのリンクをクリックすると出る
ページ(Figure 6-‐5) – テーブル属性
• テーブルの状態などを表示 – テーブルリージョン
• startKey, endKey, リクエストの総数(read/write) • “Not deploy”はどのRegionServerでのサーブされていないリージョン
– Regions by region server • RegionServerごとのリージョン数。通常は均等に分散されている。されてなけ
れば、moveコマンドで手動でリージョンの移動可能。 • Adminのオペレーションの実行
– Compact • コンパクションをバックグランドで非同期に実行。任意でリージョン名を指定可
能。 – Split
• テーブル、又は、リージョンの範囲でsplitコマンドを実行。セルが全くなかったり、ほとんどない場合、又は、splitの 中のリージョンはsplitできない。
Web-‐based UI (p282)
• ZooKeeperページ(Figure 6-‐7) – ZooKeeper内に保存されている全てのノードのコ
ンテンツをダンプ(zk_dumpコマンド) • トラブルシューティングに役立つ
– zk_dumpの内容 • 現在のMasterサーバー • どのRegionServerが-‐ROOT-‐カタログを保持しているか • Masterに登録されているRegionServer • ZooKeeperの内部の詳細
Web-‐based UI (p283)
• Shared Pages – Local logs (Figure 6-‐9) • ログファイルを表示
– Thread dumps (Figure 6-‐10) • デバッグ目的で、Hbaseのプロセスのスタックとレース
を表示 – Log level • Hbaseプロセスのログレベルの取得/設定ができる • Ex. org.apache.hadoop.hbase を第一フィールドに入力(Figure6-‐12)