手把手教你經過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的存儲服務來作數據的讀以及寫操做.大概架構圖以下:php

​ 

​ 要經過thrift 多語言訪問HBase須要如下幾步:html

1、開通HBase thriftserver服務:python

​ 在用戶本身管控頁面點擊這裏參考開通thriftserver服務化(高可用版本thriftserver),會獲得一個host:port的訪問入口;或者本身能夠選擇ECS自建thriftserver方法,參考這裏,最終自建ECS的ip (host)以及默認的話9090端口做爲訪問入口。git

2、用戶Thrift client訪問:apache

​ 通常客戶常見的訪問方式是python的訪問方式以及php的訪問方式 ,這裏咱們先一步步給出php的訪問方式;架構

2.1 . 以php走thrift訪問HBase:app

​ 2.1.1 . 安裝thrift 編譯環境;socket

​ 咱們雲HBase的thrift環境是0.9.0,因此建議客戶本身創建本身的thrift環境也是0.9.0,這裏能夠從這裏下載thrift的0.9.0 版本,下載的源碼包咱們後面會用到,這裏須要先安裝thrift編譯環境,對於源碼安裝能夠參考thrift官網函數

經過以下命令能夠看出安裝thrift的版本信息;ui

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----

3、訪問HBase thriftserver

​ 3.一、訪問機器開通白名單

​ 將訪問的機器的ip加入HBase集羣的白名單,而後就能夠正常執行代碼;

文章連接:https://yq.aliyun.com/articles/622400

相關文章
相關標籤/搜索