如何用php与thrift连接base

1 篇文章 0 订阅

前言

各位看官可能要说,网上有很多相关的文章介绍如何使用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的所有调用方法的相关说明,虽然没有例子,但是看注释也能大部分看明白,有些的不详细的,就只好靠看更深入的源码和猜测了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值