基于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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
PHP在字符串中查找指定字符串并删除的代码
Oct 02 PHP
PHP 事务处理数据实现代码
May 13 PHP
joomla内置的表单验证功能使用方法
Jun 11 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
May 23 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
php类的定义与继承用法实例
Jul 07 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
对比分析php中Cookie与Session的异同
Feb 19 PHP
Yii2选项卡的简单使用
May 26 PHP
使用composer安装使用thinkphp6.0框架问题【视频教程】
Oct 01 PHP
PHP获取学生成绩的方法
Nov 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
详谈PHP文件目录基础操作
2014/11/11 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
php中namespace use用法实例分析
2016/01/22 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
2016/03/18 PHP
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
详解jQuery中的元素的属性和相关操作
2015/08/14 Javascript
浅谈javascript 函数表达式和函数声明的区别
2016/01/05 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
js中获取jsp表单中radio类型的值简单实例
2016/08/15 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
JavaScript简介_动力节点Java学院整理
2017/06/26 Javascript
关于TypeScript模块导入的那些事
2018/06/12 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
Python列表解析配合if else的方法
2018/06/23 Python
Python csv模块使用方法代码实例
2019/08/29 Python
nginx+uwsgi+django环境搭建的方法步骤
2019/11/25 Python
python压包的概念及实例详解
2021/02/17 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
竞职演讲稿范文
2014/01/11 职场文书
美容院合作经营协议书
2014/10/10 职场文书
2014年审计工作总结
2014/11/17 职场文书
个人工作违纪检讨书
2015/05/05 职场文书
会议营销主持词
2015/07/03 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
深入理解Pytorch微调torchvision模型
2021/11/11 Python
Javascript 解构赋值详情
2021/11/17 Javascript
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js
MySql如何将查询的出来的字段进行转换
2022/06/14 MySQL