基于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
Zend Framework页面缓存实例
Jun 25 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
PhpStorm terminal无法输入命令的解决方法
Oct 09 PHP
基于PHP实现用户注册登录功能
Oct 14 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
Apr 26 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
May 23 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
PHP实现支持CURL字符串证书传输的方法
Mar 23 PHP
浅谈laravel框架sql中groupBy之后排序的问题
Oct 17 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
第十三节 对象串行化 [13]
2006/10/09 PHP
Mysql的常用命令
2006/10/09 PHP
php Undefined index和Undefined variable的解决方法
2008/03/27 PHP
深入探讨<br />和 \r\n两者有什么区别??
2013/06/05 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
PHP执行系统命令函数实例讲解
2021/03/03 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
jquery ajaxSubmit 异步提交的简单实现
2014/02/28 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
javascript实现控制的多级下拉菜单
2015/07/05 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
2017/04/10 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
在Django框架中编写Contact表单的教程
2015/07/17 Python
使用matplotlib画散点图的方法
2018/05/25 Python
numpy返回array中元素的index方法
2018/06/27 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
C#可否对内存进行直接的操作
2015/02/26 面试题
四种会话跟踪技术
2015/05/20 面试题
护理专业自荐信
2013/12/03 职场文书
职务聘任书范文
2014/03/29 职场文书
初三学习计划书范文
2014/04/30 职场文书
食品安全承诺书范文
2014/08/29 职场文书
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
离婚被告代理词
2015/05/23 职场文书
举起手来观后感
2015/06/09 职场文书
python中的被动信息搜集
2021/04/29 Python