Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> HBase & thrift & C++編程

HBase & thrift & C++編程

編輯:關於android開發

HBase & thrift & C++編程


HBase & thrift & C++編程.pdf

目錄

目錄1

1.前言1

2.啟動和停止thrift2 1

2.1.啟動thrift2 1

2.2.停止thrift2 1

2.3.啟動參數2

3.hbase.thrift2

3.1.編譯hbase.thrift 2

4.thrift_helper.h3

5.示例代碼4

1.前言

本文目的是介紹使用C++如何操作HBase。從HBase0.94開始,HBase新增thrift2,本文只介紹和討論thrift2相關的。hbase-1.1.2使用的thrift估計是thrift-0.9.0版本。

2.啟動和停止thrift2

2.1.啟動thrift2

登錄HBasemaster機器,執行以下命令啟動thrift2:hbase-daemon.shstartthrift2。

thrift默認的監聽端口是9090,可以通過參數“-p”指定其它端口。默認使用的Server是TThreadPoolServer。默認使用的Protocol是TBinaryProtocol。

注意客戶端使用的Protocol和Transport和服務端的要保持一致,否則客戶端在調用時,可能遇到“EAGAIN(timedout)”等錯誤。

2.2.停止thrift2

hbase-daemon.shstopthrift2

2.3.啟動參數

使用“hbase-daemon.shstartthrift2”時,還可以帶以下參數:

參數名

是否默認

參數說明

-h,--help

顯示幫助信息

-b,--bind

綁定指定地址,但不支持TNonblockingServer和THsHaServer,兩者總是使用“0.0.0.0”

-p,--port

9090

綁室指定端口,默認為9090

-f,--framed

使用TFramedTransport

-c,--compact

使用TCompactProtocol,默認是TBinaryProtocol

-threadpool

使用TThreadPoolServer,為默認Server

-nonblocking

使用實現了FramedTransport的TNonblockingServer

-hsha

使用實現了FramedTransport的THsHaServer

客戶端和hbasethrift2的Transport和Protocol需保持一致,比如客戶端為FramedTransport,則也需以“-f”啟動hbasethrift2。

否則客戶端在調用時,可能會遇到“EAGAIN(timedout)”等錯誤。

啟動參數信息來源於官網的頁面:

https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/thrift2/package-summary.html。

以上參數不是給hbase-daemon.sh使用,而是被hbasethrift2使用,可以浏覽相關源代碼了解細節:

hbase-thrift\src\main\java\org\apache\hadoop\hbase\thrift2\ThriftServer.java

hbase-thrift\src\main\java\org\apache\hadoop\hbase\thrift2\ThriftHBaseServiceHandler.java

?啟動示例:

hbase-daemon.shstartthrift2--framed-nonblocking

3.hbase.thrift

hbaser.thrift文件在hbase源代碼包(以hbase-1.1.2為例)中的位置:

hbase-thrift\src\main\resources\org\apache\hadoop\hbase\thrift2\hbase.thrift

3.1.編譯hbase.thrift

保持機器上已安裝好thrift(經測試hbase-1.1.2和thrift-0.9.0兼容),然後使用下列命令編譯:thrift--gencpp-out.hbase.thrift,編譯成功後,會在“-out”指定的目錄下生成以下五個文件:

THBaseService.h

THBaseService.cpp

hbase_types.h

hbase_types.cpp

hbase_constants.h

hbase_constants.cpp

其中供客戶端使用的是位於文件THBaseService.h中的類THBaseServiceClient。

4.thrift_helper.h

為了簡化C++客戶端的編程,可以使用thrift_helper.h:

https://github.com/eyjian/mooon/blob/master/common_library/include/mooon/net/thrift_helper.h,它可以幫助簡化對HBasethrift2的調用:

//thrift客戶端輔助類

//

//使用示例:

//mooon::net::CThriftClientHelper<ExampleServiceClient>client(rpc_server_ip,rpc_server_port);

//try

//{

//client.connect();

//client->foo();

//}

//catch(apache::thrift::transport::TTransportException&ex)

//{

//MYLOG_ERROR("thriftexception:(%d)%s\n",ex.getType(),ex.what());

//}

//catch(apache::thrift::transport::TApplicationException&ex)

//{

//MYLOG_ERROR("thriftexception:%s\n",ex.what());

//}

//catch(apache::thrift::TException&ex)

//{

//MYLOG_ERROR("thriftexception:%s\n",ex.what());

//}

//Transport除默認的TFramedTransport(TBufferTransports.h),還可選擇:

//TBufferedTransport(TBufferTransports.h)

//THttpTransport

//TZlibTransport

//TFDTransport(TSimpleFileTransport)

//

//Protocol除默認的apache::thrift::protocol::TBinaryProtocol,還可選擇:

//TCompactProtocol

//TJSONProtocol

//TDebugProtocol

template<classThriftClient,

classProtocol=apache::thrift::protocol::TBinaryProtocol,

classTransport=apache::thrift::transport::TFramedTransport>

classCThriftClientHelper

5.示例代碼

//HBasethrift2C++編程示例

#include"THBaseService.h"

#include<inttypes.h>//PRIu64

#include<mooon/net/thrift_helper.h>

#include<mooon/utils/args_parser.h>

#include<vector>

//請注意客戶端使用的thrift的Transport和Protocol要和hbasethrift2服務端保持一致,

//否則調用時,可能總是報超時,或其它錯誤!!!

//

//運行之前,請通過HBaseshell創建好表:create'test','cf1','cf2'

//或指定版本數:create'test',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2',VERSIONS=>3}

//刪除表,按順序執行以下兩條HBaseshell命令:

//disable'test'

//drop'test'

STRING_ARG_DEFINE(hbase_ip,"192.168.0.1","hbasethriftip");

INTEGER_ARG_DEFINE(uint16_t,hbase_port,9090,1000,50000,"hbasethriftport");

intmain(intargc,char*argv[])

{

std::stringerrmsg;

if(!mooon::utils::parse_arguments(argc,argv,&errmsg))

{

fprintf(stderr,"parametererror:%s\n",errmsg.c_str());

exit(1);

}

usingnamespaceapache;

usingnamespaceapache::hadoop;

std::stringhbase_ip=mooon::argument::hbase_ip->value();

uint16_thbase_port=mooon::argument::hbase_port->value();

mooon::net::CThriftClientHelper<hbase::thrift2::THBaseServiceClient>hbase_client(hbase_ip,hbase_port);

try

{

hbase_client.connect();//連接hbasethrift2server

fprintf(stdout,"connect%s:%dok\n",hbase_ip.c_str(),hbase_port);

std::stringtablename="test";//表名,確保運行之前已創建好

std::stringrowkey="row1";//行Key

std::stringfamily="cf1";//例族名

std::stringcolumnname="f1";//例名

std::stringcolumnvalue="value1";//例值

//插入參數設置

std::vector<hbase::thrift2::TColumnValue>columns_value(1);

columns_value[0].__set_family(family);

columns_value[0].__set_qualifier(columnname);

columns_value[0].__set_value(columnvalue);

hbase::thrift2::TPutput;

put.__set_row(rowkey);

put.__set_columnValues(columns_value);

hbase_client->put(tablename,put);//插入,出錯拋異常hbase::thrift2::TIOError

//查詢參數設置

hbase::thrift2::TGetinput;

input.__set_row(rowkey);

hbase::thrift2::TResultresult;//查詢結果存放在這裡

hbase_client->get(result,tablename,input);//查詢,出錯拋異常hbase::thrift2::TIOError

//顯示查詢結果

for(inti=0;i<static_cast<int>(result.columnValues.size());++i)

{

consthbase::thrift2::TColumnValue&column_value_ref=result.columnValues[i];

fprintf(stdout,"family[%s]/qualifier[%s]/timestamp[%"PRIu64"]:%s\n",column_value_ref.family.c_str(),

column_value_ref.qualifier.c_str(),

column_value_ref.timestamp,

column_value_ref.value.c_str());

}

}

catch(hbase::thrift2::TIOError&ex)

{

fprintf(stderr,"IOError:%s\n",ex.what());

}

catch(apache::thrift::transport::TTransportException&ex)

{

//如果和服務端的Transport和Protocol不同,這裡的錯誤是“EAGAIN(timedout)”

fprintf(stderr,"(%d)%s\n",ex.getType(),ex.what());

}

catch(apache::thrift::TApplicationException&ex)

{

fprintf(stderr,"%s\n",ex.what());

}

catch(thrift::TException&ex)

{

fprintf(stderr,"%s\n",ex.what());

}

return0;

}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved