基于HBase Thrift接口的一些使用问题及相关注意事项的详解

2015-01-24信息快讯网

本篇文章是对HBase Thrift接口的一些使用问题及相关注意事项进行了详细的分析介绍,需要的朋友参考下

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中设置)。
FireFox浏览器使用Javascript上传大文件
教你如何使用php session
web server使用php生成web页面的三种方法总结
php加密解密函数authcode的用法详细解析
php session_start()出错原因分析及解决方法
PHP中$_SERVER的详细参数与说明介绍
关于php程序报date()警告的处理(date_default_timezone_set)
PHP的构造方法,析构方法和this关键字详细介绍
php mysql_real_escape_string函数用法与实例教程
从PHP $_SERVER相关参数判断是否支持Rewrite模块
ThinkPHP利用PHPMailer实现邮件发送实现代码
DOM XPATH获取img src值的query
PHP加密函数 Javascript/Js 解密函数
PHP和JavaScrip分别获取关联数组的键值示例代码
thinkphp 一个页面使用2次分页的实现方法
解析PHP中VC6 X86和VC9 X86的区别及 Non Thread Safe的意思
基于Discuz security.inc.php代码的深入分析
基于php在各种web服务器的运行模式详解
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
setcookie中Cannot modify header information-headers already sent by错误的解决方法详解
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
PHP5中Cookie与 Session使用详解
php中is_null,empty,isset,unset 的区别详细介绍
php中serialize序列化与json性能测试的示例分析
基于python发送邮件的乱码问题的解决办法
php class中self,parent,this的区别以及实例介绍
PHP中::、->、self、$this几种操作符的区别介绍
关于shopex同步ucenter的redirect问题,导致script不运行
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
PHP 自定义错误处理函数trigger_error()
浅谈apache和nginx的rewrite的区别
set_include_path和get_include_path使用及注意事项
APACHE的AcceptPathInfo指令使用介绍
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
©2014-2024 dbsqp.com