实战 :对HBase业务表进行增删改查操作(Eclipse,Linux 环境)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22830285/article/details/84570538

尝试使用HBASE shell 和HBase java API 两种方式来演示对业务表的操作。
一、Hbase Shell
1、启动控制台,启用hbaseshell 控制台对Hbase 进行操作具体命令如下:

[hadoop@nna hbase]$ bin/hbase shell

2、创建业务临时表: zh_table

hbase(main):005:0> create 'zh_table','name'
0 row(s) in 1.4820 seconds

=> Hbase::Table - zh_table

2、添加数据

hbase(main):001:0> put 'zh_table','rowkey1','name','v1'

3、查询数据
3.1用scan 扫描全表

hbase(main):002:0> scan 'zh_table'
ROW                                                          COLUMN+CELL
 rowkey1                                                     column=name:, timestamp=1543310894919, value=v1
1 row(s) in 0.0340 seconds

3.2 用get 根据rowkey 进行查询

hbase(main):001:0> get 'zh_table','rowkey1'
COLUMN                                                       CELL
 name:                                                       timestamp=1543310894919, value=v1
1 row(s) in 0.2600 seconds

4、删除业务表
4.1 先禁止Hbase 业务表

hbase(main):002:0> disable 'zh_table'
0 row(s) in 2.7030 seconds

4.2 在执行删除操作

hbase(main):001:0> drop 'zh_table'
0 row(s) in 1.6430 seconds

二、HBase java api 应用接口

代码:

package hadoop;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
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.HBaseAdmin;
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.util.Bytes;

public class HbaseUtil {
	private static Configuration conf;
	private static HBaseAdmin admin;
	//初始化配置信息
	static {
		conf=HBaseConfiguration.create();
		//设置zookeeper的地址
		conf.set("hbase.zookeeper.quorum","dn1,dn2,dn3");
	}
	//创建表
	public static void create(String tableName,String [] columns) throws IOException  {

		
		 //建立连接
        Connection connection=ConnectionFactory.createConnection(conf);
        //表管理类
        Admin admin=connection.getAdmin();
        //定义表名
        HTableDescriptor tableDescriptor=new HTableDescriptor(TableName.valueOf(tableName));

		//列族名
		for(String col:columns) {
			HColumnDescriptor hColdesc=new HColumnDescriptor(col);
			//将列加入表中,
			tableDescriptor.addFamily(hColdesc);
		}
        admin.createTable(tableDescriptor);
        admin.close();
        connection.close();
        System.out.println("创建表成功!");
	}

	//插入
	public static void insert(String tableName,ArrayList<Put> alists) throws IOException{
		//通过连接工厂创建连接对象
        Connection conn = ConnectionFactory.createConnection(conf);
        //通过连接查询tableName对象
        TableName tname = TableName.valueOf(tableName);
        //获得table
        Table table = conn.getTable(tname);
        //执行插入
        table.put(alists);
        table.close();
        conn.close();
        System.out.println("插入成功!");
	}  
	
/*	根据key 取值
	clonum 可为空,若为null ,则只根据列族名查询
	*/
    public static void get(String tableName,String rowkey,String clonumFamily,String clonum ) throws Exception {
    	  //建立连接
        Connection connection=ConnectionFactory.createConnection(conf);
        //建立表连接
        Table table=connection.getTable(TableName.valueOf(tableName));
        //用行键实例化Get
        Get get=new Get(rowkey.getBytes());
        if(null==clonum) {
        	//只列族名查询
            get.addFamily(clonumFamily.getBytes());
        }else {
        	//增加列族名和列名条件
            get.addColumn(clonumFamily.getBytes(), clonum.getBytes());
        }
        //执行Get返回结果
        Result result=table.get(get);
        //取出结果
        //如果只有rowkey 查询,那应该是一个结果集
        if(null==clonum) {
        	Map<byte[], byte[]> map=result.getFamilyMap(clonumFamily.getBytes());
        	System.out.println("多结果集-"+clonumFamily+"遍历map"+"\n");
        	for(Map.Entry<byte[], byte[]> entry:map.entrySet()) {
        		String clonumName=new String(entry.getKey());
        		String value=new String(entry.getValue());
        		System.out.println(clonumName+"-----"+value+"\n");
        	}
        	
        }else {
        	String valueStr=Bytes.toString(result.getValue(clonumFamily.getBytes(), clonum.getBytes()));
        	System.out.println(clonumFamily+"---"+clonum+"--"+valueStr);
        }
        //关闭表
        table.close();
        //关闭连接
        connection.close();
        System.out.println("查询结束--------!");
    }
   //删除单元 
    public static void deleteCol(String tableName,String rowkey,String colnumFamily,String clonum) throws IOException {
    	  //建立连接
        Connection connection=ConnectionFactory.createConnection(conf);
        //建立表连接
        Table table=connection.getTable(TableName.valueOf(tableName));
        //用行键来实例化Delete实例
        Delete delete=new Delete(rowkey.getBytes());
        //增加删除条件
        if(colnumFamily!=null&&clonum!=null)
        delete.addColumn(colnumFamily.getBytes(), clonum.getBytes());
        //执行删除
        table.delete(delete);
        //关闭表
        table.close();
        //关闭连接
        connection.close();
        System.out.println("删除成功!");
    }
    //删除表
    public  static void deleteTable(String tableName) throws IOException {
  	     //建立连接
        Connection connection=ConnectionFactory.createConnection(conf);
        //表管理类
        Admin admin=connection.getAdmin();
        //首先禁用表
        admin.disableTable(TableName.valueOf(tableName));
        //最后删除表
        admin.deleteTable(TableName.valueOf(tableName));
        //关闭表管理
        admin.close();
        //关闭连接
        connection.close();
        System.out.println("执行成功");
    }
    //扫描全表数据
    public static void scanAll(String tableName) throws IOException {
    	  //建立连接
        Connection connection=ConnectionFactory.createConnection(conf);
        //建立表连接
        Table table=connection.getTable(TableName.valueOf(tableName));
        //初始化Scan实例
        Scan scan=new Scan();
       //返回结果
        ResultScanner rs=table.getScanner(scan);
        for (Result r : rs) {// 按行去遍历
			for (KeyValue kv : r.raw()) {// 遍历每一行的各列
				StringBuffer sb = new StringBuffer()
						.append(Bytes.toString(kv.getRow())).append("\t")
						.append(Bytes.toString(kv.getFamily()))
						.append("\t")
						.append(Bytes.toString(kv.getQualifier()))
						.append("\t").append(Bytes.toString(kv.getValue()));
				System.out.println(sb.toString());
			}

		}

    }
    public static void main(String [] args) throws Exception {
        //创建表
    	System.out.println("-----------开始创建表 ---------------");
    	//表名
    	String tableName="java_Table";
    	String[] clofamily= {"function","parameter","return"};
    	create(tableName,clofamily);
    	System.out.println("-----------开始插入数据 ---------------");
    	 //用行键实例化Put
    	Put put=new Put("num1".getBytes());
    	 //指定列族名、列名和值
        put.addColumn("function".getBytes(), "get".getBytes(), "getApi".getBytes());
        put.addColumn("function".getBytes(), "put".getBytes(), "putApi".getBytes());
        put.addColumn("parameter".getBytes(), "intp".getBytes(), "intpv".getBytes());
        put.addColumn("parameter".getBytes(), "strp".getBytes(), "intpv".getBytes());
        put.addColumn("return".getBytes(), "intr".getBytes(), "intrv".getBytes());
        put.addColumn("return".getBytes(), "strr".getBytes(), "intrv".getBytes());
       ArrayList<Put> putlist=new ArrayList<Put>();
       putlist.add(put);
       insert(tableName,putlist);
       System.out.println("-----------开始查询数据 ----num1-----------");
       get(tableName,"num1","function",null);
       System.out.println("-----------开始删除数据 ----num1-----------");
       deleteCol(tableName,"num1","parameter","intp");
       System.out.println("-----------开始全表扫描 ---------------");
       scanAll(tableName);

    	
    }
}

执行结果:
在这里插入图片描述

三、报错问题
1、执行hbase java api 一直没响应,做创建表操作是可以的,但插入,查询操作报如下错误。

Call exception, tries=11, retries=35, started=89030 ms ago, cancelled=false, msg=row '001' on table 'java_apie' at region=java_apie,,1543369803131.74130bf36a579d79096cacc4d018f45a., hostname=dn3,16020,1543373681623, seqNum=17

在这里插入图片描述

看 hostname=dn3,这一句估计是hostname dn3 链接有问题,查看C:\Windows\System32\drivers\etc\hosts 文件,发现,dn2 和dn3 映射一样的ip 了,故将dn3的ip改正,改成192.168.80.134,重新执行。
在这里插入图片描述
遇到上述错误,百分之八十都是ip映射问题。

猜你喜欢

转载自blog.csdn.net/qq_22830285/article/details/84570538