`
wbj0110
  • 浏览: 1603306 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

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

    《HBase Thrift接口使用详解:问题与注意事项》 HBase作为一款强大的分布式列存储系统,广泛应用于大数据处理。为了支持非Java语言的交互,HBase提供了Thrift接口,允许用C++、PHP、Python等语言操作HBase。然而,...

    thrift1 查询hbase

    Thrift接口将HBase的操作转换为易于理解和使用的API,用户可以通过这些API执行基本的CRUD(创建、读取、更新、删除)操作。 3. **Python与HBase通信**:Python客户端通过导入Thrift生成的库,可以建立到HBase ...

    HBase 官方文档

    - **从 0.94.x 升级到 0.96.x**:介绍升级过程中需要注意的重要事项及步骤。 - **从 0.92.x 升级到 0.94.x**:针对这一版本升级的具体指导。 - **从 0.90.x 升级到 0.92.x**:提供从早期版本到 0.92.x 的升级指南。 ...

    HBase官方文档中文版

    - **非Java语言交互**:介绍了HBase如何支持非Java语言客户端访问,包括REST、Thrift接口等。 - **C/C++客户端**:特别提及了C/C++语言下的HBase客户端库,方便C/C++开发者使用HBase。 #### 十一、性能调优 - **...

    HBase权威指南 中文版

    - **HBase MapReduce示例**:提供了一些使用HBase进行MapReduce编程的例子。 - **跨表访问**:在一个MapReduce作业中访问多个HBase表的方法。 #### 八、HBase安全 - **客户端访问控制**:确保只有授权用户可以访问...

    HBase权威指南中文版+官方文档

    - **从0.20.x或0.89.x升级到0.90.x**:列出具体的步骤与注意事项。 - **从0.90.x到0.92.x**:提供升级路径与建议。 #### 四、HBase Shell操作 - **使用脚本**:通过Shell执行SQL命令。 - **Shell技巧**:介绍提高...

    HBase 官方文档 中文版0.97.pdf

    HBaseShell是HBase的命令行接口,提供了脚本使用和一些Shell技巧,是进行HBase数据操作和维护的有力工具。 HBase与MapReduce的集成部分讨论了如何在Hadoop的MapReduce作业中使用HBase作为输入和输出的数据源。文档...

    HBase用户手册-v2.2.docx

    创建表是HBase操作的基础,手册详细讲解了创建表的方法和注意事项。 总之,《HBase用户手册-v2.2》是一份全面的参考资料,不仅介绍了HBase的基本概念和架构,还提供了实用的操作指南和最佳实践,帮助用户更好地理解...

    Hbase官方文档

    - 提供Thrift接口,使得非Java语言可以通过Thrift客户端库与HBase交互。 **10.2 REST** - 通过RESTful API提供HTTP访问接口。 **10.3 Thrift** - Thrift是Apache的一个跨语言服务开发框架,用于构建可扩展的跨...

    flume 1.8基本概念+官方文档

    `readme.txt`可能包含项目简介、安装指南或使用注意事项等内容,对于初学者来说非常有用。 总结,Flume是一个强大且灵活的日志管理系统,它的分布式特性、可定制的数据源和存储以及高可用性设计使其在大数据环境...

Global site tag (gtag.js) - Google Analytics