-
php经由过程thrift 0.9.0操纵HBase
添加时间:2013-5-17 点击量:比来项目中须要应用thrift和php来读写HBase中的相干数据,所以就收拾了下相干的类,做了下测试.
如今本身用到的操纵HBase的体式格式首要有以下几种:
1.HBase Shell, 主如果设备后履行 shell 经由过程号令查看 HBase 中的数据,比如 count xxxx, scan xxxx 等.
2.经由过程Native Java Api , 本身封装了一个 RESTfull的Api , 经由过程供给的Api(http)体式格式来操纵HBase
3.应用Thrift 的序列化技巧,Thrift支撑C++,PHP,Python等说话,合适其他的异构体系操纵HBase,这块方才测验测验
4.应用HBasExplorer,之前写的一个图形化的客户端来操纵HBase, http://www.cnblogs.com/scotoma/archive/2012/12/18/2824311.html
5. Hive/Pig , 这个如今还没真正的用过.
当前首要讲第三种体式格式 Thrift, 这个是Facebook开源出来的, 官方网站是 http://thrift.apache.org/ .
安装和启动,请看参考文章中的内容
查看是否跑成功...
应用php 类文件操纵Hbase, 生成类文件的体式格式,请看参考文章中的临盆的办法,不过我本身测试的生成办法有Bug,生成的 类文件中 namespace 是空的, 然则从官方源码库中生成的是 namespace Hbase, 所以这里须要重视一下.
我调试了一个驱动类文件,放到了github上了,大师须要的可以应用.
https://github.com/xinqiyang/buddy/tree/master/Vender/thrift
接下来进行测试操纵,参考http://blog.csdn.net/hguisu/article/details/7298456 这里的测试类,写了个测试,并调试了下
<?php
/
Thrift Test Class by xinqiyang
/
ini_set(display_error, E_ALL);
¥GLOBALS[THRIFT_ROOT] = ./lib;
/ Dependencies. In the proper order. /
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Transport/TTransport.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Transport/TSocket.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Protocol/TProtocol.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Protocol/TBinaryProtocol.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Transport/TBufferedTransport.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Type/TMessageType.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Factory/TStringFuncFactory.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/StringFunc/TStringFunc.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/StringFunc/Core.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Type/TType.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Exception/TException.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Exception/TTransportException.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Thrift/Exception/TProtocolException.php;
/ Remember these two files? /
require_once ¥GLOBALS[THRIFT_ROOT]./Types.php;
require_once ¥GLOBALS[THRIFT_ROOT]./Hbase.php;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TSocket;
use Thrift\Transport\TSocketPool;
use Thrift\Transport\TFramedTransport;
use Thrift\Transport\TBufferedTransport;
use Hbase\HbaseClient;
//define host and port
¥host = 192.168.56.56;
¥port = 9090;
¥socket = new Thrift\Transport\TSocket(¥host, ¥port);
¥transport = new TBufferedTransport(¥socket);
¥protocol = new TBinaryProtocol(¥transport);
// Create a calculator client
¥client = new HbaseClient(¥protocol);
¥transport->open();
//echo Time: . ¥client -> time();
¥tables = ¥client->getTableNames();
sort(¥tables);
foreach (¥tables as ¥name) {
echo ¥name.\r\n;
}
//create a fc and then create a table
¥columns = array(
new \Hbase\ColumnDescriptor(array(
name => id:,
maxVersions => 10
)),
new \Hbase\ColumnDescriptor(array(
name => name:
)),
new \Hbase\ColumnDescriptor(array(
name => score:
)),
);
¥tableName = student;
/
try {
¥client->createTable(¥tableName, ¥columns);
} catch (AlreadyExists ¥ae) {
var_dump( WARN: {¥ae->message}\n );
}
/
// get table descriptors
¥descriptors = ¥client->getColumnDescriptors(¥tableName);
asort(¥descriptors);
foreach (¥descriptors as ¥col) {
var_dump( column: {¥col->name}, maxVer: {¥col->maxVersions}\n );
}
//set clomn
//add column data
¥time = time();
var_dump(¥time);
¥row = 2;
¥valid = foobar-.¥time;
¥mutations = array(
new \Hbase\Mutation(array(
column => score,
value => ¥valid
)),
);
¥mutations1 = array(
new \Hbase\Mutation(array(
column => score:a,
value => ¥time,
)),
);
¥attributes = array (
);
//add row, write a row
¥row1 = ¥time;
¥client->mutateRow(¥tableName, ¥row1, ¥mutations1, ¥attributes);
echo -------write row ¥row1 ---\r\n;
// row
¥client->mutateRow(¥tableName, ¥row, ¥mutations, ¥attributes);
//get column data
¥row_name = ¥time;
¥fam_col_name = score:a;
¥arr = ¥client->get(¥tableName, ¥row_name, ¥fam_col_name, ¥attributes);
// ¥arr = array
foreach (¥arr as ¥k => ¥v) {
// ¥k = TCell
echo ------ get one : value = {¥v->value} , <br> ;
echo ------ get one : timestamp = {¥v->timestamp} <br>;
}
echo ----------\r\n;
¥arr = ¥client->getRow(¥tableName, ¥row_name, ¥attributes);
// ¥client->getRow return a array
foreach (¥arr as ¥k => ¥TRowResult) {
// ¥k = 0 ; non-use
// ¥TRowResult = TRowResult
var_dump(¥TRowResult);
}
echo ----------\r\n;
/
//no test
public function scannerOpenWithScan(¥tableName, \Hbase\TScan ¥scan, ¥attributes);
public function scannerOpen(¥tableName, ¥startRow, ¥columns, ¥attributes);
public function scannerOpenWithStop(¥tableName, ¥startRow, ¥stopRow, ¥columns, ¥attributes);
public function scannerOpenWithPrefix(¥tableName, ¥startAndPrefix, ¥columns, ¥attributes);
public function scannerOpenTs(¥tableName, ¥startRow, ¥columns, ¥timestamp, ¥attributes);
public function scannerOpenWithStopTs(¥tableName, ¥startRow, ¥stopRow, ¥columns, ¥timestamp, ¥attributes);
public function scannerGet(¥id);
public function scannerGetList(¥id, ¥nbRows);
public function scannerClose(¥id);
/
echo ----scanner get ------\r\n;
¥startRow = 1;
¥columns = array (column => score, );
//
¥scan = ¥client->scannerOpen(¥tableName, ¥startRow, ¥columns, ¥attributes);
//¥startAndPrefix = 13686667;
//¥scan = ¥client->scannerOpenWithPrefix(¥tableName,¥startAndPrefix,¥columns,¥attributes);
//¥startRow = 1;
//¥stopRow = 2;
//¥scan = ¥client->scannerOpenWithStop(¥tableName, ¥startRow, ¥stopRow, ¥columns, ¥attributes);
//¥arr = ¥client->scannerGet(¥scan);
¥nbRows = 1000;
¥arr = ¥client->scannerGetList(¥scan, ¥nbRows);
var_dump(count of result :.count(¥arr));
foreach (¥arr as ¥k => ¥TRowResult) {
// code...
//var_dump(¥TRowResult);
}
¥client->scannerClose(¥scan);
//close transport
¥transport->close();这里操纵了 createTable , Insert Row , Get Table , Update Row,Scan Table 这些常用的,先熟悉下.
实际操纵的时辰,须要重视:
1.php的版本,须要支撑定名空间,所以须要5.3以上的支撑
2.安装thrift的php扩大,貌似这个没有实际用到,还是得应用相干的php文件,谁能写个扩大就好了.不知道机能是否可以或许提拔.
3.对于scan的相干操纵,测试了 start/stop, prefix的Scan,感触感染还是可以的.
4.感触感染php的定名空间很挫,怎么办..\分别感触感染就是那么的不地道......
接下来,有时候的话,会做下其他的几个操纵,并进行压力测试,并将这个安排到集群中去.
大师有效Thrift的迎接交换,感激hguisu写的这个文章(参考文章),让大师可以或许尽快的入门.
参考文章:
http://blog.csdn.net/hguisu/article/details/7298456
