C++通过thrfit2高效读写HBase

本文详细介绍如何通过C++访问HBase数据库,包括配置ThriftServer、创建客户端、批量PUT数据等关键步骤。深入解析HBase的Thrift接口,帮助读者理解C++环境下HBase的高效操作。

hbase没有提供直接供c++的访问方法,而是通过thrift2服务提供。如需要通过c++访问hbase就需要hbase开启thrift server。

开启方法:

$HBASE_HOME/bin/hbase-daemon.sh start thrift2 -t 60000

thrift server默认开启9090端口。hbase对客户端读取有超时策略,默认1分钟,启动时可通过-t参数指定超时时长,超时后hbase客户端会关闭连接,这时如果用原连接读取数据会产生Broken pipe的异常。其他参数可通过查看thrift server源码了解 。

创建客户端:(这里我创建了2个,一个用于读,一个用于写)。默认的客户端不是线程安全的,如需要在线程间共享客户端连接,可使用线程安全的THBaseServiceConcurrentClient。详细见生成的hbase的thrift客户端代码。

bool HBaseDriver::getClient(string ip,int port){
    try {
				this->thriftIp = ip;
				this->thriftPort = port;
				socket_ = SHARED_PTR_NAMESPACE::shared_ptr<TSocket>(new TSocket(ip, port));
				#ifdef FRAMED
						transport_ = SHARED_PTR_NAMESPACE::shared_ptr<TTransport>(new TFramedTransport(socket_));
				#else
						transport_ = SHARED_PTR_NAMESPACE::shared_ptr<TTransport>(new TBufferedTransport(socket_));
				#endif
				protocol_ = SHARED_PTR_NAMESPACE::shared_ptr<TProtocol>(new TBinaryProtocol(transport_));
				transport_->open();
				client_ = new THBaseServiceClient(protocol_);
				put_socket_ = SHARED_PTR_NAMESPACE::shared_ptr<TSocket>(new TSocket(ip, port));
				put_transport_ = SHARED_PTR_NAMESPACE::shared_ptr<TTransport>(new TBufferedTransport(put_socket_));
				put_protocol_ = SHARED_PTR_NAMESPACE::shared_ptr<TProtocol>(new TBinaryProtocol(put_transport_));
				put_transport_->open();
				put_client_ = new THBaseServiceClient(put_protocol_);
    } catch(TException tex) {
				LOG(string(tex.what()));
				return false;
    }
    return true;
}

批量PUT数据:

void HBaseDriver::putPerson(string& tableName, string& rowKey, unordered_map<string ,string>& qualifierVal, string& family){
				count +=1;
				TPut put;
				std::vector<TColumnValue> cvs;
				put.__set_row(rowKey);
				if(BOOL_TEST){
				        start = clock();
				        BOOL_TEST = false;
				}
				unordered_map<string , string>::iterator it;
				try{
				        it = qualifierVal.begin();
				        while(it != qualifierVal.end()) {
				                TColumnValue cv;
				                cv.__set_family(family);
				                cv.__set_qualifier(it->first);
				                cv.__set_value(it->second);
				                /*if(it->first == "feature"){ //if the key is 'feature'
				                        assert(it->second.length() == BASE64_FEATURE_LEN);
				                }*/
				                cvs.insert(cvs.end(), cv);
				                put.__set_durability(TDurability::SKIP_WAL);//skit write ahead log for speed up
				                put.__set_columnValues(cvs);
				                personPuts.insert(personPuts.end(), put);
				                it++;
				        }
				        if(this->count % this->PUT_BATCH_SIZE == 0){
				                start = clock();
				                put_client_->putMultiple(tableName, personPuts);
				                finish = clock();
				                duration = (finish - start) / CLOCKS_PER_SEC;
				                printf( "===================================== %f seconds cost for hbase put.\n", duration );
				                BOOL_TEST = true;
				                //long end = CURRENT_TIME();
				                //LOG(string("Time Cost :"+to_string(end-start)+" ms"));
				                personPuts.clear();
				        }
				        cvs.clear();
				}catch(TException tex) {
								LOG(string(tex.what()));
				}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值