如何用php与thrift连接base

    xiaoxiao2021-03-25  117

    前言

    各位看官可能要说,网上有很多相关的文章介绍如何使用php和thrift连接hbase,为毛你还要写呢? 其实我也是无奈之举,本人在开发的过程中,需要使用php去连接hbase,但是拜读过网上的文章后,经过试验,都没有能满足我个人的需求。 痛定思痛,耐下心来查看thrift生成的php相关的代码,跟着注释以及自己的猜测,一步步的试验,终于达到目的,为了使自己的努力成果不至于很快遗忘,所以只好痛下决心将整个过程记录下来,以备以后使用。因为网上的文章基本都不是基于thrift2的,所以为了站在巨人的肩膀上,自己也是基于thrift的,不是thrft2的,能力有限,各位看官多多包涵。

    启动thrift server

    在hbase的master上(不知道regionserver是否也可以,没试),进入hbase_home/bin/目录下,启动thrift ./hbase-daemon.sh start thrift完成thrift启动。默认端口为9090端口

    组织thrift客户端代码

    在php的服务器,安装thrift,我的版本是thrift-0.10.0,进入目录,进行安装 ./configure --prefix=/home/thrift --with-php-config=/usr/bin/php-config make && make install将hbase的源代码上传到php的服务器,解压, 由于thrift的php代码来自不同的位置,所以需要创建一个目录,将其搜集起来,例如mkdir /home/myweb cp -r thrift源码目录/lib/php/lib/Thrift/*  /home/myweb/ mkdir /home/myweb/packages cd /home/thrift/ bin/thrift --gen php hbase源码目录/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift cp -r /home/thrift/gen-php/* /home/myweb/packages/ cp thrift-0.10.0目录/lib/php/src/*.php /home/myweb/ 这样,整个thrift的客户端需要的源码就搜集完毕了

    开发代码

    代码如下: <?php define("THRIFT_ROOT","/home/myweb"); /** * 此处必须要进行设置,否则客户端里有很多地方都没有include相关的文件就new了对象了 */ spl_autoload_register(function($class){ if(substr($class,0,7)=='Thrift\\') { $path = explode("\\",$class); unset($path[0]); $path_str = implode("/",$path); $file = THRIFT_ROOT.'/'.$path_str.'.php'; if(file_exists($file)) { require $file; } } return true; }); require_once( THRIFT_ROOT . '/Thrift.php' ); require_once( THRIFT_ROOT . '/Transport/TSocket.php' ); require_once( THRIFT_ROOT . '/Transport/TBufferedTransport.php' ); require_once( THRIFT_ROOT . '/Protocol/TBinaryProtocol.php' ); require_once( THRIFT_ROOT . '/Type/TMessageType.php' ); require_once( THRIFT_ROOT . '/packages/Hbase/Hbase.php' ); require_once( THRIFT_ROOT . '/packages/Hbase/Types.php' ); $socket = new Thrift\Transport\TSocket('启动thrift服务的服务器ip', '9090'); $socket->setSendTimeout(10000); $socket->setRecvTimeout(20000); $transport = new Thrift\Transport\TBufferedTransport($socket); $protocol = new Thrift\Protocol\TBinaryProtocol($transport); $client = new Hbase\HbaseClient($protocol); $transport->open(); //根据条件查询记录 /** * 第一个参数为表的名称, * 第二个参数是开始的行的rowkey,如果为空,则从最开始的行开始查询 * 第三个参数为查询出来的数据都需要哪些列,如果是列簇,则直接写名字,如果是列,则这样写列簇名:列名 可以写多个 * 最后一个参数为筛选条件,据我观察,只能列出等于的条件,大于小于应该是不可以 */ $scannerid = $client->scannerOpen("announce_hits","",array("data"),array("data:agent"=>"edufe")); /** * 得到了scannerid后,就可以获取查询到的数据了,后边的参数是获取的数据条数,第一次调用获得第一行和第二行,第二次调用获得的是第三行和第四行 */ $res = $client->scannerGetList($scannerid,2); foreach ($res as $r) { print_r($r); } $res = $client->scannerGetList($scannerid,2); foreach ($res as $r) { print_r($r); } //查询完毕后,建议关闭scanner $client->scannerClose($scannerid); ?>

    写在最后

    我这里只写了一个例子,就是我最需要的,还有其他需求的看官,可以在整理完文件后,查看/home/myweb/packages/Hbase/Hbase.php中最开始的HbaseIf接口,这里有对$client的所有调用方法的相关说明,虽然没有例子,但是看注释也能大部分看明白,有些的不详细的,就只好靠看更深入的源码和猜测了。
    转载请注明原文地址: https://ju.6miu.com/read-12532.html

    最新回复(0)