基于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 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
模仿OSO的论坛(一)
Oct 09 PHP
WindowsXP中快速配置Apache+PHP5+Mysql
Jun 05 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
Apr 28 PHP
PHP的array_diff()函数在处理大数组时的效率问题
Nov 27 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
php中使用gd库实现远程图片下载实例
May 12 PHP
PHP实现Google plus的好友拖拽分组效果
Oct 21 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP实现上传多图即时显示与即时删除的方法
May 09 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
PHP高并发和大流量解决方案整理
Mar 09 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
php常量详细解析
2015/10/27 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
PHP简单实现防止SQL注入的方法
2018/03/13 PHP
IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素
2011/07/31 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
机器学习10大经典算法详解
2017/12/07 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
详解python 注释、变量、类型
2018/08/10 Python
windows下搭建python scrapy爬虫框架步骤
2018/12/23 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
django的ORM操作 删除和编辑实现详解
2019/07/24 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python爬虫爬取Bilibili弹幕过程解析
2019/10/10 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
双立人美国官方商店:ZWILLING集团餐具和炊具
2020/05/07 全球购物
小学优秀班主任事迹材料
2014/05/17 职场文书
标准毕业生自荐信
2014/06/24 职场文书
职工宿舍管理制度
2015/08/05 职场文书
创业计划书之家教中心
2019/09/25 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python