SlideShare ist ein Scribd-Unternehmen logo
1 von 53
Downloaden Sie, um offline zu lesen
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の全ての操作が可
            能	
  
	
  $	
  bin/hbase	
  rest 	
   	
   	
   	
   	
   	
  #	
  ヘルプの表示	
	
  $	
  bin/hbase-­‐daemon.sh	
  start	
  rest 	
   	
   	
  #	
  デーモンの起動	
 $	
  bin/hbase	
  rest	
  start 	
          	
           	
   	
   	
  #	
  起動	

 $	
  bin/hbase-­‐daemon.sh	
  stop	
  rest               	
   	
   	
  #	
  デーモンの停止	
	
  $	
  curl	
  h]p://<servername>:8080/	
  	
  	
  	
   	
   	
   	
  #	
  テーブルノリスト	
 $	
  curl	
  h]p://<servername>:8080/version 	
                    	
  #バージョンの表示	
	
  
•  オペレーションとXMLスキーマのドキュメント	
  
     h]p://hbase.apache.org/apidocs/org/apache/hadoop/
     hbase/rest/package-­‐summary.html	
  
•  ステートレスなので、複数のサーバーで起動して
   負荷分散する事ができる(例:ラウンドロビン)。	
  
サポートしているフォーマット(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)	
•  ヘッダーで指定	
  
	
  
 $	
  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"}]}]}	
  



•  XMLとJSONの違いはJSONはkey/valueで指定
   しなければならない。’$’keyはcellのデータを
   を意味する。	
  
サポートしているフォーマット	
  
            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のデータのみ	
  
$	
  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サーバーは構造データをカスタムヘッダー
             に詰める。	
  
 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
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>	
  drop	
  table	
  pokes;	
  
	
  
                                                                                             OK	
  
hive>	
  select	
  count(*)	
  from	
  hbase_table_1;	
  
                                                                                             Time	
  taken:	
  0.741	
  seconds	
  
…	
  
                                                                                             	
  
309	
  
                                                                                             hive>	
  drop	
  table	
  hbase_table_1;	
  
Time	
  taken:	
  4.542	
  seconds	
  
                                                                                             OK	
  
	
  
                                                                                             Time	
  taken:	
  3.132	
  seconds	
  
hive>	
  select	
  count(dis8nct	
  foo)	
  from	
  pokes;	
  	
  	
  	
  	
  	
  	
  	
  
…	
  
309	
  
Time	
  taken:	
  3.5325	
  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',	
  "testxefxff",	
  'f1:',	
  "x01x33x70"	
  
  –  コンマ区切りのパラメータ	
  
       •  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(	
  "x00x01x06[".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)

Weitere ähnliche Inhalte

Was ist angesagt?

CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼうDaiki Ichinose
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseMikio Hirabayashi
 
Ia 2016-12-15
Ia 2016-12-15Ia 2016-12-15
Ia 2016-12-15Ruo Ando
 
Mod lua
Mod luaMod lua
Mod luado_aki
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectSadayuki Furuhashi
 
HTTP/2時代のウェブサイト設計
HTTP/2時代のウェブサイト設計HTTP/2時代のウェブサイト設計
HTTP/2時代のウェブサイト設計Kazuho Oku
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_luaRyosuke MATSUMOTO
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2Masahide Yamamoto
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてMitsutoshi Aoe
 
Webサーバ勉強会_#1_108-114:ログとか
Webサーバ勉強会_#1_108-114:ログとかWebサーバ勉強会_#1_108-114:ログとか
Webサーバ勉強会_#1_108-114:ログとかDai Utsui
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいcharsbar
 
Hadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionHadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionCloudera, Inc.
 
Evolution of Impala #hcj2014
Evolution of Impala #hcj2014Evolution of Impala #hcj2014
Evolution of Impala #hcj2014Cloudera Japan
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyikeyat
 
CMS時代のバックアップノウハウを身につけよう!
CMS時代のバックアップノウハウを身につけよう!CMS時代のバックアップノウハウを身につけよう!
CMS時代のバックアップノウハウを身につけよう!Takashi Uemura
 

Was ist angesagt? (18)

CMSとPerlで遊ぼう
CMSとPerlで遊ぼうCMSとPerlで遊ぼう
CMSとPerlで遊ぼう
 
Kyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in JapaneseKyoto Tycoon Guide in Japanese
Kyoto Tycoon Guide in Japanese
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
Akka HTTP
Akka HTTPAkka HTTP
Akka HTTP
 
Ia 2016-12-15
Ia 2016-12-15Ia 2016-12-15
Ia 2016-12-15
 
Mod lua
Mod luaMod lua
Mod lua
 
gumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack ProjectgumiStudy#7 The MessagePack Project
gumiStudy#7 The MessagePack Project
 
HTTP/2時代のウェブサイト設計
HTTP/2時代のウェブサイト設計HTTP/2時代のウェブサイト設計
HTTP/2時代のウェブサイト設計
 
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
第2回 松本勉強会 2012 05 25 - apache2.4とmod_lua
 
コンテナ情報交換会2
コンテナ情報交換会2コンテナ情報交換会2
コンテナ情報交換会2
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
Webサーバ勉強会_#1_108-114:ログとか
Webサーバ勉強会_#1_108-114:ログとかWebサーバ勉強会_#1_108-114:ログとか
Webサーバ勉強会_#1_108-114:ログとか
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
CPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したいCPANの依存モジュールをもう少し正しく検出したい
CPANの依存モジュールをもう少し正しく検出したい
 
Hadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese VersionHadoop Troubleshooting 101 - Japanese Version
Hadoop Troubleshooting 101 - Japanese Version
 
Evolution of Impala #hcj2014
Evolution of Impala #hcj2014Evolution of Impala #hcj2014
Evolution of Impala #hcj2014
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
 
CMS時代のバックアップノウハウを身につけよう!
CMS時代のバックアップノウハウを身につけよう!CMS時代のバックアップノウハウを身につけよう!
CMS時代のバックアップノウハウを身につけよう!
 

Andere mochten auch

Upgrading from HDP 2.1 to HDP 2.2
Upgrading from HDP 2.1 to HDP 2.2Upgrading from HDP 2.1 to HDP 2.2
Upgrading from HDP 2.1 to HDP 2.2SATOSHI TAGOMORI
 
まだ間に合う HBaseCon2016
まだ間に合う HBaseCon2016まだ間に合う HBaseCon2016
まだ間に合う HBaseCon2016Hirotaka Kakishima
 
Storage infrastructure using HBase behind LINE messages
Storage infrastructure using HBase behind LINE messagesStorage infrastructure using HBase behind LINE messages
Storage infrastructure using HBase behind LINE messagesLINE Corporation (Tech Unit)
 
HBase スキーマ設計のポイント
HBase スキーマ設計のポイントHBase スキーマ設計のポイント
HBase スキーマ設計のポイントdaisuke-a-matsui
 
Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24wyukawa
 
Osc2012 spring HBase Report
Osc2012 spring HBase ReportOsc2012 spring HBase Report
Osc2012 spring HBase ReportSeiichiro Ishida
 
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)tatsuya6502
 
Presto - Hadoop Conference Japan 2014
Presto - Hadoop Conference Japan 2014Presto - Hadoop Conference Japan 2014
Presto - Hadoop Conference Japan 2014Sadayuki Furuhashi
 
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13w
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13wスケーラブルなシステムのためのHBaseスキーマ設計 #hcj13w
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13wCloudera Japan
 
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜Takahiro Inoue
 
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduce
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduceAWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduce
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduceAmazon Web Services Japan
 
HBase×Impalaで作るアドテク 「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015SummerHBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク 「GMOプライベートDMP」@HBaseMeetupTokyo2015SummerMichio Katano
 

Andere mochten auch (12)

Upgrading from HDP 2.1 to HDP 2.2
Upgrading from HDP 2.1 to HDP 2.2Upgrading from HDP 2.1 to HDP 2.2
Upgrading from HDP 2.1 to HDP 2.2
 
まだ間に合う HBaseCon2016
まだ間に合う HBaseCon2016まだ間に合う HBaseCon2016
まだ間に合う HBaseCon2016
 
Storage infrastructure using HBase behind LINE messages
Storage infrastructure using HBase behind LINE messagesStorage infrastructure using HBase behind LINE messages
Storage infrastructure using HBase behind LINE messages
 
HBase スキーマ設計のポイント
HBase スキーマ設計のポイントHBase スキーマ設計のポイント
HBase スキーマ設計のポイント
 
Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24Upgrading from-hdp-21-to-hdp-24
Upgrading from-hdp-21-to-hdp-24
 
Osc2012 spring HBase Report
Osc2012 spring HBase ReportOsc2012 spring HBase Report
Osc2012 spring HBase Report
 
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)
Tokyo HBase Meetup - Realtime Big Data at Facebook with Hadoop and HBase (ja)
 
Presto - Hadoop Conference Japan 2014
Presto - Hadoop Conference Japan 2014Presto - Hadoop Conference Japan 2014
Presto - Hadoop Conference Japan 2014
 
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13w
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13wスケーラブルなシステムのためのHBaseスキーマ設計 #hcj13w
スケーラブルなシステムのためのHBaseスキーマ設計 #hcj13w
 
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
Map Reduce 〜入門編:仕組みの理解とアルゴリズムデザイン〜
 
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduce
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduceAWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduce
AWS Black Belt Tech シリーズ 2015 - Amazon Elastic MapReduce
 
HBase×Impalaで作るアドテク 「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015SummerHBase×Impalaで作るアドテク「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
HBase×Impalaで作るアドテク 「GMOプライベートDMP」@HBaseMeetupTokyo2015Summer
 

Ähnlich wie 20120423 hbase勉強会

about Thrift
about Thriftabout Thrift
about ThriftNaoya Ito
 
Atc15_reading_networking_session
Atc15_reading_networking_sessionAtc15_reading_networking_session
Atc15_reading_networking_session紘也 金子
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906akirahiguchi
 
10.1 res tful services
10.1 res tful services10.1 res tful services
10.1 res tful servicesJian Feng
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでRyo Nakamaru
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらインターネット株式会社
 
Red Hat OpenShift Container Storage
Red Hat OpenShift Container StorageRed Hat OpenShift Container Storage
Red Hat OpenShift Container StorageTakuya Utsunomiya
 
OpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようOpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようKimihiko Kitase
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するaktsk
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目龍一 田中
 
Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Takuya ASADA
 
Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Japan
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
WebサーバのチューニングYu Komiya
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークTakuya ASADA
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係moai kids
 

Ähnlich wie 20120423 hbase勉強会 (20)

about Thrift
about Thriftabout Thrift
about Thrift
 
Thrift
ThriftThrift
Thrift
 
Atc15_reading_networking_session
Atc15_reading_networking_sessionAtc15_reading_networking_session
Atc15_reading_networking_session
 
Handlersocket etc. 20110906
Handlersocket etc. 20110906Handlersocket etc. 20110906
Handlersocket etc. 20110906
 
10.1 res tful services
10.1 res tful services10.1 res tful services
10.1 res tful services
 
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまでDockerを使ったローカルでの開発から本番環境へのデプロイまで
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
 
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
さくらのDockerコンテナホスティング-Arukasの解説とインフラを支える技術(July Tech Festa 2016 『IoTxAIxインフラ時代...
 
Red Hat OpenShift Container Storage
Red Hat OpenShift Container StorageRed Hat OpenShift Container Storage
Red Hat OpenShift Container Storage
 
OpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみようOpenFlowをXenServerで試してみよう
OpenFlowをXenServerで試してみよう
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
serverless
serverlessserverless
serverless
 
Ansible npstudy-shtsuchi
Ansible npstudy-shtsuchiAnsible npstudy-shtsuchi
Ansible npstudy-shtsuchi
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 
Nginx
NginxNginx
Nginx
 
Web技術勉強会23回目
Web技術勉強会23回目Web技術勉強会23回目
Web技術勉強会23回目
 
Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」Seastar in 歌舞伎座.tech#8「C++初心者会」
Seastar in 歌舞伎座.tech#8「C++初心者会」
 
Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013
 
Webサーバのチューニング
WebサーバのチューニングWebサーバのチューニング
Webサーバのチューニング
 
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワークSeastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
 
FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係FluentdとRedshiftの素敵な関係
FluentdとRedshiftの素敵な関係
 

20120423 hbase勉強会

  • 1. Hbase勉強会   Chapter  6  Available  Clients 2012年4月23日   遠山敏章
  • 2. 内容 •  利用可能なクライアントの紹介/説明   –  インタラクティブなクライアント   •  Na8ve  Java,  REST,  Thri?,  Avroなど   –  バッチクライアント   •  MapReduce,  Hive,  Pig,  Cacading   –  Shellコマンド   •  Hbase  shellコマンド、スクリプティング(JRuby)   –  Web-­‐based  UI   •  Master  UI,  RegionServer  UI,  Shared  Pages  
  • 3. REST,  Thri?,  Avro  の紹介(p241) •  Hbase  のアクセス方法   –  クライアントAPI:  Java   –  プロキシ:  あらゆる言語   •  内部はHtableのクライアントAPI   •  Gatewayとクライント間のプロトコルはリモート クライアントの要求しだいで決まる   –  REST  (Representa8onal  State  Transfer)  
  • 4. REST •  Webアプリの標準プロトコルであるHTTP経由な ので、ヘテロなシステム間での通信に適している   •  プロトコルを変更せずに既存の技術と互換性が ある。   •  URIでユニークにリソースにアクセス可。一方、SOAPは新し い標準に合わせるために新しいプロトコルを定義する。   •  テキスト/XMLは冗長で帯域を消費する   •  → オーバーヘッドを減らす場合はProtocol   Buffers,  Thri?,  Avroを使う
  • 5. Protocol  Buffersと  Thri?,  Avroの違い (p242) •  Protocol  Bufferers     –  RPC  スタックを持たない   –  RPCの定義のみを生成   –  HbaseのRESTサーバーをgatwayとして利用   •  Thri?,  Avro   –  独自のRPCの実装を持つ   •  Hbaseのgatewayサーバーはその実装のラッパーを提 供する   ※RESTの実装はhbaseが独自に用意している
  • 6. Gatewayとデプロイ先(p242) •  Gateway  サーバーはHtableベースのClient  APIを利用   •  Gatewayサーバーのデプロイ先   –  RegionServerと同じマシン   –  GatwayServer専用のマシン   –  GatewayClientのマシン   •  例:webServerにデプロイすると、   –  clientとgateway間通信をローカルで行う   –  gatewayとhbase間のRPCはna8ve  protocolで行う。   Figure  6-­‐2  gatewayサーバー経由で接続したクライアント
  • 7. デプロイ先を決めるにあたっての考慮 すべき点 –  マシンへの負荷   –  転送されるデータ量   –  CPUサイクル、ネットワークバンド幅の枯渇しない か  
  • 8. コネクション(p243) •  パフォーマンスの最大化にはコネクションの 再利用が必要(p199  Htable  Pool)   –  短命のプロセスはコネクションの確立とメタデータ の準備が実際の操作よりも時間がかかる。   –  リージョン情報のキャッシングのためにコネクショ ンを再利用するのは特に重要。   •  しないと、row-­‐to-­‐region  lookupをアクセスする度に行う。
  • 9. RESTとThri?/Avroのユースケース (p244) •  RESTユースケース   –  少数のリクエスト数でリクエストのサイズが大きいとき、有 効   –  ウェブベースなので、リバースプロキシやキャッシュの技 術が利用可能。   –  負荷分散のためにRESTサーバーを並列にデプロイする。   •  例:全てのappサーバーにデプロイ(single-­‐app-­‐to-­‐server   rela8onship)   •  Thri?/Avro   –  スループットの最大化したい時に有効   –  デプロイするサーバー数を少なくできる。   •  例:Regionサーバーごとにデプロイ(many-­‐app-­‐to-­‐server   cardinality)  
  • 10. Interac8veクライアント •  クライアントAPIを必要に応じて発行(get,  put,   delete)   –  Na8ve  Java(Chapter  3,  4)   •  Gateway  serverは不要。HTableを使ってRPC経由で通 信   –  REST   •  HbaseはClient  APIとadmin  APIをサポートしたRESTサー バーを提供する。また、異なったフォーマットもサポート。  
  • 11. REST  オペレーション(p244) •  RESTサーバーはHbase  tableの全ての操作が可 能    $  bin/hbase  rest            #  ヘルプの表示  $  bin/hbase-­‐daemon.sh  start  rest      #  デーモンの起動 $  bin/hbase  rest  start          #  起動 $  bin/hbase-­‐daemon.sh  stop  rest      #  デーモンの停止  $  curl  h]p://<servername>:8080/              #  テーブルノリスト $  curl  h]p://<servername>:8080/version    #バージョンの表示   •  オペレーションとXMLスキーマのドキュメント   h]p://hbase.apache.org/apidocs/org/apache/hadoop/ hbase/rest/package-­‐summary.html   •  ステートレスなので、複数のサーバーで起動して 負荷分散する事ができる(例:ラウンドロビン)。  
  • 12. サポートしているフォーマット(p246)  •  H]pのContents-­‐Type  と  Accept  ヘッダーを指 定してRESTサーバーと異なるフォーマットで通 信できる  
  • 13. サポートしているフォーマット   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>…  
  • 14. サポートしているフォーマット   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  
  • 15. サポートしているフォーマット   JSON(applica8on/plain)  (p247) •  ヘッダーで指定     $  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"}]}]}   •  XMLとJSONの違いはJSONはkey/valueで指定 しなければならない。’$’keyはcellのデータを を意味する。  
  • 16. サポートしているフォーマット   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
  • 17. サポートしているフォーマット   Raw  binary(applica8on/octet-­‐stream)  (p249) •  戻り値はcellのデータのみ   $  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サーバーは構造データをカスタムヘッダー に詰める。   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
  • 18. 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番コンパクトなプロトコル なので、帯域効率が一番良い
  • 19. 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
  • 20. 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      #  デーモンの停止
  • 21. その他のクライアント(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プロトコルを利用。   •  メンテされていないプロジェクトもあるので注意  
  • 22. バッチクライアント(p257) •  大規模データの構築にバックグラウンドで非 同期に実行される   –  使用例:インデックスの構築、機械学習ベースの 数学モデル、レポートに必要な統計   •  ユーザー駆動型のアクセスではないため サービス品質保証はバッチの実行時間に連 動する  
  • 23. MapReduce(p257) •  数PBのデータ処理を信頼性を確保して容易 にプログラミングできる   •  MapReduceジョブでHbaseをソース/ターゲット にする方法はいろいろある   •  手法   –  Na8ve  Java  (ch.  7)   –  Clojure:  Hbase-­‐runnerはClojureでMapReduceジョ ブを書くことができる
  • 24. Hive  (p258) •  Hadoop上のデータウェアハウスインフラ   •  HiveQL   –  SQL-­‐likeなクエリー言語   –  クエリはMRジョブに変換される   –  データはジョブ実行時にパースされる   •  Storage  Handler   –  データソースの抽象レイヤー   –  例   •  HDFS、HBase(Hive  ver.  >=  0.6.0)
  • 25. Hive  (p258)   •  Hive  version  0.6.0  はHbaseのhandlerを同梱   •  必要に応じて、カラムのマッピングをできる   •  Row  keyは1つのカラムとして扱える  
  • 26. 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の修正
  • 27. 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  
  • 28. 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  
  • 29. 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  
  • 30. 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>  drop  table  pokes;     OK   hive>  select  count(*)  from  hbase_table_1;   Time  taken:  0.741  seconds   …     309   hive>  drop  table  hbase_table_1;   Time  taken:  4.542  seconds   OK     Time  taken:  3.132  seconds   hive>  select  count(dis8nct  foo)  from  pokes;                 …   309   Time  taken:  3.5325  seconds  
  • 31. 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>");  
  • 32. Hive  (p262) •  StorageHandlerは高レベルのレイヤーとして 透過的に機能するためUDFも使用できる。   •  欠点   –  Serializa8onがカスタムできない   •  Hbaseは  byte[]  のみ保存するので、HiveはStringに全 て変換する   –  Ex.  Hive  の  INT  カラムの  12  は Bytes.toBytes(“12”)として扱わ れ、文字列になる   –  Hbase  のversionの指定をサポートしない •  最新のversionをHiveは返す  
  • 33. 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)  
  • 34. Pig(p.264) •  Pigはlocalモードで起動すれば、1つのプロセスでMR が実行されるのでテストやプロトタイピングに役立つ   •  DUMPやSTOREで結果を出力する   •  Pig  La8nは名前やフィールドの大文字、小文字を区別 する。通常は大文字で記述する。 hbase(main):001:0>  create  'excite',  'colfam1’     $pig  –x  local    
  • 35. 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');  
  • 36. 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  を連結した文字列  
  • 37. 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)   …  
  • 38. Pig(p.266) •  欠点   –  Hbase  のversionの指定をサポートしない •  最新のversionをPigは返す   –  固定のカラムマッピング   •  rowKeyは必ず最初のフィールドにしなければならない   •  FOREAH  …  GENERATE  文でフィールドの順序を変更す る事ができる  
  • 39. 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  
  • 40. Shell  (p268,  p269) •  Hbase  shell  は  local/remoteのHbaseクラス ターをインタラクティブに操作するCLI   •  クライアントとadminのオペレーションができる   •  Jrubyベースのshell   –  コマンド履歴、コマンドの補完、rubyのコマンドを サポート   •  Jrubyを実行するためのJARを同梱しているの でrubyのインストールは不要  
  • 41. 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  
  • 42. Commnds  (p271) •  ガイドライン   –  名前のクオート   •  テーブル名/カラム名はシングル/ダブルクオートする   –  Valueのクオート   •  8/16進数表記のバイナリvalueの入出力をサポート   •  シングルクオートはリテラルとして扱う   •  ダブルクオートは8進/16進をバイトに変換する   –  Ex.  hbase>  put  't1',  "testxefxff",  'f1:',  "x01x33x70"   –  コンマ区切りのパラメータ   •  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'  
  • 43. 出力の制限(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  
  • 44. その他のコマンド(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  
  • 45. 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  
  • 46. 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  
  • 47. 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(  "x00x01x06[".to_java_bytes)   =>  67163  
  • 48. 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")  }  
  • 49. 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)  
  • 50. Web-­‐based  UI  (p277-­‐279) •  Mainページ(Figure  6-­‐8)   –  RegionServer属性   •  クラスター全体の詳細   –  実行中のタスク(Figure  6-­‐3)   •  マスターによって行われた内部オペレーション   •  背景の色:白→実行中、緑→成功、黄→中止   –  Catalog  テーブル   •  .META.,  -­‐ROOT-­‐  の詳細   –  ユーザーテーブル   •  全てのテーブルのリスト   –  リージョンサーバー   •  マスターに登録されているリージョンサーバーのリスト   –  移行中のリージョン(Figure  6-­‐4)   •  ロードバランシング中のリージョンのリスト。リージョンのopen,  close,   splitしているリージョン。リージョンのライフサイクルはp348を参照。  
  • 51. 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できない。  
  • 52. Web-­‐based  UI  (p282) •  ZooKeeperページ(Figure  6-­‐7)   –  ZooKeeper内に保存されている全てのノードのコ ンテンツをダンプ(zk_dumpコマンド)   •  トラブルシューティングに役立つ   –  zk_dumpの内容   •  現在のMasterサーバー   •  どのRegionServerが-­‐ROOT-­‐カタログを保持しているか   •  Masterに登録されているRegionServer   •  ZooKeeperの内部の詳細  
  • 53. 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)