我们最近在一个项目中使用Hbase做日志数据的存储,在其之上做一些数据分析工作,相对java来说,团队成员对Go的使用更熟练,所以自然使用Go作为Client的开发语言, 以前从来没有跟Hbase打过交道,本来一个比较简单的任务,愣是磕磕绊绊做了好久。。。

本文只说说Hbase的Row构造时的注意事项

1 Hbase 的Go客户端语言使用方法

Hbase官方没有Go的客户端,但是它提供了thrift服务,我们可以用Go语言开发一个thrift 的client,通过向hbase的thrift server发送RPC请求,从而对Hbase做操作。 一个简单的请求流程如下:

Go Client –—> Hbase Thrift server –—> Hbase

其中的 Hbase Thrift Server是Hbase官方提供的,同时他们也提供Thrift服务描述文件,至于如何用Thrift服务描述文件声称Go Client的代码,github.com上有很多工具, thrift官方也有工具。

2 Hbase的Row使用注意事项

 

2.1 Row的前几个字段尽量散列

Hbase是一个集群服务,它会根据Row将数据分散到各后端存储机器上,如果您的Raw key有明显的聚集性,该Row对应的数据也会被集中在某几台后端机器上,这样在数据量特别大的 时候,读写的压力都集中在这几台机器上,会影响您的使用性能,所以第一个建议就是: 对raw key做散列,使有明显聚集性的raw key均匀(或近似均匀)地被分派到不同的后端存储机器上 最常用的使md5sum

2.2 Row的排序是把所有Row中的字符做字典排序

这一点很重要,下午掉进这个坑里半天才爬出来。为了说明这个问题,把我们的应用场景简化以下举例说明 我们的应用场景是:写Hbase是插入一堆带时间戳的data,读Hbase是读取data在时间段start和end之间的所有数据 我们的Row有两个关键字:一个字符串data和一个时间戳timestamp,基于这两个关键字我们构造Row的方法是: substring(md5sum(data), 0, 8) + data + timestamp Row中的前部分好说,都是字符串,关键是这个timestamp怎么构造?最初我是用下面的方法:

buf := make([]byte, 24 + len(data)
ip := []byte(pack.data) tmp := md5.Sum(data)
copy(buf[0:8], tmp[0:8])
copy(buf[8:8 + len(data)], data)
binary.PutVarint(buf[8+len(data):], timestamp)

  在这样写入到Hbase中之后(例如我写入了 data=aabbcc, timestamp=123456的数据 ),读取数据时有时候在start=0, end=234567时能读到数据,在start=1, end=234567时 却读不到数据,百思不得其解。后来发现原来是写入timestamp时的错误,请看下面的例子:

buf := make([]byte, 8)

binary.PutVarint(buf, int64(1423484126))
fmt.Println(buf) binary.PutVarint(buf, int64(2))
fmt.Println(buf)

  它的输出是:

[188 147 197 205 10 0 0 0]
[4 147 197 205 10 0 0 0]

  这样虽然timestamp 1423484126比2大,但是构造Row后,如果data相同,那么2的字典序竟然排在1423484126比的后面。这样就会产生上面提到的奇怪的现象。 所幸,Go没有辜负我们,它提供了一个方便的方法,能完成我们想要做的事情,请看下面的例子:

buf := make([]byte, 8)

binary.BigEndian.PutUint64(buf, uint64(1423484126))
fmt.Println(buf) binary.BigEndian.PutUint64(buf, uint64(2))
fmt.Println(buf)

  它的输出是:

[0 0 0 0 84 216 164 222]
[0 0 0 0 0 0 0 2]

  OK,问题解决。 以后接触陌生的知识,还是要先弄清楚基本原理,虽然这样投入的时间会多一些,但是从整体的收益来看,却是一种较好的方法。

Author: Cobbliu

Created: 2015-02-10 Tue 01:03

Emacs 24.4.1 (Org mode 8.2.10)

HBase Go客户端Row构造注意事项的更多相关文章

  1. HBase 学习之一 <<HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行>>

    HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行                       ----首先感谢网络能够给我提供一个开放的学习平台,如果没有网上的技术爱好者提供 ...

  2. 关于cdh 5.X 的agent 客户端镜像安装注意事项

    当把客户端镜像安装时,每个客户端程序会生成UUID作为唯一标识,重新 安装时要删除 rm -rf /var/lib/cloudera-scm-agent 如果不删除会造成主机列表中IP一直在变的情况.

  3. nmbd - 向客户端提供构造在IP之上的NetBIOS名字服务的NetBIOS名字服务器

    总览 SYNOPSIS nmbd [-D] [-F] [-S] [-a] [-i] [-o] [-h] [-V][-d <debug level>] [-H <lmhosts fil ...

  4. HBase之Table.put客户端流程

    首先,让我们从HTable.put方法开始.由于这一节有很多方法只是简单的参数传递,我就简单略过,但是,关键的方法我还是会截图讲解,所以希望大家尽可能对照源码进行流程分析.另外,在这一节,我单单介绍p ...

  5. Hbase配置java客户端

    1.修改windows配置文件 C:\WINDOWS\system32\drivers\etc\hosts 将远程hbase和zookeeper主机的IP地址加进去 54.0.88.53      H ...

  6. Hbase记录-HBase客户端API

    本章介绍用于对HBase表上执行CRUD操作的HBase Java客户端API. HBase是用Java编写的,并具有Java原生API.因此,它提供了编程访问数据操纵语言(DML). HBaseCo ...

  7. HBase 协处理器编程详解,第二部分:客户端代码编写

    实现 Client 端代码 HBase 提供了客户端 Java 包 org.apache.hadoop.hbase.client.coprocessor.它提供以下三种方法来调用协处理器提供的服务: ...

  8. 九、 HBase SHELL、 JAVA 和 Thrift 客户端

    HBase 由 Java 语言实现,同时他也是最主要最高效的客户端. 相关的类在org.apache.hadoop.hbase.client 包中.涵盖所有 增删改查 API . 主要的类包含: HT ...

  9. Hbase入门(五)——客户端(Java,Shell,Thrift,Rest,MR,WebUI)

    Hbase的客户端有原生java客户端,Hbase Shell,Thrift,Rest,Mapreduce,WebUI等等. 下面是这几种客户端的常见用法. 一.原生Java客户端 原生java客户端 ...

随机推荐

  1. 读书笔记,《Java 8实战》,第四章,引入流

       集合是Java中使用最多的API,但集合操作却远远算不上完美.主要表现在两点,    第一,集合不能让我们像数据库的SQL语言一样用申明式的语言指定操作:    第二,现在的集合API无法让我们 ...

  2. JavaScript-undefined与null区别

    JavaScript中的null在其他编程语言中也很常见,但是JavaScript在设计的过程中null自动转换为0,为了更好表示空,这个时候undefined出现了,null通过typeof结果是“ ...

  3. Binary Tree Level Order Traversal II leetcode java

    题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...

  4. C#利用tabControl控件实现多窗体嵌入及关闭

    创建一个主窗体(Formmain).两个副窗体(Form1,Form2);在主窗体中分别添加一个menuStrip控件.tabControl控件,并在menu控件上添加一个主菜单和两个子菜单   继而 ...

  5. 浅谈APP流式分页服务端设计(转)

    http://www.jianshu.com/p/13941129c826 a.cursor游标式分页 select * from table where id >cursor limit pa ...

  6. Hadoop:开发机运行spark程序,抛出异常:ERROR Shell: Failed to locate the winutils binary in the hadoop binary path

    问题: windows开发机运行spark程序,抛出异常:ERROR Shell: Failed to locate the winutils binary in the hadoop binary ...

  7. Git直接拉取远程分支

    用Git,一直有个疑惑,可不可以不拉取远程Origin主干,我直接pull一个分支下来 今天想了一下,找到了一个办法 本地分支关联 // 0.新建一个文件夹,然后初始化git git init // ...

  8. ZooKeeper启动报错 JAVA_HOME is incorrectly set

    解决办法:在zkEnv.cmd文件中直接写死调用的jdk路径 set JAVA_HOME="D:\Program Files\Java7\jdk1.7.0_51" if not e ...

  9. 国内A股16家上市银行的財务数据与股价的因子分析报告(1)(工具:R)

    分析人:BUPT_LX 研究目的 用某些算法对2014年12月份的16家国内A股上市的商业银行当中11项財务数据(资产总计.负债合计.股本.营业收入.流通股A.少数股东权益.净利润.经营活动的现金流量 ...

  10. 【Android开发VR实战】二.播放360&#176;全景视频

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53924006 本文出自[DylanAndroid的博客] [Android开发 ...