简单的HBase Client端实现

前言

newbie刚接触HBase,遇到几个初学者常见的关于HBase问题,这里就问题就不多做介绍,主要还是编码优化问题,下面专门介绍以下几点,希望对于初学者有所帮助。

Tips

RowKey的设计

HBase的无论什么操作都是对rowkey进行扫描操作的,rowkey的排序是按照字典序来排的。

IO考虑

为读优化

设计行健时,尽量把行健按照序号紧挨一起,减少扫描。

为写优化

主要是考虑所有的rowkey不要写到同一个region上,这样会导致其他机器很空闲,只有这个region的吞吐量就是你应用的吞吐量

例如时间戳做行健就会出现这个问题。

解决方法主要是两个:

  1. 散列,建表时分表,然后写入时使用散列函数,将行健打散分布,这样做只是为了写操作多的优化,对于读来说,可能是灾难(全表扫描)
  2. salting,使用随机值做前缀,解决散列全表扫描的问题

Merge相同的rowKey

因为HBase对于每一个命令(put,delete,get,increment)都是起一个线程来做的,每个命令基本都有

addFamily(), addCloumns()方法可以使用

是否需要自己做HTable Connection缓存管理

这一点是不需要的,HBase本身有Cache机制的,主要在HConnectionManager里面做管理,它会做缓存。每次close时也会检查该cacheINstance是否还有reference,如果有就暂时不close,没有就close,reference-1。详细请看HConnectionManager源码;

public static HConnection getConnection(final Configuration conf)
  throws IOException {
    HConnectionKey connectionKey = new HConnectionKey(conf);
    synchronized (CONNECTION_INSTANCES) {
      HConnectionImplementation connection = CONNECTION_INSTANCES.get(connectionKey);
      if (connection == null) {
        connection = (HConnectionImplementation)createConnection(conf, true);
        CONNECTION_INSTANCES.put(connectionKey, connection);
      } else if (connection.isClosed()) {
        HConnectionManager.deleteConnection(connectionKey, true);
        connection = (HConnectionImplementation)createConnection(conf, true);
        CONNECTION_INSTANCES.put(connectionKey, connection);
      }
      connection.incCount();
      return connection;
    }
  }

Code

我自己实现了一个简单的Hbase Client,不是线程安全,在github上,可以clone下参考,仅供参考(为经测试,可能存在错误)

simple-hbase-client: git clone https://github.com/zhgwen/simple-hbase-client.git

时间: 2024-10-13 08:53:30

简单的HBase Client端实现的相关文章

Redis:安装、配置、操作和简单代码实例(C语言Client端)[转]

我转的地址: http://blog.csdn.net/hj19870806/article/details/8724907 听说游戏的用的比较多,所以了解下. --以下为转载内容 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMware主持. 如何安装Redis? Redis的官方下载站是http://redis.io/download,可以去上面下载最

socket server端和client端 简单备忘

python 版本 2.7 server 端 # -*- coding:utf-8 -*- import socket sk = socket.socket() sk.bind(('127.0.0.1',9999)) sk.listen(5) while True: print('server waiting...') conn,address = sk.accept() res = str(conn.recv(1024)) print(res) conn.sendall(bytes("hell

Hbase Client Test Case

好吧,其实就是一个简单的Hbase客户端java操作 HbaseTestCase.java package hbase; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apac

HBase Client API使用入门(二)---查询及过滤器

相关知识 创建表插入数据删除等见:http://www.cnblogs.com/wishyouhappy/p/3735077.html HBase API简介见:http://www.cnblogs.com/wishyouhappy/p/3753347.html 按行.列簇等查询 package wish.hbase; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org

Zookeeper全解析——Client端(转)

Zookeeper的Client直接与用户打交道,是我们使用Zookeeper的interface.了解ZK Client的结构和工作原理有利于我们合理的使用ZK,并能在使用中更早的发现问题.本文将在研究源码的技术上讲述ZK Client的工作原理及内部工作机制. 在看完ZK Client的大致架构以后我希望能有一种简单的方式描述ZK Client的基本结构,想来想去我觉得还是图片比较能反映情况,于是我画了这张大致的结构图: 我想既然我画了这张图,就让我们从这张图开始讲起吧. 模块: 我们可以认

elasticsearch源码分析之search模块(client端)

elasticsearch源码分析之search模块(client端) 注意,我这里所说的都是通过rest api来做的搜索,所以对于接收到请求的节点,我姑且将之称之为client端,其主要的功能我们可以简单地概括为将的数据请求发送到node,然后在对返回的结果做处理并返回给调用方,话虽如此,但是过程并非那么简单. 请求初始化 1.api的注册,上一篇已经提到了,所以的api都是通过Guice框架注册进来的,在注册的时候会在controller上将不同的url绑定到不同的handler中: co

经验分享(3)hbase client 如何选择

java中访问hbase有两种方式,一种是hbase自带的client,一种是通过hbase thrift 1 hbase client示例 Configuration conf = HBaseConfiguration.create(); conf.set(HConstants.ZOOKEEPER_CLIENT_PORT, "2181"); conf.set(HConstants.ZOOKEEPER_QUORUM, "zk_host"); Connection c

MTOM文件的续传功能(三) Client 端程序介绍

使用WSE 3.0 MTOM的技术,让Web Service也可以传文件,而且传输更有效率,这篇将带到Client端的部分说明. 上一篇写了MTOM Server端的部分,这次要写的就是Client端的程序要怎么跟Server交互,也就是最后一篇,废话不多说,马上进入正题,Client端的程序跟Server端一样,要用WSE的Configuration Tool来设定,而Web Service是存在Web.Config,那Client端的WinForm就是存在app.config ?xml ve

Java 向Hbase表插入数据报(org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac

org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apac 代码: //1.create HTablePool HTablePool hp=new HTablePool(con, 1000); //2.get HTable from HTablepool HTable ht=(HTable)hp.getTable(tName); 原因:如今应用的api版本中pool.getTable返回的类型