基于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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
php读取mysql的简单实例
Jan 15 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
thinkPHP学习笔记之安装配置篇
Mar 05 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
php事件驱动化设计详解
Nov 10 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
Feb 28 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php+ajax 文件上传代码实例
Mar 18 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注入实例
2006/10/09 PHP
php牛逼的面试题分享
2013/01/18 PHP
javascript Select标记中options操作方法集合
2008/10/22 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
客户端限制只能上传jpg格式图片的js代码
2010/12/09 Javascript
window.dialogArguments 使用说明
2011/04/11 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
jquery中radio checked问题
2015/03/16 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
Python中处理字符串的相关的len()方法的使用简介
2015/05/19 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
python 接口返回的json字符串实例
2018/03/27 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
CSS3结构性伪类选择器九种写法
2012/04/18 HTML / CSS
一个不错的HTML5 Canvas多层点击事件监听实例
2014/04/29 HTML / CSS
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
欧克利英国官网:Oakley英国
2019/08/24 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
高中生期末评语
2014/01/28 职场文书
校长先进事迹材料
2014/02/01 职场文书
办公室秘书岗位职责范本
2014/02/11 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
八项规定整改方案
2014/02/21 职场文书
服装发布会策划方案
2014/05/22 职场文书
入党积极分子个人总结
2015/03/02 职场文书
大专护理专业自荐信
2015/03/25 职场文书
小学四年级作文之写景
2019/08/23 职场文书
SQL Server中搜索特定的对象
2022/05/25 SQL Server