基于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 相关文章推荐
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
最新用php获取谷歌PR值算法,附上php查询PR值代码示例
Dec 25 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 PHP
PHP错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
Jul 28 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
Dec 18 PHP
php强制更新图片缓存的方法
Feb 11 PHP
使用php完成常见的文件上传功能(推荐)
Jan 13 PHP
老生常谈PHP面向对象之标识映射
Jun 21 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
php array_map()函数实例用法
Mar 03 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
全国FM电台频率大全 - 21 海南省
2020/03/11 无线电
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php表单习惯用的正则表达式
2017/10/11 PHP
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jQuery Easyui学习教程之实现datagrid在没有数据时显示相关提示内容
2016/07/09 Javascript
探讨跨域请求资源的几种方式(总结)
2016/12/02 Javascript
学习vue.js计算属性
2016/12/03 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
微信公众号生成新浪短网址的实现(快速生成)
2019/08/18 Javascript
Javascript实现打鼓效果
2021/01/29 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
用python找出那些被“标记”的照片
2017/04/20 Python
Python输出带颜色的字符串实例
2017/10/10 Python
Python 多核并行计算的示例代码
2017/11/07 Python
Python实现简单遗传算法(SGA)
2018/01/29 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
pycharm实现在虚拟环境中引入别人的项目
2020/03/09 Python
python实现超级玛丽游戏
2020/03/18 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5中原生的右键菜单创建方法
2016/06/28 HTML / CSS
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
酒后驾驶检讨书
2014/01/27 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
谢师宴邀请函
2015/02/02 职场文书
社区五一劳动节活动总结
2015/02/09 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫