基于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、socket、file_get_contents三种方法POST提交数据
Aug 12 PHP
php的数组与字符串的转换函数整理汇总
Jul 18 PHP
php中debug_backtrace、debug_print_backtrace和匿名函数用法实例
Dec 01 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
Dec 06 PHP
EarthLiveSharp中cloudinary的CDN图片缓存自动清理python脚本
Apr 04 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
Jul 03 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
May 21 PHP
PHP工厂模式、单例模式与注册树模式实例详解
Jun 03 PHP
laravel使用数据库测试注意事项
Apr 10 PHP
PHP copy函数使用案例代码解析
Sep 01 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性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
在网页里看flash的trace数据的js类
2009/01/10 Javascript
JQuery验证工具类搜集整理
2013/01/16 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
jQuery遍历json的方法分析
2016/04/16 Javascript
jQuery Raty 一款不错的星级评分插件
2016/08/24 Javascript
基于Bootstrap的网页设计实例
2017/03/01 Javascript
JavaScript获取tr td 的三种方式全面总结(推荐)
2017/08/15 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
vue-cli3.0使用及部分配置详解
2018/08/29 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
实例详解vue中的$root和$parent
2019/04/29 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
webpack 如何同时输出压缩和未压缩的文件的实现步骤
2020/06/05 Javascript
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
django中账号密码验证登陆功能的实现方法
2019/07/15 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
Python自带的IDE在哪里
2020/07/01 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
2020/07/13 Python
python处理写入数据代码讲解
2020/10/22 Python
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
新闻专业本科生的自我评价分享
2013/11/20 职场文书
出生公证书样本
2014/04/04 职场文书
团拜会策划方案
2014/06/07 职场文书
代办委托书怎么写
2014/08/01 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
正规借条模板
2015/05/26 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
python随机打印成绩排名表
2021/06/23 Python
vscode内网访问服务器的方法
2022/06/28 Servers