基于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批量生成随机用户名
Jul 10 PHP
PHP MYSQL乱码问题,使用SET NAMES utf8校正
Nov 30 PHP
PHP缓存技术的使用说明
Aug 06 PHP
PHP 图片上传代码
Sep 13 PHP
深入php中var_dump方法的使用详解
Jun 24 PHP
PHP error_log()将错误信息写入一个文件(定义和用法)
Oct 25 PHP
php对二维数组按指定键值key排序示例代码
Nov 26 PHP
php程序内部post数据的方法
Mar 31 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
phpmyadmin下载、安装、配置教程
May 16 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php cli 小技巧
2013/06/03 PHP
php伪静态之APACHE篇
2014/06/02 PHP
php中rename函数用法分析
2014/11/15 PHP
简单说说PHP优化那些事(经验分享)
2014/11/27 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
用JavaScript脚本实现Web页面信息交互
2006/10/11 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
利用jQuery中的ajax分页实现代码
2016/02/25 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
[01:00:17]DOTA2-DPC中国联赛 正赛 SAG vs Dynasty BO3 第二场 1月25日
2021/03/11 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
Python 元类实例解析
2018/04/04 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
Java Unsafe类实现原理及测试代码
2020/09/15 Python
python3.9和pycharm的安装教程并创建简单项目的步骤
2021/02/03 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
大学生活学习的自我评价
2013/12/03 职场文书
大学三年的自我评价
2013/12/25 职场文书
低碳环保演讲稿
2014/08/28 职场文书
党员自我评议对照检查材料
2014/09/27 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python