欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-05-07 23:51:09
hbase对于非java语言提供了thrift接口支持,这里结合对hbase thrift接口(hbase版本为0.92.1)的使用经验,总结其中遇到的一些问题及其相关注意...
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中设置)。