今日头条
摘要: 手把手教你使用Thrift访问ApsaraDB for HBase
Thrift 提供多语言访问HBase的能力,支持的语言包从Thrift官网看括: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml , Delphi 以及别的语言.主要流程是用户thrift Client 通过Thrift协议访问HBase的thriftserver,thriftserver做请求转发给HBase的存储服务来做数据的读以及写操作.大概架构图如下:
要通过thrift 多语言访问HBase需要以下几步:
在用户自己管控页面点击这里参考开通thriftserver服务化(高可用版本thriftserver),会得到一个host:port的访问入口;或者自己可以选择ECS自建thriftserver方法,参考这里,最终自建ECS的ip (host)以及默认的话9090端口作为访问入口。
一般客户常见的访问方式是python的访问方式以及php的访问方式 ,这里我们先一步步给出php的访问方式;
2.1.1 . 安装thrift 编译环境;
我们云HBase的thrift环境是0.9.0,所以建议客户自己建立自己的thrift环境也是0.9.0,这里可以从这里下载thrift的0.9.0 版本,下载的源码包我们后面会用到,这里需要先安装thrift编译环境,对于源码安装可以参考thrift官网;
通过如下命令可以看出安装thrift的版本信息;
thrift --version
2.1.2. 生成thrift访问client的访问文件;
我们从这里下载出我们云HBase的Hbase.thrift文件,这里我们云HBase使用的是thrift1协议,具体可以参考文件看出使用格式,下载完成以后执行thrift命令进行编译;
编译命令如下:
thrift --genHbase.thrift
上述是语言的缩写,那么常见的有如下:
thrift --gen php Hbase.thriftthrift --gen cpp Hbase.thriftthrift --gen py Hbase.thrift
执行thrift --gen php Hbase.thrift 以后会在目录下得到gen-php 这个就是我们需要的函数包文件;
thrift git:(last_dev) lltotal 56-rw-r--r-- 1 xuanling.gc staff 24K 3 5 15:06 Hbase.thriftdrwxr-xr-x 3 xuanling.gc staff 96B 8 1 16:03 gen-php
此外我们在2.1.1得到thrift的源码包文件将下载到的Thrift源码文件夹下的/lib/php/lib下面的Thrift文件夹以及gen-php一起丢在我们的业务逻辑代码一个src目录下面,加上我们自己的client.php的代码,目录结果如下所示:
[root@xxxxxxxxxxx thrift_client]# lltotal 12-rw-r--r-- 1 zookeeper games 2743 Aug 2 11:16 client.phpdrwxr-xr-x 3 zookeeper games 4096 Aug 2 01:22 gen-phpdrwxr-xr-x 12 zookeeper games 4096 Aug 2 01:22 Thrift
2.1.3. php访问代码编写;
这个时候,我们来编写我们的client.php代码逻辑,上述的Thrift文件夹以及gen-php文件夹,可以随自己项目以及个人风格命名,这里方便大家搞清目录结构,就保留原来风格;下面贴出php的代码,我们下面的所有程序都是在HBase 建了一张表"new":
setSendTimeout(10000); // 发送超时,单位毫秒$socket->setRecvTimeout(20000); // 接收超时,单位毫秒$transport = new TBufferedTransport($socket); $protocol = new TBinaryProtocol($transport); $client = new HbaseClient($protocol); $transport->open();####列出表####echo "----list tables----\n"; $tables = $client->getTableNames();foreach ($tables as $name) { var_dump($tables); } $tablename='new';####写数据####echo "----write data----\n"; $row = 'key'; $value = 'value'; $atrribute = array(); $mutations = array( new Mutation(array( 'column' => 'info:cn1', 'value' => $value )), );try { $client->mutateRow($tablename, $row, $mutations, $atrribute); } catch (Exception $e) { var_dump($e);//这里自己打log}###读数据####echo "---read data---\n"; $result = $client->getRow($tablename, $row, $atrribute); var_dump($result);###删数据####echo "---delete data---\n"; $client->deleteAllRow($tablename, $row, $atrribute);echo "---get data---\n"; $result = $client->getRow($tablename, $row, $atrribute); var_dump($result);?>
代码执行结果如下:
[root@xxxxxxxxxxx thrift_client]# php client.php----list tables----array(1) { [0]=> string(3) "new"} ----write data---- ---read data---array(1) { [0]=> object(Hbase\TRowResult)#8 (3) { ["row"]=> string(3) "key" ["columns"]=> array(1) { ["info:cn1"]=> object(Hbase\TCell)#10 (2) { ["value"]=> string(5) "value" ["timestamp"]=> int(1533179795969) } } ["sortedColumns"]=> NULL } } ---delete data--- ---get data---array(0) { }
此外还有常见的python的客户,对于python的话,有happybase这种python的第三方包含thrift的库去做,我们见过一些客户使用Happybase进行访问HBase thrift,参见文章;此外,python 有丰富的库,我们通过pip可以安装thrift,以及访问HBase的thrift库;执行流程如下,假设用户已经安装python以及pip:
pip install thrift //安装thrift默认最新版本pip install hbase-thrift //安装hbase thrift接口库
上面2步执行完成以后,既可以编写访问HBase的代码:
import sysimport timeimport osfrom thrift import Thriftfrom thrift.transport import TSocket, TTransportfrom thrift.protocol import TBinaryProtocolfrom hbase import ttypesfrom hbase.Hbase import Client, ColumnDescriptor, Mutationdef printRow(entry): print "row: " + entry.row + ", cols:", for k in sorted(entry.columns): print k + " => " + entry.columns[k].value, printtransport = TSocket.TSocket('hb-bp12pt6alr1788y35-001.hbase.rds.aliyuncs.com', 9099) transport = TTransport.TBufferedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) client = Client(protocol) transport.open()print "---list table--"print client.getTableNames() table="new"row="key"print "---write data---"mutations = [Mutation(column="info:cn1", value="value")] client.mutateRow(table, row, mutations)print "---get data----"printRow(client.getRow(table, row)[0])print "---delete data---"client.deleteAllRow(table, row)print "---end----"transport.close()
对应上述的程序执行的结果如下:
[root@Test ~]# python Hbase_client.py---list table--['new']---write data------get data----row: key, cols: info:cn1 => value---delete data------end----
3.1、访问机器开通白名单
将访问的机器的ip加入HBase集群的白名单,然后就可以正常执行代码;
本文为云栖社区原创内容,未经允许不得转载。
全部0条评论
快来发表一下你的评论吧 !