手把手教你通过Thrift 访问ApsaraDB for HBase

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 手把手教你使用Thrift访问ApsaraDB for HBase

Thrift 多语言接入

​ 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需要以下几步:

一、开通HBase thriftserver服务:

​ 在用户自己管控页面点击这里参考开通thriftserver服务化(高可用版本thriftserver),会得到一个host:port的访问入口;或者自己可以选择ECS自建thriftserver方法,参考这里,最终自建ECS的ip (host)以及默认的话9090端口作为访问入口。

thriftserver

二、用户Thrift client访问:

​ 一般客户常见的访问方式是python的访问方式以及php的访问方式 ,这里我们先一步步给出php的访问方式;

2.1 . 以php走thrift访问HBase:

​ 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 --gen <language> Hbase.thrift 

​ 上述是语言的缩写,那么常见的有如下:

thrift --gen php Hbase.thrift
thrift --gen cpp Hbase.thrift
thrift --gen py Hbase.thrift

​ 执行thrift --gen php Hbase.thrift 以后会在目录下得到gen-php 这个就是我们需要的函数包文件;

thrift git:(last_dev)  ll
total 56
-rw-r--r--  1 xuanling.gc  staff    24K  3  5 15:06 Hbase.thrift
drwxr-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]# ll
total 12
-rw-r--r--  1 zookeeper games 2743 Aug  2 11:16 client.php
drwxr-xr-x  3 zookeeper games 4096 Aug  2 01:22 gen-php
drwxr-xr-x 12 zookeeper games 4096 Aug  2 01:22 Thrift

​ 2.1.3. php访问代码编写;

​ 这个时候,我们来编写我们的client.php代码逻辑,上述的Thrift文件夹以及gen-php文件夹,可以随自己项目以及个人风格命名,这里方便大家搞清目录结构,就保留原来风格;下面贴出php的代码,我们下面的所有程序都是在HBase 建了一张表"new":

<?php
ini_set('display_errors', E_ALL);
$GLOBALS['THRIFT_ROOT'] = "/root/thrift_client";
/* 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/Protocol/TBinaryProtocolAccelerated.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';

require_once $GLOBALS['THRIFT_ROOT'] . '/gen-php/Hbase/Types.php';
require_once $GLOBALS['THRIFT_ROOT'] . '/gen-php/Hbase/Hbase.php';

use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TBufferedTransport;
use Thrift\Transport\TSocket;
use Hbase\HbaseClient;
use Hbase\ColumnDescriptor;
use Hbase\Mutation;

$host='hb-bp12pt6alr1788y35-001.hbase.rds.aliyuncs.com';
$port=9099;

$socket = new TSocket($host, $port);

$socket->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) {
}
2.2.python访问流程;

​ 此外还有常见的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 sys
import time
import os

from thrift import Thrift
from thrift.transport import TSocket, TTransport
from thrift.protocol import TBinaryProtocol
from hbase import ttypes
from hbase.Hbase import Client, ColumnDescriptor, Mutation

def printRow(entry):
  print "row: " + entry.row + ", cols:",
  for k in sorted(entry.columns):
    print k + " => " + entry.columns[k].value,
  print


transport = 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----
三、访问HBase thriftserver

​ 3.1、访问机器开通白名单

​ 将访问的机器的ip加入HBase集群的白名单,然后就可以正常执行代码;

白名单

相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
算法 Java 大数据
访问HBase经常出现报错:ServerNotRunningYetException: Server xxx.xxx.xxx is not running yet
访问HBase经常出现报错:ServerNotRunningYetException: Server xxx.xxx.xxx is not running yet
|
XML 弹性计算 Shell
HBase Shell 访问|学习笔记
快速学习 HBase Shell 访问
136 0
|
分布式计算 Java Hadoop
HBase集群搭建记录 | 云计算[CentOS8] | Maven项目访问HBase(下)
step3. 使用eclipse打开maven项目并配置 step4. 项目访问HBase
172 0
HBase集群搭建记录 | 云计算[CentOS8] | Maven项目访问HBase(下)
|
Java Linux 分布式数据库
HBase集群搭建记录 | 云计算[CentOS7] | Maven项目访问HBase(上)
写在前面 step1 Maven的下载与配置 1. 下载解压 2. 环境变量设置 3. 查看安装 4. 设置阿里云镜像[加速jar包下载] step2 Maven项目的创建 1.创建项目 2. 编译项目 3.测试项目 4.打包项目 5.安装项目
148 0
HBase集群搭建记录 | 云计算[CentOS7] | Maven项目访问HBase(上)
|
SQL 分布式计算 Java
Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)
Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等。 下面是这几种客户端的常见用法。
1529 0
Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)
|
IDE 分布式数据库 C#
使用 C# 访问增强版 Hbase(Lindorm)
如何使用 C# 访问增强版 Hbase(Lindorm)
1074 0
使用 C# 访问增强版 Hbase(Lindorm)
|
分布式计算 安全 Shell
Maxcompute Spark 访问 阿里云 Hbase
引子 本来这个东西是没啥好写的,但是在帮客户解决问题的时候,发现链路太长,不能怪客户弄不出来,记录一下 需求列表 MaxCompute Spark包 (写文章时刻为版本 0.32.1, 请自行更新,本文不是文档) Spark 配置 spark.
Maxcompute Spark 访问 阿里云 Hbase
|
存储 安全 搜索推荐
HBase毛刺消除利器-双集群并发访问(Dual Service)
阿里云HBase服务了多家金融、广告、媒体类业务中的风控和推荐,持续的在高可用、低延迟、低成本方向上进行优化。为了进一步满足客户在可用性以及低延迟上的诉求,新增追求极致稳定性的双集群并发访问(Dual Service)功能.。
1827 0
HBase毛刺消除利器-双集群并发访问(Dual Service)
|
弹性计算 Shell 分布式数据库
如何通过HBase的Shell来访问已有的HBase集群?
今天这篇文章主要介绍一下如何通过HBase的Shell来访问已有的HBase集群。 这里我们看到在HBase控制台界面上已经有一个按量付费的HBase集群了。点击右侧的管理,看一下这个集群的一些信息。
1202 0
|
分布式数据库 数据安全/隐私保护 Hbase
如何通过控制台来访问HBase开源组件?
今天这里主要介绍如何通过控制台来访问HBase产品的一些开源软件界面,比如说原生HBase的一些界面。 首先我们来到HBase产品控制台。这里看到我们已经有一个运行中的HBase了,然后点击管理。
9264 0