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

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*) &timestamp;
  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中设置)。

时间: 2024-09-17 03:40:29

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

PHP基于反射机制实现插件的可插拔设计详解_php技巧

本文实例讲述了PHP基于反射机制实现插件的可插拔设计.分享给大家供大家参考,具体如下: 说PHP和ASP等同的朋友们可以就此打住了,PHP支持反射,而且还是非常的强大.好了,我们开始今天的话题. 功能描述: 页面拥有一个主导航菜单,里头有默认连接若干. 插件统一存放在一个目录,插件载入后会自动在导航菜单中增加上自己所需的链接. 插件载入时可执行一定的操作. 动态增删插件无需改动代码. 最终效果: 首页,插件1,插件2 "首页"是系统自带的菜单项."插件1"和&quo

php接口技术实例详解_php技巧

本文实例讲述了php接口技术.分享给大家供大家参考,具体如下: 1.接口是一种特殊的抽象类,为什么这么说呢?如果一个抽象类中所有的方法都是抽象方法,那么我们就换一种称呼,称为"接口". 2.另外接口中不能声明变量. 3.接口中所有的成员都是public权限的.所有的子类在实现时,也一定要使用public权限去实现. 4.声明一个类的时候,我们用关键字"class",而声明接口的时候,我们用关键字"interface". <?php //定义

基于php使用memcache存储session的详解_php技巧

web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要装好memcache模块 1.设置session用memcache来存储方法I: 在 php.ini 中全局设置session.save_handler = memcachesession.save_path = "tcp://127.0.0.1:11211"方法II: 某个目录下的 .h

基于PHP对XML的操作详解_php技巧

<?php      $xml = simplexml_load_file('example.xml');              //创建SimpleXML对象       var_dump($xml);                                                             //输出XML   ?>  <?php      $xml = simplexml_load_file('example.xml');          //读取

基于PHP开发中的安全防范知识详解_php技巧

PHP代码安全和XSS,SQL注入等对于各类网站的安全非常中用,尤其是UGC(User Generated Content)网站,论坛和电子商务网站,常常是XSS和SQL注入的重灾区.这里简单介绍一些基本编程要点, 相对系统安全来说,php安全防范更多要求编程人员对用户输入的各种参数能更细心. php编译过程中的安全 建议安装Suhosin补丁,必装安全补丁php.ini安全设置 复制代码 代码如下: register_global = offmagic_quotes_gpc = offdisp

基于header的一些常用指令详解_php技巧

header常用指令header分为三部分:第一部分为HTTP协议的版本(HTTP-Version):第二部分为状态代码(Status):第三部分为原因短语(Reason-Phrase). // fix 404 pages:   用这个header指令来解决URL重写产生的404 headerheader('HTTP/1.1 200 OK');   // set 404 header:   页面没找到header('HTTP/1.1 404 Not Found');   //页面被永久删除,可以

基于php iconv函数的使用详解_php技巧

unix下安装PHP的module,需要重新编译PHP,Windows下安装模板,只需将php.ini里的配置打开相应的dll就可,例如,需要加入gb库的支持,需要如下设置:extension_dir = "C:/ipaddr/php/extensions/"(注意,建议写全地址,并且后面加上/,很多时候是因为这里设置不对,才导致无法加载其它模块的dll的)再打开extension=php_gd2.dll但如果是安装iconv.dll,按上面方法,打开php_iconv.dll后,还是

基于xcache的配置与使用详解_php技巧

一.安装Xcache 复制代码 代码如下: # wget http://xcache.lighttpd.net/pub/Releases/1.3.0/xcache-1.3.0.tar.gz# tar zxvf xcache-1.3.0.tar.gz# cd xcache-1.3.0# /usr/local/php/bin/phpize# ./configure --enable-xcache--enable-xcache-coverager --enable-xcache-optimizer--

基于PHP创建Cookie数组的详解_php技巧

创建: 复制代码 代码如下: setcookie("ICNet[Reg]", "This is reg cookie", time() + 3600);setcookie("ICNet[Active]", "This is login cookie.", time() + 3600);print_r($_COOKIE); /*Result:Array (  [ICNet] => Array ( [Reg] => T