編輯:關於android開發
目錄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
本文目的是介紹使用C++如何操作HBase。從HBase0.94開始,HBase新增thrift2,本文只介紹和討論thrift2相關的。hbase-1.1.2使用的thrift估計是thrift-0.9.0版本。
登錄HBasemaster機器,執行以下命令啟動thrift2:hbase-daemon.shstartthrift2。
thrift默認的監聽端口是9090,可以通過參數“-p”指定其它端口。默認使用的Server是TThreadPoolServer。默認使用的Protocol是TBinaryProtocol。
注意客戶端使用的Protocol和Transport和服務端的要保持一致,否則客戶端在調用時,可能遇到“EAGAIN(timedout)”等錯誤。
hbase-daemon.shstopthrift2
使用“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
hbaser.thrift文件在hbase源代碼包(以hbase-1.1.2為例)中的位置:
hbase-thrift\src\main\resources\org\apache\hadoop\hbase\thrift2\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。
為了簡化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
//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;
}
Android WebView和JavaScript交互,androidwebview JavaScript在現在的網頁設計中用得很多,Android 的WebView
mvp+retrofit+rxjava,retrofitrxjava引用 retrofit : com.squareup.retrofit2:r
QQ5.0側滑,qq5.0package com.example; import android.os.Bundle; import android.support.v7
Android基礎入門教程——8.3.16 Canvas API詳解(Part 1) Android基礎入門教程——8.3.16 Canvas A