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的使用陷阱

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/extra/

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

作者: 大圆那些事

网址: http://www.cnblogs.com/panfeng412/archive/2012/11/11/hbase-thrift-api-common-issues-summary.html

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, hbase
, 变量
, server
, java hbase
, thrift
, 属性
, 大端小端
, hbase参数
, spark thrift
, Columns
, 大端模式
大端法
hbase thrift接口、hbase thrift、hbase thrift2、hbase thrift server、python thrift hbase,以便于您获取更多的相关知识。

时间: 2024-08-30 09:12:25

HBase Thrift接口的常见使用问题和注意事项的相关文章

HBase Thrift接口的C++客户端

hbase-thrift项目是对HBase Thrift接口的封装,屏蔽底层的细节,使用户可以方便地通过HBase Thrift接口访问HBase集群,同时基于此对C++客户端读写的效率进行了简单的测试.该项目目前基于的是HBase thrift接口,至于HBase 0.94版本中的HBase thrift2接口,后续再考虑进一步的支持. 前提条件 1)下载,解压,安装 thrift-0.8.0. wget https://dist.apache.org/repos/dist/release/t

基于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数组后,必须按照大端模式(高字节在低地址,低字节在

HBase thrift/thrift2 使用指南

Thrift server简介 Thrift server是HBase中的一种服务,主要用于对多语言API的支持.基于Apache Thrift(多语言支持的通信框架)开发,目前有两种版本thrift和thrift2. thrift2是当时为了适应新的Java API,提出来的.由于种种原因,thrift2没有完美兼容并替代thrift,所有就留下了两个版本. Thrift 和 Thrift2 的区别 接口设计上Thrift2要比Thrfit更优雅,或者说和现在的API更贴近.比如两者的get接

HBase Thrift客户端Java API实践

HBase的Thrift API定义,可以通过链接 http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/resources/org/apache/hadoop/hbase/thrift/Hbase.thrift?view=markup看到,我们需要安装Thrift编译器,才能生成HBase跨语言的API. 首先下载上面链接的内容,保存为Hbase.thrift. 然后,执行如下命令,生成不同编程语言的HBase API:

HBase Thrift 使用以及Thriftserver 分析

对于thriftserver 我们主要从2个大的方面进行分析:thrift的使用:thriftserver的部署:thriftserver的启动,初始化:thriftserver的读写等请求处理: 一:thrift的使用 Thrift的主要目的是方便各个语言可以使用HBase,java,c++,py,PHP,等等:在我们下载下来的hbase的文件里面的下面的目录: hbase/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thri

接口中常见的时间处理方法

 private static SimpleDateFormat in=new SimpleDateFormat("EE MMM dd HH:mm:ss ZZZZZ yyyy",Locale.US);  private static SimpleDateFormat out=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  //转换此美式时间 Mon Aug 29 14:39:25 +0800 2011  private s

VC用Ado接口连接和使用数据库及注意事项_实用技巧

一.阅读本文所需注意的其它事项 1.进行方法调用时,所传递的参数的类型的转换(可能存在比本文更简便的处理方法但我未发现) 2.每个源文件的每行注释说明了其文件名 3.请关注相关头文件包含关系 4.请关注文中所有中文注释 5.更多的内容请参阅 "VC安装目录\Include\adoint.h"文件,adoint即ActiveX Data Object InterFace(菜 鸟请勿惊慌,这仅仅只是个名称) 二.下面的源文件与您的数据库应用程序不直接相关,但其目标代码(生成的.obj文件)

Impala与HBase整合实践

我们知道,HBase是一个基于列的NoSQL数据库,它可以实现的数据的灵活存储.它本身是一个大表,在一些应用中,通过设计RowKey,可以实现对海量数据的快速存储和访问.但是,对于复杂的查询统计类需求,如果直接基于HBase API来实现,性能非常差,或者,可以通过实现MapReduce程序来进行查询分析,这也继承了MapReduce所具备的延迟性. 实现Impala与HBase整合,我们能够获得的好处有如下几个: 可以使用我们熟悉的SQL,像操作传统关系型数据库一样,很容易给出复杂查询.统计分

HBase的常见疑难问题

本文对HBase开发及使用过程中遇到过的常见问题进行梳理总结,希望能解答新加入的HBaser们的一些疑惑. 1. HTable线程安全吗? HTable不是线程安全的,使用过程中建议一个线程中使用一个HTable对象,不同线程间不要共享HTable对象. 同时,为了提高客户端的效率,不同的HTable对象公用同一个Configuration对象,共享HBase服务端的元数据信息,详见HBase权威指南中有关HTable部分的介绍. 2. HTablePool该如何使用? HBase 0.90 版