手把手教你通過Thrift訪問ApsaraDBforHBase
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埠作為訪問入口。
二、使用者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 ThriftProtocolTBinaryProtocol;
use ThriftTransportTBufferedTransport;
use ThriftTransportTSocket;
use HbaseHbaseClient;
use HbaseColumnDescriptor;
use HbaseMutation;
$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----
";
$tables = $client->getTableNames();
foreach ($tables as $name) {
var_dump($tables);
}
$tablename=`new`;
####寫資料####
echo "----write data----
";
$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---
";
$result = $client->getRow($tablename, $row, $atrribute);
var_dump($result);
###刪資料####
echo "---delete data---
";
$client->deleteAllRow($tablename, $row, $atrribute);
echo "---get data---
";
$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(HbaseTRowResult)#8 (3) {
["row"]=>
string(3) "key"
["columns"]=>
array(1) {
["info:cn1"]=>
object(HbaseTCell)#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叢集的白名單,然後就可以正常執行程式碼;
相關文章
- thrift使用過程中的問題
- docker 中容器通過 API 互相訪問DockerAPI
- k8s通過Service訪問PodK8S
- Oracle 通過透明閘道器訪問mysqlOracleMySql
- 手把手教你 Socket 通訊(TCP/IP)TCP
- Thrift RPC 通訊搭建RPC
- apache 通過ajp訪問tomcat多個站點ApacheTomcat
- 【AWS】通過對等網路打通VPC訪問
- Java通過SSLEngine與NIO實現HTTPS訪問JavaHTTP
- 使用 grpcurl 通過命令列訪問 gRPC 服務RPC命令列
- 其它語言通過HiveServer2訪問HiveHiveServer
- 在Terminal中通過代理訪問GitHub(解決訪問GitHub速度慢的問題)Github
- postgres_fdw 無法通過域名 訪問外部表問題
- 手把手教你如何通過CC2531抓取Zigbee包,並解析加密Zigbee包加密
- nginx 怎麼通過域名訪問8080埠(指定埠)Nginx
- Spring Boot通過@ConfigurationProperties訪問靜態資料 - reflectoringSpring Boot
- 私網使用者通過Smart NAT 訪問Internet
- 使用Laravel框架,怎麼通過訪問/xxxx/ooo.php也通過路由來使用Laravel框架PHP路由
- 手把手教你搞定90%的NLP問題
- 在 k8s 中通過 Ingress 配置域名訪問K8S
- kubernetes實戰篇之通過api-server訪問dashboardAPIServer
- [BUG反饋]新增模組無法通過URL訪問的問題
- 【PRODUCE】Oracle 通過儲存過程限制使用者訪問表資料Oracle儲存過程
- 手把手教你定位常見Java效能問題Java
- 阿里雲Serverless Kubernetes通過Ingress提供7層服務訪問阿里Server
- 使用Java程式通過http post訪問ABAP Netweaver伺服器JavaHTTP伺服器
- 微信直播、看點直播,手把手教你如何開通
- 【PRODUCE】Oracle 通過儲存過程限制使用者訪問表資料(二)Oracle儲存過程
- 透過API訪問HDFSAPI
- Python3通過字串訪問與修改區域性變數Python字串變數
- 你知道可以通過網址訪問的Servlet如何實現嗎?Servlet
- 手把手教你分析解決MySQL死鎖問題MySql
- 如何通過堡壘機訪問伺服器?堡壘機無法訪問伺服器怎麼辦?伺服器
- 教你如何進行SSH無密碼訪問密碼
- 如何通過Geth、Node.js和UNIX/PHP訪問以太坊節點Node.jsPHP
- 如何通過 Geth、Node.js 和 UNIX/PHP 訪問以太坊節點Node.jsPHP
- wampserver搭建站點 允許訪問通過防火牆的設定方法Server防火牆
- 如何通過瀏覽器 JavaScript API 訪問伺服器資料庫瀏覽器JavaScriptAPI伺服器資料庫