基于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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
《PHP边学边教》(01.开篇――准备工作)
Dec 13 PHP
9个经典的PHP代码片段分享
Dec 18 PHP
php的GD库imagettftext函数解决中文乱码问题
Jan 24 PHP
PHP答题类应用接口实例
Feb 09 PHP
浅谈json_encode用法
Mar 05 PHP
php可变长参数处理函数详解
Feb 22 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
PHP array_shift()用法实例分析
Jan 07 PHP
PHP html_entity_decode()函数讲解
Feb 25 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
PHP copy函数使用案例代码解析
Sep 01 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导入Excel到MySQL的方法
2011/04/23 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
jQuery新闻滚动插件 jquery.roller.js
2011/06/27 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
Node.js中的process.nextTick使用实例
2015/06/25 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
element ui 表格动态列显示空白bug 修复方法
2018/09/04 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[46:59]完美世界DOTA2联赛PWL S2 GXR vs Ink 第二场 11.19
2020/11/20 DOTA
python正则表达式中的括号匹配问题
2014/12/14 Python
Python中的True,False条件判断实例分析
2015/01/12 Python
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
python删除过期log文件操作实例解析
2018/01/31 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
python之mock模块基本使用方法详解
2019/06/27 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
如何使用python写截屏小工具
2020/09/29 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
大学生实习期自我评价范文
2013/10/03 职场文书
师范生自荐信
2013/10/27 职场文书
军校制空专业毕业生自我鉴定
2013/11/16 职场文书
学校安全工作制度
2014/01/19 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
新教师培训方案
2014/06/08 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
八年级语文教学反思
2016/03/03 职场文书
基于PyTorch实现一个简单的CNN图像分类器
2021/05/29 Python
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫