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




    分享到: