测试准备

【首先同步时间:】

for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node "date -s '2017-12-30 21:32:30'";done

【slave各节点启动zookeeper集群:】

cd /software/zookeeper-3.4.10/bin/ && ./zkServer.sh start && cd - && jps

【master01启动HDFS集群:】

cd /software/ && start-dfs.sh && jps

【master01启动HBase:】

cd /software/hbase-1.2.6/bin && start-hbase.sh && jps

【master02上启动HBase:】

cd /software/hbase-1.2.6/bin && hbase-daemon.sh start master && jps

如有节点启动出现故障:
单独启动master:
cd /software/hbase-1.2.6/bin && hbase-daemon.sh start master && jps
单独启动regionserver:
cd /software/hbase-1.2.6/bin && hbase-daemon.sh start regionserver && jps
通过命令终端查看:
hbase(main):009:0> status
通过web终端查看:
http://master01的IP地址:16010/

【在主机CloudDeskTop导入java客户端开发所需jar包:】HBase1.2.6-All.zip

测试目标:

运用java代码编写程序操作HBase数据库,本次测试致力于对DML语法的java客户端操作;

测试代码大数据学习交流QQ群:217770236

 package com.mmzs.bigdata.hbase.dml;

 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.filter.RowFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.filter.SubstringComparator; /**
* @author hadoop
*
* [HTable].put|delete|get|getScanner([Scan].addColumn|setStartRow|setStopRow|setFilter([FilterList].addFilter))
*
*/
public class DMLMain {
/**
* 操作HBase集群的客户端
*/
private static Admin admin; private static Connection conn; static{
//创建HBase配置
Configuration conf=HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "slave01:2181,slave02:2181,slave03:2181");
try {
//根据HBase配置获取HBase集群连接
conn=ConnectionFactory.createConnection(conf);
admin=conn.getAdmin();
} catch (IOException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//这种添加方式的读数据在后面查找时容易出IO异常,因为中间涉及了二进制转换
// put("mmzs:myuser","008","base","userName","ligang00");
// put("mmzs:myuser","008","base","userAge","18");
// put("mmzs:myuser","008","base","gender","woman"); /* Date d=new Date();
System.out.println(d);
byte[] b=getBytes(d);
System.out.println(b);
Object obj=getObject(b);
System.out.println(obj);*/ //添加数据
/* Map<String,Map<String,Map<String,Object>>> dataMap=new HashMap<String,Map<String,Map<String,Object>>>(); Map<String,Map<String,Object>> familyMap=new HashMap<String,Map<String,Object>>();
// dataMap.put("ligang+28+1.67", familyMap);
// dataMap.put("zhanghua+28+1.67", familyMap);
// dataMap.put("zhanghua+29+1.67", familyMap);
// dataMap.put("ligang+28+1.72", familyMap);
// dataMap.put("wangwu+29+1.82", familyMap);
dataMap.put("001", familyMap);
dataMap.put("002", familyMap);
dataMap.put("003", familyMap);
dataMap.put("004", familyMap);
dataMap.put("005", familyMap);
dataMap.put("006", familyMap); Map<String,Object> keyValMap=new HashMap<String,Object>();
keyValMap.put("height", 1.68);
keyValMap.put("weight", 75.5);
keyValMap.put("gender", "women");
keyValMap.put("username", "zhangsan"); familyMap.put("extra", keyValMap); puts("mmzs:myuser",dataMap);*/ // delete("mmzs:myuser","005");
// delete("mmzs:myuser","002","extra","username");
// deletes("mmzs:myuser","001","002","003","004","005","006","007","008"); // get("mmzs:myuser","005"); // scan("mmzs:myuser"); // scanByCondition("mmzs:myuser");
} /**
* 将二进制流读到内存通过反序列化重构生成对象
* @param object
* @return
*/
private static Object getObject(byte[] b){
ObjectInputStream ois=null;
try {
ByteArrayInputStream bais=new ByteArrayInputStream(b);
ois=new ObjectInputStream(bais);
return ois.readObject();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try{
if(null!=ois)ois.close();
}catch(IOException e){
e.printStackTrace();
}
}
return null;
} /**
* 将对象序列化成二进制数组
* @param object
* @return
*/
private static byte[] getBytes(Object object){
ObjectOutputStream oos=null;
try {
ByteArrayOutputStream baos=new ByteArrayOutputStream();
oos=new ObjectOutputStream(baos);
oos.writeObject(object);
oos.flush();
return baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}finally{
try{
if(null!=oos)oos.close();
}catch(IOException e){
e.printStackTrace();
}
}
return null;
} /**
* 打印结果集
* @param ress
*/
private static void printResult(ResultScanner rss){
//遍历结果集,每一个Result对应一行记录(即对应一个RowKey)
for(Result res:rss){
String rowKey=new String(res.getRow());
List<Cell> cellList=res.listCells();
for(Cell cell:cellList){
//获取当前键值对所在的列族名称
String familyName=new String(CellUtil.cloneFamily(cell));
//获取当前键值对的键(Key)
String key=new String(CellUtil.cloneQualifier(cell));
//获取当前键值对的值(Value)
String value=getObject(CellUtil.cloneValue(cell)).toString(); System.out.println(rowKey+"\t"+familyName+"\t"+key+":"+value);
}
}
} /**
* 条件查询
* @param tabNameStr
*
* PrefixFilter和RowFilter都是基于行键(RowKey)的过滤器
*/
public static void scanByCondition(String tabNameStr){
TableName tabName=TableName.valueOf(tabNameStr);
Scan scan=new Scan(); //前缀过滤器,行键前缀是ligang的
PrefixFilter prefixFilter=new PrefixFilter("ligang".getBytes()); //子串过滤,行键中包含1.72的
RowFilter rowFilter=new RowFilter(CompareOp.EQUAL,new SubstringComparator("28")); //行键过滤器,列族 列名 比较操作 值,显示不包含满足条件的
SingleColumnValueFilter scvFilter=new SingleColumnValueFilter("base".getBytes(),"userName".getBytes(),CompareOp.EQUAL,new SubstringComparator("ligang")); //FilterList.Operator.MUST_PASS_ALL相当于and,FilterList.Operator.MUST_PASS_ONE相当于or
FilterList filterList=new FilterList(FilterList.Operator.MUST_PASS_ALL);
//添加使用的过滤器
// filterList.addFilter(prefixFilter);
// filterList.addFilter(rowFilter);
filterList.addFilter(scvFilter); // scan.setFilter(prefixFilter); scan.setFilter(filterList);//设置过滤
try {
Table table=conn.getTable(tabName);
ResultScanner ress=table.getScanner(scan);
printResult(ress);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 查询多条记录
* @param tabNameStr
* @param rowKey
*/
public static void scan(String tabNameStr){
TableName tabName=TableName.valueOf(tabNameStr); Scan scan=new Scan(); //过滤查询结果集中的字段
scan.addColumn("extra".getBytes(), "height".getBytes());
scan.addColumn("extra".getBytes(), "weight".getBytes()); //设置查询的起始和结束行索引(通过行键RowKey指定)
scan.setStartRow("002".getBytes());
scan.setStopRow("006".getBytes()); try {
Table table=conn.getTable(tabName);
//查询多行返回一个结果集
ResultScanner rss=table.getScanner(scan);
//遍历结果集,每一个Result对应一行记录(即对应一个RowKey)
printResult(rss);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 查询单条记录
* @param rowKey
* @param tabNameStr
*/
public static void get(String tabNameStr,String rowKey){
TableName tabName=TableName.valueOf(tabNameStr); Get get=new Get(rowKey.getBytes());
//相当于select..字段列表...from...,如果没有下面的addColumn方法调用则相当于select *...
get.addColumn("base".getBytes(), "height".getBytes());
get.addColumn("base".getBytes(), "gender".getBytes());
try {
Table table=conn.getTable(tabName);
Result result=table.get(get); //获取行键
String rowKeyStr=new String(result.getRow());
System.out.println("行键:"+rowKeyStr); //获取键所对应的值
byte[] byteName=result.getValue("base".getBytes(), "gender".getBytes());
String gender=getObject(byteName).toString();
System.out.println("gender:"+gender); //获取当前行中的所有键值对
List<Cell> cellList=result.listCells();
for(Cell cell:cellList){
//获取当前键值对所在的列族名称
String familyName=new String(CellUtil.cloneFamily(cell));
//获取当前键值对的键(Key)
String key=new String(CellUtil.cloneQualifier(cell));
//获取当前键值对的值(Value)
byte[] byteValue=CellUtil.cloneValue(cell);
String value=getObject(byteValue).toString(); System.out.println(rowKey+"\t"+familyName+"\t"+key+":"+value);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 批量删除多行
* @param tabNameStr
* @param rowKey
*/
public static void deletes(String tabNameStr,String... rowKeys){
if(rowKeys.length==0)return;
TableName tabName=TableName.valueOf(tabNameStr); List<Delete> deleteList=new ArrayList<Delete>();
for(String rowKey:rowKeys)deleteList.add(new Delete(rowKey.getBytes())); try {
Table table=conn.getTable(tabName);
table.delete(deleteList);
System.out.println("删除完成!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 删除行中的键值对
* @param tabNameStr
* @param rowKey
* @param key
*/
public static void delete(String tabNameStr,String rowKey,String family,String key){
TableName tabName=TableName.valueOf(tabNameStr);
try {
Table table=conn.getTable(tabName);
Delete delete=new Delete(rowKey.getBytes());
delete.addColumn(family.getBytes(), key.getBytes());
table.delete(delete);
System.out.println("删除完成!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 删除整行
* @param tabNameStr
* @param rowKey
*/
public static void delete(String tabNameStr,String rowKey){
TableName tabName=TableName.valueOf(tabNameStr);
try {
Table table=conn.getTable(tabName);
Delete delete=new Delete(rowKey.getBytes());
table.delete(delete);
System.out.println("删除完成!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 增加或修改数据(表名、行键、列族、列、值)
*/
public static void put(String tabNameStr,String rowKey,String family,String key,String value){
TableName tabName=TableName.valueOf(tabNameStr);
try {
Table table=conn.getTable(tabName);
Put put=new Put(rowKey.getBytes());
put.addColumn(family.getBytes(), key.getBytes(), value.getBytes());
table.put(put);
System.out.println("操作完成!");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 批量插入或修改数据
* @param tabNameStr
* @param dataMap
*/
public static void puts(String tabNameStr,Map<String,Map<String,Map<String,Object>>> dataMap){
List<Put> putList=new ArrayList<Put>();
Set<Entry<String, Map<String, Map<String, Object>>>> entrys=dataMap.entrySet();
for(Entry<String, Map<String, Map<String, Object>>> entry:entrys){
//获取行的rowKey
byte[] rowKey=entry.getKey().getBytes();
Put put=new Put(rowKey);
putList.add(put);
//获取行的所有列族
Map<String, Map<String, Object>> familyMap=entry.getValue();
Set<Entry<String, Map<String, Object>>> familyEntrys=familyMap.entrySet();
for(Entry<String, Map<String, Object>> familyEntry:familyEntrys){
//获取列族名称
byte[] familyName=familyEntry.getKey().getBytes();
//获取列族下左右的键值对
Map<String, Object> keyVals=familyEntry.getValue();
Set<Entry<String, Object>> keyValEntrys=keyVals.entrySet();
for(Entry<String, Object> keyValEntry:keyValEntrys){
byte[] key=keyValEntry.getKey().getBytes();
byte[] value=getBytes(keyValEntry.getValue());
put.addColumn(familyName, key, value);
}
}
} TableName tabName=TableName.valueOf(tabNameStr);
try {
Table table=conn.getTable(tabName);
table.put(putList);
System.out.println("操作完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}

DMLMain

测试结果:

在命令端查看,查看方式,可参考:http://www.cnblogs.com/mmzs/p/8135327.html

测试小结:

  HBase是分布式的、可扩展的、且基于Hadop的大数据NOSQL存储数据库(号称十亿行、百万列),该数据库的每一行也是保存一条记录,但是与关系数据库不同的是,该数据库无需事先定义字段和表结构,只需要指定表名和列族;每一行由指定的一到多个族组成,每个族上可以保存若干个键值对(每一行的每个族上的键值对数量可以是任意的),即每一行的单元格数量不一定相等,每一个单元格中保存同一个键名但不同版本值的若干个键值对(即同一个字段名中有不同版本的字段值),当需要查询某一个字段值时需要指定的坐标是:
  表名(table name)—>行健(row key)—>列族(column family)—>字段名(column name)—>版本号(version code)

HBase的java客户端测试(二)---DML操作的更多相关文章

  1. HBase的java客户端测试(一)---DDL操作

    测试准备 [首先同步时间:] for node in CloudDeskTop master01 master02 slave01 slave02 slave03;do ssh $node " ...

  2. docker安装fastdfs与java客户端测试

    一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...

  3. Hbase配置java客户端

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

  4. 使用Java客户端对Redis进行操作

    一.背景 上篇文章我们介绍了如何在centos7下面进行安装单机版redis以及redis集群.这篇文章,我们来聊一聊如何使用java客户端来进行操作redis.我们知道redis的java客户端有很 ...

  5. Kubernetes官方java客户端之七:patch操作

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. RABBITMQ/JAVA 客户端测试(再补:利用文件流)

    (一)这里可以先复习一下java输入输出流和文件操作--- 1.File类保存文件或目录的各种元数据信息,包括文件名.文件长度.最后修改时间.是否可读.获取当前文件的路径名.判断指定文件是否存在.获取 ...

  7. Kubernetes官方java客户端之二:序列化和反序列化问题

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. RabbitMQ/JAVA 客户端测试(补:利用线程)

    上次进行了简单的连接测试.这次主要进行一下小小的补充.利用线程将生产者消费者代码合到一个文件中. 我是将Recv.java(消费者)文件放在一个线程里添加到Send.java(生产者)中. 代码如下: ...

  9. Kubernetes官方java客户端之三:外部应用

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

随机推荐

  1. 浅析列表页请求优化(history API)

    最近搞了下列表页请求的功能,并做了一下调研整理,记此文备忘. 列表页请求的功能到处可见,比如在博客园. 点击相应的页码,页面返回相应的内容,看上去似乎大同小异,但是一些小的细节还是可以区分优劣. fu ...

  2. 初识Java Servlet

    Java Servlet是什么? Servlet的本质就是一个Java接口,之所以能生成动态的Web内容,是因为对客户的一个HTTP请求,Servlet通过接口这个规范重写了其中的方法,然后Web服务 ...

  3. 玩玩微信公众号Java版之七:自定义微信分享

    前面已经学会了微信网页授权,现在微信网页的功能也可以开展起来啦! 首先,我们先来学习一下分享,如何在自己的页面获取分享接口及让小伙伴来分享呢? 今天的主人公: 微信 JS-SDK, 对应官方链接为:微 ...

  4. 转:酷我音乐API

    酷我音乐API 本次分析的是酷我音乐API 歌曲搜索API:http://search.kuwo.cn/r.s?all={0}&ft=music&itemset=web_2013&am ...

  5. CSS中清除浮动的作用以及如何清除浮动

    1.什么是浮动,浮动的作用 “浮动”从字面上来理解就是“悬浮移动.非固定”的意思.块级元素(div.table.span…)是以垂直方向排列,而在前端界面中往往要使用水平布局块级元素使界面更美观.这就 ...

  6. 9-Unittest+HTMLTestRunner不能生成报告解决方法

    1.问题现象 在使用HTMLTestRunner生成测试报告时,出现程序运行不报错,但不能生成报告的情况. 刚开始找了很久没发现问题,后来加上打印信息,发现根本没执行生成报告这部分代码.最后网上找到原 ...

  7. JS中创建多个相同的变量出现的问题

    在做轮播图的时候出现了一个问题:如果定义两个完全相同的变量会发生什么: 1.两个全局变量: var num = 10; var num =100; 这种情况下很明显输出num的话会是100,但是内存中 ...

  8. python之常用模块4

    pyinotify模块 pip3 install pyinotify pyinotify提供的事件: 事件标志 事件含义 IN_ACCESS 被监控项目或者被监控目录中的文件被访问,比如一个文件被读取 ...

  9. 04、SQL 查询当天,本月,本周的记录

    SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GETDATE(), 111)   ORDE ...

  10. JAVA编程思想的理解

    1)POP--面向过程编程(Process-oriented programming ):   面向过程编程是以功能为中心来进行思考和组织的一种编程方法,它强调的是系统的数据被加工和处理的过程,在程序 ...