HBase & thrift & C++编程
目录
1. 前言
本文目的是介绍使用C++如何操作HBase。从HBase 0.94开始,HBase新增thrift2,本文只介绍和讨论thrift2相关的。hbase-1.1.2使用的thrift估计是thrift-0.9.0版本。
2. 启动和停止thrift2
2.1. 启动thrift2
登录HBase master机器,执行以下命令启动thrift2:hbase-daemon.sh start thrift2。
thrift默认的监听端口是9090,可以通过参数“-p”指定其它端口。默认使用的Server是TThreadPoolServer。默认使用的Protocol是TBinaryProtocol。
注意客户端使用的Protocol和Transport和服务端的要保持一致,否则客户端在调用时,可能遇到“EAGAIN (timed out)”等错误。
2.2. 停止thrift2
hbase-daemon.sh stop thrift2
2.3. 启动参数
使用“hbase-daemon.sh start thrift2”时,还可以带以下参数:
|
参数名 |
是否默认 |
参数说明 |
|
-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 |
客户端和hbase thrift2的Transport和Protocol需保持一致,比如客户端为FramedTransport,则也需以“-f”启动hbase thrift2。
否则客户端在调用时,可能会遇到“EAGAIN (timed out)”等错误。
启动参数信息来源于官网的页面:
https://hbase.apache.org/devapidocs/org/apache/hadoop/hbase/thrift2/package-summary.html。
以上参数不是给hbase-daemon.sh使用,而是被hbase thrift2使用,可以浏览相关源代码了解细节:
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.sh start thrift2 --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 --gen cpp -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,它可以帮助简化对HBase thrift2的调用:
|
// 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("thrift exception: (%d)%s\n", ex.getType(), ex.what()); // } // catch (apache::thrift::transport::TApplicationException& ex) // { // MYLOG_ERROR("thrift exception: %s\n", ex.what()); // } // catch (apache::thrift::TException& ex) // { // MYLOG_ERROR("thrift exception: %s\n", ex.what()); // } // Transport除默认的TFramedTransport (TBufferTransports.h),还可选择: // TBufferedTransport (TBufferTransports.h) // THttpTransport // TZlibTransport // TFDTransport (TSimpleFileTransport) // // Protocol除默认的apache::thrift::protocol::TBinaryProtocol,还可选择: // TCompactProtocol // TJSONProtocol // TDebugProtocol template <class ThriftClient, class Protocol=apache::thrift::protocol::TBinaryProtocol, class Transport=apache::thrift::transport::TFramedTransport> class CThriftClientHelper |
5. 示例代码
|
// HBase thrift2 C++编程示例 #include "THBaseService.h" #include <inttypes.h> // PRIu64 #include <mooon/net/thrift_helper.h> #include <mooon/utils/args_parser.h> #include <vector> // 请注意客户端使用的thrift的Transport和Protocol要和hbase thrift2服务端保持一致, // 否则调用时,可能总是报超时,或其它错误!!! // // 运行之前,请通过HBase shell创建好表:create 'test','cf1','cf2' // 或指定版本数:create 'test',{NAME=>'cf1',VERSIONS=>2},{NAME=>'cf2',VERSIONS=>3} // 删除表,按顺序执行以下两条HBase shell命令: // disable 'test' // drop 'test' STRING_ARG_DEFINE(hbase_ip, "192.168.0.1", "hbase thrift ip"); INTEGER_ARG_DEFINE(uint16_t, hbase_port, 9090, 1000, 50000, "hbase thrift port"); int main(int argc, char* argv[]) { std::string errmsg; if (!mooon::utils::parse_arguments(argc, argv, &errmsg)) { fprintf(stderr, "parameter error: %s\n", errmsg.c_str()); exit(1); } using namespace apache; using namespace apache::hadoop; std::string hbase_ip = mooon::argument::hbase_ip->value(); uint16_t hbase_port = mooon::argument::hbase_port->value(); mooon::net::CThriftClientHelper<hbase::thrift2::THBaseServiceClient> hbase_client(hbase_ip, hbase_port); try { hbase_client.connect(); // 连接hbase thrift2 server fprintf(stdout, "connect %s:%d ok\n", hbase_ip.c_str(), hbase_port); std::string tablename = "test"; // 表名,确保运行之前已创建好 std::string rowkey = "row1"; // 行Key std::string family = "cf1"; // 例族名 std::string columnname = "f1"; // 例名 std::string columnvalue = "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::TPut put; put.__set_row(rowkey); put.__set_columnValues(columns_value); hbase_client->put(tablename, put); // 插入,出错抛异常hbase::thrift2::TIOError // 查询参数设置 hbase::thrift2::TGet input; input.__set_row(rowkey); hbase::thrift2::TResult result; // 查询结果存放在这里 hbase_client->get(result, tablename, input); // 查询,出错抛异常hbase::thrift2::TIOError // 显示查询结果 for (int i=0; i<static_cast<int>(result.columnValues.size()); ++i) { const hbase::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 (timed out)” 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()); } return 0; } |
如果thrift客户端报如下错误,有可能是因为一次写入的数据太多,导致包过大:
Thrift: Fri Apr 22 17:30:41 2016 TSocket::write_partial() send() <Host: 10.143.136.208 Port: 9090>Connection reset by peer
Thrift: Fri Apr 22 17:30:41 2016 TSocket::write_partial() send() <Host: 10.143.136.208 Port: 9090>Connection reset by peer
HBase & thrift & C++编程的更多相关文章
- python Hbase Thrift pycharm 及引入包
cp -r hbase/ /usr/lib/python2.7/site-packages/ 官方示例子http://code.google.com/p/hbase-thrift/source/bro ...
- hbase thrift 定义
/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agre ...
- HBase Thrift过滤语法
摘抄自hbase ref guide 0.94: 在写本文的时候,hbase ref guide已经更新到1.2及2.0了,但是个人感觉Thrift过滤语法部分写得都没有0.94的好,省掉了examp ...
- Hbase使用MapReduce编程导出数据到HDFS
废话少说,直接上代码! package cn.com.oozie.demo; import java.io.IOException; import org.apache.hadoop.conf.C ...
- hbase thrift 访问队列
public class CallQueue implements BlockingQueue<Runnable> { private static Log LOG = LogFact ...
- 搭建HBase+thrift+php环境
http://www.beauty-soft.net/blog/ceiba/hadoop/2013-05-19/644.html http://www.360doc.com/content/11/07 ...
- 北风风hadoop课程体系
课程一.基于Linux操作系统平台下的Java语言开发(20课时)课程简介本套课程主要介绍了Linux系统下的Java环境搭建及最基础的Java语法知识.学习Linux操作系统下Java语言开发的好处 ...
- 使用C#通过Thrift访问HBase
前言 因为项目需要要为客户程序提供C#.Net的HBase访问接口,而HBase并没有提供原生的.Net客户端接口,可以通过启动HBase的Thrift服务来提供多语言支持. Thrift介绍 环境 ...
- 在Azure HDInsight HBase集群中使用Thrift接口
Sun wei Wed, Feb 25 2015 2:17 AM Apache Thrift 是一种可扩展的跨语言服务接口,可以通过内置的代码生成引擎帮助创建跨语言服务类库,Apache HBase ...
随机推荐
- clamav完整查杀linux病毒实战(转)
开篇前言 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,Linux上的病毒.木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux ...
- centos7下Firewall使用详解
安装它,只需 # yum install firewalld如果需要图形界面的话,则再安装# yum install firewall-config 一.介绍 防火墙守护 firewalld 服务引入 ...
- 两个不错点电影ED2000资源
http://simplecd.me/ http://www.ed2000.com/ http://www.2tu.cc/ http://www.mp4ba.com/ http://www.ddyy. ...
- 修改panabit web管理介面端口
panabit使用mini_httpd为web发布平台,版本为1.19.使用https协议发布,端口443,运行命令为/usr/panabit/bin/ipe_httpd. panabit启动时使用/ ...
- ASI和TS流有什么区别
TS流是信源码流,最高码率为44.209 Mbit/s,它是经过信源编码后的压缩码流,为了使欲传输的信源信息在传输速率一定的条件下更快更多地传输,还要把数据进行压缩,也就是通过信源编码去掉信息中多余的 ...
- 用PHP收发邮件
注:在WinForm下怎么试都不好使,最后没办法换成了PHP下,一试就好使了. 这里用到了phpmailer组件,网上有下. 转:phpnow支持ssl的方法 原文出处:http://blog.163 ...
- 接口测试“八重天”---HttpClient
HTTP协议在互联网无处不在,在前面的章节中记录了‘接口本质即协议’,因此,接口测试首先了解的便是协议,其发送数据包和接收数据包的过程,其次便是如何在测试中去发送去解析,不论是通过代码还是工具也好,抽 ...
- Synergy使用(安装及配置)
最近在看一篇文章,找到了一款符合我需求的软件:Synergy. Synergy可以在多台电脑上进行鼠标与键盘及剪贴板(只能共享文本)的共享.不用每台电脑都插上这些外设了... 共享文件可以参看微软出品 ...
- 39. Combination Sum + 40. Combination Sum II + 216. Combination Sum III + 377. Combination Sum IV
▶ 给定一个数组 和一个目标值.从该数组中选出若干项(项数不定),使他们的和等于目标值. ▶ 36. 数组元素无重复 ● 代码,初版,19 ms .从底向上的动态规划,但是转移方程比较智障(将待求数分 ...
- c#二维码建立与识别
QrCodeEncodingOptions options = new QrCodeEncodingOptions(); options.CharacterSet = "UTF-8" ...