基于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 CURL模拟GET及POST函数代码
Apr 25 PHP
关于php curl获取301或302转向的网址问题的解决方法
Jun 02 PHP
php启动时候提示PHP startup的解决方法
May 07 PHP
thinkphp实现数组分页示例
Apr 13 PHP
php 判断网页是否是utf8编码的方法
Jun 06 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
php表单敏感字符过滤类
Dec 08 PHP
php结合ACCESS的跨库查询功能
Jun 12 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
PHP语法小结之基础和变量
Nov 22 PHP
利用PHP将图片转换成base64编码的实现方法
Sep 13 PHP
php基于curl主动推送最新内容给百度收录的方法
Oct 14 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中实现汉字转区位码应用源码实例解析
2010/06/14 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
Yii使用smsto短信接口的函数demo示例
2016/07/13 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
js Function类型
2011/12/04 Javascript
JS Loading功能的简单实现
2013/11/29 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
javascript实现数独解法
2015/03/14 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
javascript中CheckBox全选终极方案
2015/05/20 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
全面了解Python环境配置及项目建立
2016/06/30 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
python 环境变量和import模块导入方法(详解)
2017/07/11 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
2019/08/12 Python
python主线程与子线程的结束顺序实例解析
2019/12/17 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
美国著名手表网站:Timepiece
2017/11/15 全球购物
优秀中学生事迹材料
2014/01/31 职场文书
怀念母亲教学反思
2014/04/28 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
教师节作文之小学四年级
2019/09/03 职场文书