PHPはThrift操作でHbase

5836 ワード

HBAseはオープンソースのNoSQL製品で、Google BigTable論文を実現したオープンソース製品で、HadoopとHDFSとともに、大量のcolumn familyのデータを格納し、処理することができます.公式サイトは次のとおりです.http://hbase.apache.org
一、HBAseアクセスインタフェース1.Native Java API、最も一般的で効率的なアクセス方式、Hadoop MapReduce Job並列バッチHbaseテーブルデータに適合
2.HBAse Shell、HBAseのコマンドラインツール、最も簡単なインタフェース、HBAse管理使用に適している
3.Thrift Gateway、Thriftシーケンス化技術を利用して、C++、PHP、Pythonなど多くの言語をサポートし、他の異機種システムがHBAseテーブルデータにオンラインアクセスするのに適している
4.REST Gateway、RESTスタイルをサポートするHttp APIがHBAseにアクセスし、言語制限を解除
5.Pigは、Pig Latinフロープログラミング言語を使用してHbaseのデータを操作することができ、Hiveと同様に、本質は最終的にMapReduce JobにコンパイルされてHbaseテーブルデータを処理し、データ統計に適している.
6.Hive、現在のHiveのReleaseバージョンはまだHBAseのサポートに参加していませんが、次のバージョンHive 0.7.0ではHBAseがサポートされます.SQLのような言語でHBAseにアクセスできます.
PHP操作Hbaseを使用する場合は、Facebookオープンソースのthriftを使用することをお勧めします.公式サイトは:http://thrift.apache.org/は、iceのようなミドルウェアであり、異なるシステム言語間の情報交換に使用されます.
二、Thriftを取り付ける
HadoopとHbaseが既にインストールされているクラスタにThriftをインストールし,ThriftをHmasterマシンにインストールする
1.thriftをダウンロード
wget http://mirror.bjtu.edu.cn/apache//thrift/0.8.0/thrift-0.8.0.tar.gz
2.解凍
tar -xzf thrift-0.8.0.tar.gz
3 .コンパイルインストール:
ソースコードでコンパイルされている場合は、まず./boostrap.shファイルを作成する./configure、私たちがダウンロードしたtarパッケージは、configureファイルを持っています.((READMEファイルを参照可能)
If you are building from the first time out of the source repository, you will need to generate the configure scripts.  (This is not necessary if you downloaded a tarball.)  From the top directory, do: ./bootstrap.sh
./configure make ; make install
4.起動:
# ./bin/hbase-daemon.sh start thrift [--port=PORT] starting thrift, logging to/home/banping/hbase/hbase-0.90.3/bin/../logs/hbase-root-thrift-localhost.localdomain.out
Thriftのデフォルトの傍受ポートは9090です
jpsを使用してプロセスを表示し、ThriftServerプロセスを表示します.
PHP通过Thrift操作Hbase
三、テスト:
1 .phpスクリプトライブラリ操作Hbase
 
PHPがThriftでHbaseにアクセスするライブラリはthrift-0.8.0/lib/php/srcディレクトリの下にありますが、このフォルダの下にはThriftでHbaseにアクセスするPHP拡張ソースコードも含まれています.
1)thrift-0.8.0/lib/phpを対応するphp webディレクトリにコピーします.
2)phpとhbaseインタフェースファイルを生成する
  #/usr/local/thrift/bin/thrift --gen php/usr/local/hbase/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift
#(自分のディレクトリ設定による)
 
ディレクトリファイルの生成:/usr/local/hbase/gen-php/Hbase
ファイルあり:Hbase.php,Hbase_types.php
...php,Hbase_types.php copyから:webディレクトリ/php/src/packages/Hbase/
3)phpスクリプトを使用してテスト:
<?php



ini_set('display_errors', E_ALL);

$GLOBALS['THRIFT_ROOT'] = './php/src';



require_once( $GLOBALS['THRIFT_ROOT'] . '/Thrift.php' );

require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TSocket.php' );

require_once( $GLOBALS['THRIFT_ROOT'] . '/transport/TBufferedTransport.php' );

require_once( $GLOBALS['THRIFT_ROOT'] . '/protocol/TBinaryProtocol.php' );

require_once( $GLOBALS['THRIFT_ROOT'] . '/packages/Hbase/Hbase.php' );



$socket = new TSocket('10.64.60.83', '9090');



$socket->setSendTimeout(10000); // Ten seconds (too long for production, but this is just a demo ;)

$socket->setRecvTimeout(20000); // Twenty seconds

$transport = new TBufferedTransport($socket);

$protocol = new TBinaryProtocol($transport);

$client = new HbaseClient($protocol);



$transport->open();



//     

$tables = $client->getTableNames();

sort($tables);

foreach ($tables as $name) {



    echo( "  found: {$name}
" ); } // student $columns = array( new ColumnDescriptor(array( 'name' => 'id:', 'maxVersions' => 10 )), new ColumnDescriptor(array( 'name' => 'name:' )), new ColumnDescriptor(array( 'name' => 'score:' )), ); $tableName = "student"; try { $client->createTable($tableName, $columns); } catch (AlreadyExists $ae) { echo( "WARN: {$ae->message}
" ); } // $descriptors = $client->getColumnDescriptors($tableName); asort($descriptors); foreach ($descriptors as $col) { echo( " column: {$col->name}, maxVer: {$col->maxVersions}
" ); } // $row = '2'; $valid = "foobar-\xE7\x94\x9F\xE3\x83\x93"; $mutations = array( new Mutation(array( 'column' => 'score', 'value' => $valid )), ); $client->mutateRow($tableName, $row, $mutations); // $row_name = '2'; $fam_col_name = 'score'; $arr = $client->get($tableName, $row_name, $fam_col_name); // $arr = array foreach ($arr as $k => $v) { // $k = TCell echo ("value = {$v->value} , <br> "); echo ("timestamp = {$v->timestamp} <br>"); } $arr = $client->getRow($tableName, $row_name); // $client->getRow return a array foreach ($arr as $k => $TRowResult) { // $k = 0 ; non-use // $TRowResult = TRowResult var_dump($TRowResult); } $transport->close(); ?>

ブラウザでプロジェクトのすべてのテーブルを表示し、PHPがthriftでHBAseにアクセスできることを証明します.
2.PHP拡張方式でthriftを使用
PHPが持つphpizeを用いてThtiftのphp拡張を生成した.この拡張ソース構造:

hadoop@ubuntu:/usr/local/hbase-0.90.4/thrift-0.8.0/lib/php/src $ cd ext/thrift_protocol $/usr/local/php/bin/phpize $ ./configure --with-php-config=/usr/local/php/bin/php-config --enable-thrift_protocol $ make $ make install
      thrift_protocol.so     php.ini   apache  。