文档章节

HBase 二次开发 java api和demo

brian_2017
 brian_2017
发布于 2017/01/17 09:43
字数 840
阅读 12
收藏 0
1. 试用thrift python/java以及hbase client api,结论如下:
    1.1 thrift的安装和发布繁琐,可能会遇到未知的错误,且hbase.thrift的版本在变化中。优点代码简单,需要打包的内容少。
    1.2 hbase client api,需要的jar很多,发布版的容量也很大,打包后近百兆。优点是,明确,无歧义。

2. 推荐用hbase client api的方式搞定。

3. 以下均为技术细节。

4. 有一台机器/一个集群,在运行hadoop,也运行了基于这个hadoop集群的hbase集群,同时,也运行了一个zookeeper集群,我们统称它是A。

5. 有一台集群负责开发,我们在上面写代码,编译代码,运行代码,我们称它是B。

6. 在B上,要修改/etc/hosts,把A的任意一台zookeeper服务器的hostname和对应的ip地址放进去,因为hbase client需要连接到zookeeper,以便获得hbase的hmast信息---hbase集群有多个hmast,一个是主hmast,其他是备用hmaster,如果主hmaster挂了,备用的会顶上,避免单点故障问题。

7. 在B上开发,在elipse建立一个java项目,添加一个lib目录,把A上的hadoop, hbase, zookeeper的所有jar包,注意,是所有jar包,各级子目录的也算在内,都复制到lib目录,大概有130个左右,90M。然后,再把它们添加到buildpath。这么做的好处是,不用一点点找究竟哪个类在哪个包,生命短暂,不要把时间浪费在这里,浪费点磁盘空间没关系。
    如果hadoop,hbase, zookeeper都安装在一个目录下,可以用一个shell语句搞定:
    for i in `find . -name "*.jar"`;      do cp $i ~/alljars;    done;
    然后再把alljars下的jar包都复制到B的lib目录。

8. 写一个最简单的hbase demo,在hbase里检查一个表是否存在,如果不存在,就创建它。
-----------------------------------------
package hbasedemo;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.TableName;

public class Main {

public static void main(String[] args) throws IOException{
Configuration hbase_conf = new Configuration();
hbase_conf.set("hbase.zookeeper.quorum", "brianxxxooo"); // brianxxxooo是A里的zookeeper机器的hostname
hbase_conf.set("hbase.zookeeper.property.clientPort","2181");
Configuration conf = HBaseConfiguration.create(hbase_conf);

String tablename="scores";
String[] familys = {"grade", "course"};

HBaseAdmin admin = new HBaseAdmin(conf);
if (admin.tableExists(tablename)){
System.out.println("table exist, return!");
return;
}

HTableDescriptor td = new HTableDescriptor(TableName.valueOf(tablename));
for(int i = 0; i < familys.length; i++){
td.addFamily(new HColumnDescriptor(familys[i]));
}
admin.createTable(td);
System.out.println("create table "+tablename+" ok.");

}
-----------------------------------------

9. 注意事项,hbase client的版本变化甚多,具体api调用要根据版本来,有时候需要参考多个版本来。比如,0.96.x的HTableDescripter更接近 http://hbase.apache.org/apidocs/index.html  , 而不是0.94的api。但HBaseAdmin在0.94的api是有的,在2.0.0里没有。非常混乱。估计这个局面还要持续一段时间。

10. 更详细的例子
------------------------------------------
package hbasedemo;

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

public class Main {

public static void main(String[] args) throws IOException{
Configuration hbase_conf = new Configuration();
hbase_conf.set("hbase.zookeeper.quorum", "brianvxxxxooooo");
hbase_conf.set("hbase.zookeeper.property.clientPort","2181");
Configuration conf = HBaseConfiguration.create(hbase_conf);

String tablename="scores";
String[] familys = {"grade", "course"};

HBaseAdmin admin = new HBaseAdmin(conf);
if (admin.tableExists(tablename)){
System.out.println("table exist!");
}else{
HTableDescriptor td = new HTableDescriptor(TableName.valueOf(tablename));
for(int i = 0; i < familys.length; i++){
td.addFamily(new HColumnDescriptor(familys[i]));
}
admin.createTable(td);
System.out.println("create table "+tablename+" ok.");
}

HTable table = new HTable(conf, "scores");
Put put = new Put(Bytes.toBytes("row1"));

//create
put.add(Bytes.toBytes("grade"), Bytes.toBytes("g1"), Bytes.toBytes(781));
put.add(Bytes.toBytes("grade"), Bytes.toBytes("g2"), Bytes.toBytes("this is test"));
table.put(put);

//read
Get get = new Get(Bytes.toBytes("row1"));
get.addColumn(Bytes.toBytes("grade"), Bytes.toBytes("g1"));
Result result = table.get(get);
byte[] val = result.getValue(Bytes.toBytes("grade"), Bytes.toBytes("g1"));
System.out.println(Bytes.toInt(val));


}
------------------------------------------

其他各种操作于此相似,不再一一列出。

© 著作权归作者所有

brian_2017
粉丝 3
博文 61
码字总数 145216
作品 0
私信 提问
hbase无法启动

输入bin/start-hbase.sh后出现如下错误: /home/ted1orelee0308/hbase-1.2.6/bin/hbase: line 412: /usr/lib/jvm/java1.8.0_121/bin/java: No such file or directory /home/ted1orelee0308/......

hbbb
2017/09/27
168
1
hadoop hive hbase 入门学习 (二)

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// hadoop 自学系列 hado......

curiousby
2015/03/08
0
0
2018-08-12期 Hbase本地模式安装部署

说明: Hbase部署模式有以下三种 (1)本地模式:本地模式不依赖于HDFS存储,将文件存储到操作系统本地目录,好处是我们不需要搭建HDFS集群,即可学些HBase相关命令及客户端操作。 (2)伪分...

JackmaSong
2018/08/12
0
0
HBase实践 | HBase ThriftServer Kerberos认证

1.前置 用户可以通过ThriftServer来访问HBase服务,它的特点如下: ThriftServer代理用户访问HBase服务返回操作结果,用户客户端不需要直接跟HBase进行通信 用户可以使用java/python/php/c++...

封神
2018/11/27
0
0
HBase实操 | 如何使用Java连接Kerberos的HBase

一.文档编写目的 出于CDH集群安全考虑,在CDH集群中增加了Kerberos认证机制。因为HBase的存储系统是基于Hadoop的存储,所以通过HBase客户端访问HBase数据库时需要进行身份认证。在Linux下使用...

封神
2018/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
39分钟前
48
0
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
9
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部