基于HBase Thrift接口的一些使用问题及相关注意事项的详解


Posted in PHP onJune 03, 2013

HBase对于非Java语言提供了Thrift接口支持,这里结合对HBase Thrift接口(HBase版本为0.92.1)的使用经验,总结其中遇到的一些问题及其相关注意事项。
1. 字节的存放顺序
HBase中,由于row(row key和column family、column qualifier、time stamp)是按照字典序进行排序的,因此,对于short、int、long等类型的数据,通过Bytes.toBytes(…)转换成byte数组后,必须按照大端模式(高字节在低地址,低字节在高地址)存放。对于value,也是同样的道理。因此,在使用Thrift API(C++、Php、Python等)方式时,最好对于row和value都统一按照大端进行pack和unpack处理。
举个例子,C++中,对于int型变量,经过以下方式转换为字典序:

string key;
  int32_t timestamp = 1352563200;
  const char* pTs =(const char*) ×tamp;
  size_t n = sizeof(int32_t);
  key.append(pTs, n);

通过以下方式将字典序转换为int:
const char * ts = key.c_str();
int32_t timestamp = *((int32_t*)(ts));

Php中则提供了pack和unpack方法进行转换:
  $key = pack("N", $num);
  $num = unpack("N", $key);

2. TScan的使用陷阱
HBase的PHP Thrift接口中,TScan可以直接通过设置startRow、stopRow、columns、filter等属性,默认这些属性均为null,设置后变为非null(通过TScan的构造函数或直接对TScan的成员变量进行赋值)。通过write()方法和Thrift Server进行RPC操作时,直接判断的依据是这些属性不为null,则通过Thrift协议传输到Thrift Server端。
但是在C++的Thrift接口中,TScan中有一个_TScan__isset __isset类型的变量,其内部结构如下:
typedef struct _TScan__isset {
  _TScan__isset() : startRow(false), stopRow(false), timestamp(false), columns(false), caching(false), filterString(false) {}
  bool startRow;
  bool stopRow;
  bool timestamp;
  bool columns;
  bool caching;
  bool filterString;
} _TScan__isset;

TScan的write()方法则是通过判断_TScan__isset下的各个bool变量标记是否设置了startRow、stopRow、columns、filter等属性,决定是否将这些属性通过Thrift协议传输到Thrift Server端,而这些属性必须通过__set_xxx()方法进行设置才能生效!在TScan的默认构造函数中,并不会对这些属性对应的__isset标记设置为true!
因此,如果直接通过TScan的构造函数初始化startRow、stopRow、columns、filter等属性会导致从头遍历该表,只有调用了__set_xxx()方法才会将对应的bool标识设置为true,这样服务端才会从Thrift Server获取startRow、stopRow、columns、filter等属性进行扫描。
3. 并发访问线程数
首先,为了尽可能减少由于网络传输带来的时间开销,HBase的Thrift Server最好和应用客户端部署在同一台机器上。Thrift Server启动时可以通过参数配置并发线程数,否则很容易导致Thrift Server线程满了不响应客户端的读写请求,具体命令:bin/hbase-daemon.sh start thrift --threadpool -m 200 -w 500(更多参数参考这里:bin/hbase-daemon.sh start thrift -h)。
4. 最大堆内存配置
如果客户端与Thrift Server进行scan操作顺序读取数据,而且设置了一定的cache记录条数(通过TScan的int32_t caching变量设置),那么这些被caching的记录数可能会占用Thrift Server相当部分的堆内存,尤其在多客户端并发访问时更明显。
因此,在Thrift Server启动前,可以调大最大堆内存,否则可能由于java.lang.OutOfMemoryError异常而导致进程被杀掉,尤其是当Scan时设置了较大的caching记录条数的情况(默认为export HBASE_HEAPSIZE=1000MB,可以在conf/hbase-env.sh中设置)。
PHP 相关文章推荐
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
Apr 20 PHP
php防注入,表单提交值转义的实现详解
Jun 10 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
使用Sphinx对索引进行搜索
Jun 25 PHP
php 地区分类排序算法
Jul 01 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
Zend Framework生成验证码并实现验证码验证功能(附demo源码下载)
Mar 22 PHP
PHP读取大文件末尾N行的高效方法推荐
Jun 03 PHP
3种方法轻松处理php开发中emoji表情的问题
Jul 18 PHP
基于php在各种web服务器的运行模式详解
Jun 03 #PHP
PHP运行模式的深入理解
Jun 03 #PHP
PHP代码保护--Zend Guard的使用详解
Jun 03 #PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 #PHP
基于php-fpm的配置详解
Jun 03 #PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 #PHP
基于PHP一些十分严重的缺陷详解
Jun 03 #PHP
You might like
PHP 配置文件中open_basedir选项作用
2009/07/19 PHP
PHP中的Memcache详解
2014/04/05 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
记录一次排查PHP脚本执行卡住的问题
2016/12/27 PHP
PHP实现数组转JSon和JSon转数组的方法示例
2018/06/14 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
JavaScript 异步方法队列链实现代码分析
2010/06/05 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
js获取滚动距离的方法
2015/05/30 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
angularjs 动态从后台获取下拉框的值方法
2018/08/13 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
细说webpack6 Babel的使用详解
2019/09/26 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
Python类的多重继承问题深入分析
2014/11/09 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
python 爬取微信文章
2016/01/30 Python
Python操作rabbitMQ的示例代码
2019/03/19 Python
softmax及python实现过程解析
2019/09/30 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Python Django路径配置实现过程解析
2020/11/05 Python
python使用正则表达式匹配txt特定字符串(有换行)
2020/12/09 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
如何整合JQuery和Prototype
2014/01/31 面试题
介绍一下如何优化MySql
2016/12/20 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
移交协议书
2014/08/19 职场文书