Ambari2.7.3-HBase2.0.2 DDL-DML Java操作

文章目录

1.DDL

package cn.hadooplearning;


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.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.regionserver.BloomType;
import org.junit.Before;
import org.junit.Test;


/**
 * 1.构建连接(Ambari2.7.3集群)
 * 2.从连接中获取一个表DDL的操作工具admin
 * 3.admin.createTable(表描述对象)
 * 4.admin.disableTable(表名称)
 * 5.admin.deleteTable(表名称)
 * 6.admin.modifyTable(表名称,表描述对象)
 * 7.win10环境下运行该程序连接Ambari集群上,用户名在集群创建useradd tanggaomeng
 * 8.权限在Ranger中创建策略
 */
public class HBaseClientDDL {
    private Connection conn = null;

    @Before
    public void getConn() throws Exception {
        // 构建一个连接对象
        // 会自动加载hbase-site.xml配置
        Configuration entries = HBaseConfiguration.create();
        // zookeeper地址
        entries.set("hbase.zookeeper.quorum", "managerhd.bigdata,masterhd.bigdata,workerhd.bigdata");
        // zookeeper 的端口应该大家都知道
        entries.set("hbase.zookeeper.property.clientPort", "2181");
        // /hbase-unsecure 是你们zookeeper 的hbase存储信息的znode
        entries.set("zookeeper.znode.parent", "/hbase-unsecure");
        // 这里由于 ambari 的端口不一样所以和原生的端口不一样这个 要注意
        entries.set("hbase.master", "managerhd.bigdata:16000");
        // 设置客户端连接用户名 - 无效,使用的是win10终端tanggaomeng用户
        //entries.set("hbase.client.username", "hbase");
        //entries.set("hbase.client.password", "");

        conn = ConnectionFactory.createConnection(entries);
    }

    /**
     * DDL
     * 创建表
     */
    @Test
    public void testCreateTable() throws Exception {

        //从链接中构造一个DDL操作器
        Admin admin = conn.getAdmin();

        //创建一个表定义描述对象
        HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("user_info"));

        //创建列族定义描述对象
        HColumnDescriptor hColumnDescriptor_1 = new HColumnDescriptor("base_info");
        //设置该列族中存储数据的最大版本数,默认是1
        hColumnDescriptor_1.setMaxVersions(2);

        HColumnDescriptor hColumnDescriptor_2 = new HColumnDescriptor("extra_info");

        //将列族定义信息对象放入表定义对象中
        hTableDescriptor.addFamily(hColumnDescriptor_1);
        hTableDescriptor.addFamily(hColumnDescriptor_2);

        //使用ddl操作器对象:admin 来创建表
        admin.createTable(hTableDescriptor);

        System.out.println("创建HBase表完成!");
        //关闭连接
        admin.close();
        conn.close();

    }

    /**
     * DDL
     * 修改表
     * 添加列族
     */
    @Test
    public void testAlterTable() throws Exception {

        Admin admin = conn.getAdmin();

        // 取出旧表的定义信息
        HTableDescriptor tableDescriptor = admin.getTableDescriptor(TableName.valueOf("user_info"));

        // 新构造一个列族定义
        HColumnDescriptor hColumnDescriptor = new HColumnDescriptor("other_info");
        // 设置该列族的布隆过滤器类型
        hColumnDescriptor.setBloomFilterType(BloomType.ROWCOL);

        // 将列族定义添加到列表定义对象中
        tableDescriptor.addFamily(hColumnDescriptor);

        // 将修改过的表定义交给admin去提交
        admin.modifyTable(TableName.valueOf("user_info"), tableDescriptor);

        System.out.println("修改HBase表完成!");
        admin.close();
        conn.close();
    }

    /**
     * DDL
     * 删除表
     */
    @Test
    public void testDropTable() throws Exception {

        Admin admin = conn.getAdmin();

        // 停用表
        admin.disableTable(TableName.valueOf("user_info"));
        // 删除表
        admin.deleteTable(TableName.valueOf("user_info"));

        System.out.println("删除HBase表完成!");
        admin.close();
        conn.close();

    }


}


2.DML

package cn.hadooplearning;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellScanner;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Before;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Iterator;


public class HBaseClientDML {

    private Connection conn = null;

    @Before
    public void getConn() throws Exception {
        // 构建一个连接对象
        // 会自动加载hbase-site.xml配置
        Configuration entries = HBaseConfiguration.create();
        // zookeeper地址
        entries.set("hbase.zookeeper.quorum", "managerhd.bigdata,masterhd.bigdata,workerhd.bigdata");
        // zookeeper 的端口应该大家都知道
        entries.set("hbase.zookeeper.property.clientPort", "2181");
        // /hbase-unsecure 是你们zookeeper 的hbase存储信息的znode
        entries.set("zookeeper.znode.parent", "/hbase-unsecure");
        // 这里由于 ambari 的端口不一样所以和原生的端口不一样这个 要注意
        entries.set("hbase.master", "managerhd.bigdata:16000");
        // 设置客户端连接用户名 - 无效,使用的是tanggaomeng用户
        //entries.set("hbase.client.username", "hbase");
        //entries.set("hbase.client.password", "");

        conn = ConnectionFactory.createConnection(entries);
    }

    /**
     * DML
     * 增
     * put
     */
    @Test
    public void testPut() throws Exception {

        // 获取一个操作指定表的对象,进行DML操作
        Table table = conn.getTable(TableName.valueOf("user_info"));

        // 构造要插入的数据为一个Put类型(一个put对象只能对应一个rowkey)的对象
        Put put = new Put(Bytes.toBytes("001"));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("zhangsan"));
        put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes("18"));
        put.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("address"), Bytes.toBytes("Beijing"));

        Put put2 = new Put(Bytes.toBytes("002"));
        put2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("lisi"));
        put2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes("29"));
        put2.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("address"), Bytes.toBytes("Shanghai"));

        ArrayList<Put> puts = new ArrayList<>();

        puts.add(put);
        puts.add(put2);

        // 执行插入操作
        table.put(puts);

        System.out.println("插入HBase表完成!");
        table.close();
        conn.close();

    }


    /**
     * DML
     * 循环大量插入
     */
    @Test
    public void testManyPuts() throws Exception {

        Table table = conn.getTable(TableName.valueOf("user_info"));
        ArrayList<Put> puts = new ArrayList<>();

        for (int i = 0; i <= 100; i++) {
            Put put = new Put(Bytes.toBytes("" + i));
            put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("username"), Bytes.toBytes("zhang" + i));
            put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"), Bytes.toBytes((18 + i) + ""));
            put.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("address"), Bytes.toBytes("Beijing" + i));

            puts.add(put);

        }

        table.put(puts);

        System.out.println("批量插入HBase表完成!");
        table.close();
        conn.close();
    }

    /**
     * DML
     * 删除
     */
    @Test
    public void testDelete() throws Exception {

        Table table = conn.getTable(TableName.valueOf("user_info"));

        // 构造一个对象封装要删除的数据信息
        Delete delete1 = new Delete(Bytes.toBytes("0"));
        Delete delete2 = new Delete(Bytes.toBytes("1"));
        Delete delete3 = new Delete(Bytes.toBytes("10"));
        delete3.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("address"));

        ArrayList<Delete> dels = new ArrayList<>();
        dels.add(delete1);
        dels.add(delete2);
        dels.add(delete3);

        table.delete(dels);

        System.out.println("删除HBase数据完成!");
        table.close();
        conn.close();
    }


    /**
     * DML
     * 查询
     */
    @Test
    public void testGet() throws Exception {

        Table table = conn.getTable(TableName.valueOf("user_info"));

        Get get = new Get(Bytes.toBytes("100"));

        Result result = table.get(get);

        // 从结果中取出用户指定的某个key的value
        byte[] value = result.getValue(Bytes.toBytes("base_info"), Bytes.toBytes("username"));
        System.out.println(new String(value));

        System.out.println("-------------------------------------");

        // 遍历整行结果中的所有kv单元格
        CellScanner cellScanner = result.cellScanner();
        while (cellScanner.advance()) {
            Cell cell = cellScanner.current();

            byte[] rowArray = cell.getRowArray(); // 本kv所属的行键的字节数组
            byte[] familyArray = cell.getFamilyArray(); // 列族名的字节数组
            byte[] qualifierArray = cell.getQualifierArray(); // 列名的字节数组
            byte[] valueArray = cell.getValueArray(); // 值的字节数组

            System.out.println("行键:" + new String(rowArray, cell.getRowOffset(), cell.getRowLength()));
            System.out.println("列族:" + new String(familyArray, cell.getFamilyOffset(), cell.getFamilyLength()));
            System.out.println("列名:" + new String(qualifierArray, cell.getQualifierOffset(), cell.getQualifierLength()));
            System.out.println("值:" + new String(valueArray, cell.getValueOffset(), cell.getValueLength()));

        }
    }

    /**
     * DML
     * 按行键范围查询
     */
    @Test
    public void testScan() throws Exception {

        Table table = conn.getTable(TableName.valueOf("user_info"));

        // 包含起始键,不包含结束键 [10, 100)
        // 但是如果真的想查询出末尾的那个行键,那么,可以在末尾行键上拼接一个不可见的字节(\000)
        Scan scan = new Scan(Bytes.toBytes("10"), Bytes.toBytes("11\001"));

        ResultScanner scanner = table.getScanner(scan);

        Iterator<Result> iterator = scanner.iterator();

        while (iterator.hasNext()) {
            Result result = iterator.next();
            // 遍历整行结果中的所有kv单元格
            CellScanner cellScanner = result.cellScanner();
            while (cellScanner.advance()) {
                Cell cell = cellScanner.current();

                byte[] rowArray = cell.getRowArray();  //本kv所属的行键的字节数组
                byte[] familyArray = cell.getFamilyArray();  //列族名的字节数组
                byte[] qualifierArray = cell.getQualifierArray();  //列名的字节数据
                byte[] valueArray = cell.getValueArray(); // value的字节数组

                System.out.println("行键: " + new String(rowArray, cell.getRowOffset(), cell.getRowLength()));
                System.out.println("列族名: " + new String(familyArray, cell.getFamilyOffset(), cell.getFamilyLength()));
                System.out.println("列名: " + new String(qualifierArray, cell.getQualifierOffset(), cell.getQualifierLength()));
                System.out.println("value: " + new String(valueArray, cell.getValueOffset(), cell.getValueLength()));
            }
            System.out.println("----------------------");
        }
    }

}


发布了153 篇原创文章 · 获赞 122 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Happy_Sunshine_Boy/article/details/105074806