20120423 hbase勉強会

53
Hbase勉強会 Chapter 6 Available Clients 2012423遠山敏章

Upload: toshiaki-toyama

Post on 31-May-2015

2.589 views

Category:

Technology


2 download

DESCRIPTION

O'reilly HBase The Definitive Guide Chapter 6 Available Clients

TRANSCRIPT

Page 1: 20120423 hbase勉強会

Hbase勉強会  Chapter  6  Available  Clients

2012年4月23日  遠山敏章

Page 2: 20120423 hbase勉強会

内容

•  利用可能なクライアントの紹介/説明  – インタラクティブなクライアント  •  Na8ve  Java,  REST,  Thri?,  Avroなど  

– バッチクライアント  •  MapReduce,  Hive,  Pig,  Cacading  

– Shellコマンド  •  Hbase  shellコマンド、スクリプティング(JRuby)  

– Web-­‐based  UI  •  Master  UI,  RegionServer  UI,  Shared  Pages  

Page 3: 20120423 hbase勉強会

REST,  Thri?,  Avro  の紹介(p241)

•  Hbase  のアクセス方法  – クライアントAPI:  Java  – プロキシ:  あらゆる言語  •  内部はHtableのクライアントAPI  

•  Gatewayとクライント間のプロトコルはリモートクライアントの要求しだいで決まる  – REST  (Representa8onal  State  Transfer)  

Page 4: 20120423 hbase勉強会

REST

•  Webアプリの標準プロトコルであるHTTP経由なので、ヘテロなシステム間での通信に適している  

•  プロトコルを変更せずに既存の技術と互換性がある。  

•  URIでユニークにリソースにアクセス可。一方、SOAPは新しい標準に合わせるために新しいプロトコルを定義する。  

•  テキスト/XMLは冗長で帯域を消費する  •  → オーバーヘッドを減らす場合はProtocol  Buffers,  Thri?,  Avroを使う

Page 5: 20120423 hbase勉強会

Protocol  Buffersと  Thri?,  Avroの違い(p242)

•  Protocol  Bufferers    – RPC  スタックを持たない  – RPCの定義のみを生成  – HbaseのRESTサーバーをgatwayとして利用  

•  Thri?,  Avro  – 独自のRPCの実装を持つ  •  Hbaseのgatewayサーバーはその実装のラッパーを提

供する  

※RESTの実装はhbaseが独自に用意している

Page 6: 20120423 hbase勉強会

Gatewayとデプロイ先(p242) •  Gateway  サーバーはHtableベースのClient  APIを利用  •  Gatewayサーバーのデプロイ先  

–  RegionServerと同じマシン  –  GatwayServer専用のマシン  –  GatewayClientのマシン  

•  例:webServerにデプロイすると、  –  clientとgateway間通信をローカルで行う  –  gatewayとhbase間のRPCはna8ve  protocolで行う。  

Figure  6-­‐2  gatewayサーバー経由で接続したクライアント

Page 7: 20120423 hbase勉強会

デプロイ先を決めるにあたっての考慮すべき点

– マシンへの負荷  – 転送されるデータ量  – CPUサイクル、ネットワークバンド幅の枯渇しない

か  

Page 8: 20120423 hbase勉強会

コネクション(p243)

•  パフォーマンスの 大化にはコネクションの再利用が必要(p199  Htable  Pool)  – 短命のプロセスはコネクションの確立とメタデータ

の準備が実際の操作よりも時間がかかる。  – リージョン情報のキャッシングのためにコネクショ

ンを再利用するのは特に重要。  •  しないと、row-­‐to-­‐region  lookupをアクセスする度に行う。

Page 9: 20120423 hbase勉強会

RESTとThri?/Avroのユースケース(p244)

•  RESTユースケース  –  少数のリクエスト数でリクエストのサイズが大きいとき、有

効  –  ウェブベースなので、リバースプロキシやキャッシュの技

術が利用可能。  –  負荷分散のためにRESTサーバーを並列にデプロイする。  

•  例:全てのappサーバーにデプロイ(single-­‐app-­‐to-­‐server  rela8onship)  

•  Thri?/Avro  –  スループットの 大化したい時に有効  –  デプロイするサーバー数を少なくできる。  

•  例:Regionサーバーごとにデプロイ(many-­‐app-­‐to-­‐server  cardinality)  

Page 10: 20120423 hbase勉強会

Interac8veクライアント

•  クライアントAPIを必要に応じて発行(get,  put,  delete)  – Na8ve  Java(Chapter  3,  4)  •  Gateway  serverは不要。HTableを使ってRPC経由で通

信  

– REST  •  HbaseはClient  APIとadmin  APIをサポートしたRESTサー

バーを提供する。また、異なったフォーマットもサポート。  

Page 11: 20120423 hbase勉強会

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    #バージョンの表示

Page 12: 20120423 hbase勉強会

サポートしているフォーマット(p246) 

•  H]pのContents-­‐Type  と  Accept  ヘッダーを指定してRESTサーバーと異なるフォーマットで通信できる  

Page 13: 20120423 hbase勉強会

サポートしているフォーマット  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>…  

Page 14: 20120423 hbase勉強会

サポートしているフォーマット  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  

Page 15: 20120423 hbase勉強会

サポートしているフォーマット  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"}]}]}  

Page 16: 20120423 hbase勉強会

サポートしているフォーマット  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

Page 17: 20120423 hbase勉強会

サポートしているフォーマット  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

Page 18: 20120423 hbase勉強会

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番コンパクトなプロトコル

なので、帯域効率が一番良い

Page 19: 20120423 hbase勉強会

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

Page 20: 20120423 hbase勉強会

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      #  デーモンの停止

Page 21: 20120423 hbase勉強会

その他のクライアント(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プロトコルを利用。  •  メンテされていないプロジェクトもあるので注意  

Page 22: 20120423 hbase勉強会

バッチクライアント(p257)

•  大規模データの構築にバックグラウンドで非同期に実行される  – 使用例:インデックスの構築、機械学習ベースの

数学モデル、レポートに必要な統計  

•  ユーザー駆動型のアクセスではないためサービス品質保証はバッチの実行時間に連動する  

Page 23: 20120423 hbase勉強会

MapReduce(p257)

•  数PBのデータ処理を信頼性を確保して容易にプログラミングできる  

•  MapReduceジョブでHbaseをソース/ターゲットにする方法はいろいろある  

•  手法  – Na8ve  Java  (ch.  7)  – Clojure:  Hbase-­‐runnerはClojureでMapReduceジョ

ブを書くことができる

Page 24: 20120423 hbase勉強会

Hive  (p258)

•  Hadoop上のデータウェアハウスインフラ  •  HiveQL  – SQL-­‐likeなクエリー言語  – クエリはMRジョブに変換される  – データはジョブ実行時にパースされる  

•  Storage  Handler  – データソースの抽象レイヤー  – 例  •  HDFS、HBase(Hive  ver.  >=  0.6.0)

Page 25: 20120423 hbase勉強会

Hive  (p258)  

•  Hive  version  0.6.0  はHbaseのhandlerを同梱  •  必要に応じて、カラムのマッピングをできる  •  Row  keyは1つのカラムとして扱える  

Page 26: 20120423 hbase勉強会

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の修正

Page 27: 20120423 hbase勉強会

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  

Page 28: 20120423 hbase勉強会

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  

Page 29: 20120423 hbase勉強会

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  

Page 30: 20120423 hbase勉強会

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  

Page 31: 20120423 hbase勉強会

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>");  

Page 32: 20120423 hbase勉強会

Hive  (p262)

•  StorageHandlerは高レベルのレイヤーとして透過的に機能するためUDFも使用できる。  

•  欠点  – Serializa8onがカスタムできない  •  Hbaseは  byte[]  のみ保存するので、HiveはStringに全

て変換する  –  Ex.  Hive  の  INT  カラムの  12  は Bytes.toBytes(“12”)として扱わ

れ、文字列になる  

– Hbase  のversionの指定をサポートしない

•  新のversionをHiveは返す  

Page 33: 20120423 hbase勉強会

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)  

Page 34: 20120423 hbase勉強会

Pig(p.264)

•  Pigはlocalモードで起動すれば、1つのプロセスでMRが実行されるのでテストやプロトタイピングに役立つ  

•  DUMPやSTOREで結果を出力する  •  Pig  La8nは名前やフィールドの大文字、小文字を区別

する。通常は大文字で記述する。

hbase(main):001:0>  create  'excite',  'colfam1’    $pig  –x  local    

Page 35: 20120423 hbase勉強会

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');  

Page 36: 20120423 hbase勉強会

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  を連結した文字列  

Page 37: 20120423 hbase勉強会

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)  …  

Page 38: 20120423 hbase勉強会

Pig(p.266)

•  欠点  – Hbase  のversionの指定をサポートしない

•  新のversionをPigは返す  

– 固定のカラムマッピング  •  rowKeyは必ず 初のフィールドにしなければならない  •  FOREAH  …  GENERATE  文でフィールドの順序を変更す

る事ができる  

Page 39: 20120423 hbase勉強会

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  

Page 40: 20120423 hbase勉強会

Shell  (p268,  p269)

•  Hbase  shell  は  local/remoteのHbaseクラスターをインタラクティブに操作するCLI  

•  クライアントとadminのオペレーションができる  •  Jrubyベースのshell  – コマンド履歴、コマンドの補完、rubyのコマンドを

サポート  

•  Jrubyを実行するためのJARを同梱しているのでrubyのインストールは不要  

Page 41: 20120423 hbase勉強会

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  

Page 42: 20120423 hbase勉強会

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'  

Page 43: 20120423 hbase勉強会

出力の制限(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  

Page 44: 20120423 hbase勉強会

その他のコマンド(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  

Page 45: 20120423 hbase勉強会

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  

Page 46: 20120423 hbase勉強会

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  

Page 47: 20120423 hbase勉強会

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  

Page 48: 20120423 hbase勉強会

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")  }  

Page 49: 20120423 hbase勉強会

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)  

Page 50: 20120423 hbase勉強会

Web-­‐based  UI  (p277-­‐279) •  Mainページ(Figure  6-­‐8)  

–  RegionServer属性  •  クラスター全体の詳細  

–  実行中のタスク(Figure  6-­‐3)  •  マスターによって行われた内部オペレーション  •  背景の色:白→実行中、緑→成功、黄→中止  

–  Catalog  テーブル  •  .META.,  -­‐ROOT-­‐  の詳細  

–  ユーザーテーブル  •  全てのテーブルのリスト  

–  リージョンサーバー  •  マスターに登録されているリージョンサーバーのリスト  

–  移行中のリージョン(Figure  6-­‐4)  •  ロードバランシング中のリージョンのリスト。リージョンのopen,  close,  splitしているリージョン。リージョンのライフサイクルはp348を参照。  

Page 51: 20120423 hbase勉強会

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できない。  

Page 52: 20120423 hbase勉強会

Web-­‐based  UI  (p282)

•  ZooKeeperページ(Figure  6-­‐7)  – ZooKeeper内に保存されている全てのノードのコ

ンテンツをダンプ(zk_dumpコマンド)  •  トラブルシューティングに役立つ  

– zk_dumpの内容  •  現在のMasterサーバー  •  どのRegionServerが-­‐ROOT-­‐カタログを保持しているか  •  Masterに登録されているRegionServer  •  ZooKeeperの内部の詳細  

Page 53: 20120423 hbase勉強会

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)