基于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 相关文章推荐
phpmyadmin操作流程
Oct 09 PHP
php cache类代码(php数据缓存类)
Apr 15 PHP
destoon实现首页显示供应、企业、资讯条数的方法
Jul 15 PHP
php结合js实现点击超链接执行删除确认操作
Oct 31 PHP
php版微信自动获取收货地址api用法示例
Sep 22 PHP
PHP实现动态删除XML数据的方法示例
Mar 30 PHP
php实现有序数组旋转后寻找最小值方法
Sep 27 PHP
PHP7内核之Reference详解
Mar 14 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
Oct 30 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 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/05/14 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
php反射学习之不用new方法实例化类操作示例
2019/06/14 PHP
PHP goto语句用法实例
2019/08/06 PHP
jquery tablesorter.js 支持中文表格排序改进
2009/12/09 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jQuery实现摸拟alert提示框
2016/05/22 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
VUE多层路由嵌套实现代码
2017/05/15 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
vue实现仿淘宝结账页面实例代码
2017/11/08 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
如何构建一个Vue插件并生成npm包
2020/10/26 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
微信小程序向Java后台传输参数的方法实现
2020/12/10 Javascript
Python专用方法与迭代机制实例分析
2014/09/15 Python
理解Python中的With语句
2015/02/02 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
jupyter notebook中美观显示矩阵实例
2020/04/17 Python
美国批发供应商:Kole Imports
2019/04/10 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
ORACLE第二个十问
2013/12/14 面试题
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
遗产继承公证书
2014/04/09 职场文书
挂靠协议书范本
2014/04/22 职场文书
运输企业安全生产责任书
2014/07/28 职场文书
资产运营委托书范本
2014/10/16 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js