基于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编写PDF文档生成器
Oct 09 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP运行模式的深入理解
Jun 03 PHP
简单的php新闻发布系统教程
May 09 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
Dec 23 PHP
PHP面向对象之里氏替换原则简单示例
Apr 08 PHP
PHP中PDO事务处理操作示例
May 02 PHP
Laravel 读取 config 下的数据方法
Oct 13 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 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接口中interface存在的意义
2013/06/27 PHP
迅速确定php多维数组的深度的方法
2014/01/07 PHP
Thinkphp多文件上传实现方法
2014/10/31 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
微信access_token的获取开发示例
2015/04/16 PHP
PHP+Apache环境中如何隐藏Apache版本
2017/11/24 PHP
Javascript学习笔记5 类和对象
2010/01/11 Javascript
jQuery 顶部导航跟随滚动条滚动固定浮动在顶部
2014/06/06 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
Vue.js动态组件解析
2016/09/09 Javascript
BootStrap中Table分页插件使用详解
2016/10/09 Javascript
JavaScript中绑定事件的三种方式及去除绑定
2016/11/05 Javascript
js通过keyCode值判断单击键盘上某个键,然后触发指定的事件方法
2017/02/19 Javascript
seajs实现强制刷新本地缓存的方法分析
2017/10/16 Javascript
解决IOS端微信H5页面软键盘弹起后页面下方留白的问题
2019/06/05 Javascript
在vue中使用防抖和节流,防止重复点击或重复上拉加载实例
2019/11/13 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
python关闭windows进程的方法
2015/04/18 Python
Python类定义和类继承详解
2015/05/08 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
简单了解python的一些位运算技巧
2019/07/13 Python
python实现在线翻译功能
2020/03/03 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Python+Opencv身份证号码区域提取及识别实现
2020/08/25 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
大课间活动实施方案
2014/03/06 职场文书
关于读书的活动方案
2014/08/14 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
Android开发手册Chip监听及ChipGroup监听
2022/06/10 Java/Android