技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> HBase Thrift 接口使用注意事项

HBase Thrift 接口使用注意事项

浏览:5392次  出处信息

   这里结合对HBase Thrift接口(HBase版本为0.92.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);

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等属性进行扫描。

并发访问线程数

   首先,为了尽可能减少由于网络传输带来的时间开销,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)。

最大堆内存配置

   如果客户端与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中设置)。

建议继续学习:

  1. Linux大棚版Thrift入门教程    (阅读:23557)
  2. HBase集群出现NotServingRegionException问题的排查及解决方法    (阅读:16204)
  3. HFile存储格式    (阅读:14521)
  4. hbase运维    (阅读:13670)
  5. hbase介绍    (阅读:11014)
  6. HBase技术介绍    (阅读:6737)
  7. HBase随机写以及随机读性能测试    (阅读:6480)
  8. HBase性能优化方法总结    (阅读:5818)
  9. HBase二级索引与Join    (阅读:5763)
  10. Thrift简析    (阅读:4841)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1