hbase2.x入门

前置条件,必须学会hadoop和hive

hadoop3入门(1)-CSDN博客

hive3.x入门-CSDN博客

Hbase描述

hbase是以hdfs为数据存储的,一种分布式,可扩展的nosql数据库

1.海量数据存储,表格可以容纳百亿行*百万列的数据
2.列式存储,动态的增加和删除列
3.准实时查询(毫秒内)
4.多版本,每一列的数据都有多个版本
5.高可靠性,支持多个master,当主master挂掉过后,其他备master变成主master

安装hbase

前提是hadoop和zookeeper都启动了

192.168.10.102 = hadoop102

192.168.10.103 = hadoop103

192.168.10.104 = hadoop104

102,103,104,一共3台机器

下面的配置,3台机器都要配置

下载hbase,解压到/opt/module目录下

https://archive.apache.org/dist/hbase/2.4.11/hbase-2.4.11-bin.tar.gz

cd /opt/module

mv hbase-2.4.11 hbase

配置环境信息

vi /etc/profile

export HBASE=/opt/module/hbase
export PATH=$PATH:$HBASE/bin 

使得环境变量生效

source /etc/profile 

修改hbase的环境信息,不使用hbase内部的zookeeper

jdk设置为自己的jdk路径

cd /opt/module/hbase/conf 

vi hbase-env.sh

export HBASE_MANAGES_ZK=false 

export JAVA_HOME=/opt/module/jdk1.8.0_231

 修改hbase-site.xml

cd /opt/module/hbase/conf

vi hbase-site.xml

<!-- hbase在hdfs上数据位置 -->
<property>
    <name>hbase.rootdir</name>
    <value>hdfs://hadoop102:8020/hbase</value>
</property>
<!-- 搭建hbase分布式-->
<property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
</property>
<!-- 指定zookeeper的主机 -->
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop102,hadoop103,hadoop104</value>
</property>

<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>

修改regionservers

cd /opt/module/hbase/conf

vi regionservers 

hadoop102
hadoop103
hadoop104 

在102机器上启动hbase 

cd /opt/module/hbase/bin

./start-hbase.sh

访问下面的地址

http://hadoop102:16010/

hdfs下就会显示对应的目录的信息 

jps进程下 102机器会显示HMaster和HRegionServer,其他机器只显示HRegionServer 

 

shell命令

cd /opt/module/hbase/bin

hbase shell

 

创建命名空间

create_namespace 'aaa'

显示所有命名空间

list_namespace

创建表格student,后面2个参数是列族

create 'student','info','msg'

查看所有表格

list

也可以在hbase的控制台看到

修改表格 ,往student追加数据列族

alter 'student', { NAME => 'pwd', VERSIONS => 2 }

 删除列族

alter 'student', 'delete' => 'pwd'

 删除表格,需要2步,先进行标记,在删除

disable 'student'

drop 'student'

往表格的列族添加数据

student是表格

1003是行号,随便定义

info:age,info是列族,age随便定义列名

22 是age的值

put 'student','1003','info:age','22' 

获取数据 表格,行号

get 'student','1003' 

 获取表格所有内容

scan 'student'

删除列的数据

delete 'student','1001','info:name' 

删除这个表格的一行的所有数据

deleteall 'student','1002' 

api

创建maven,注意:不是springboot

引入pom

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.11</version>
</dependency>

获取连接 

package com.example.demo7;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.http.config.ConnectionConfig;

import java.io.IOException;

class Solution {

    public static Connection connection=null;

    static {
        //创建连接
        try {
            connection= ConnectionFactory.createConnection();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void close(){
        if(connection!=null){
            //关闭连接
            try {
                connection.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    public static void main(String[] args) throws IOException {
        //获取连接
        System.out.println(connection);
        //关闭连接
        close();
    }
}

创建命名空间

package com.example.demo7;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;

import java.io.IOException;

public class Ddl {

    public static  Connection connection= Solution.connection;
    /**
     * 创建命名空间
     * @param name
     */
    public static void createNamespace(String name) throws IOException {
        Admin admin=connection.getAdmin();
        NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(name);
        try {
            admin.createNamespace(namespaceDescriptor.build());
        } catch (IOException e) {
            System.out.println("命名空间已存在");
             e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException {
        createNamespace("bbb");
        System.out.println("============");
        Solution.close();
    }
}

创建表格

package com.example.demo7;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Ddl {

    public static  Connection connection= Solution.connection;
    /**
     * 创建命名空间
     * @param name
     */
    public static void createNamespace(String namespace) throws IOException {
        Admin admin=connection.getAdmin();
        NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
        try {
            admin.createNamespace(namespaceDescriptor.build());
        } catch (IOException e) {
            System.out.println("命名空间已存在");
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
    }

    /**
     * 判断表格是否存在
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @throws IOException
     */
    public static boolean tableExists(String namespace,String tableName) throws IOException {
        Admin admin=connection.getAdmin();
        boolean flag=false;
        try {
            flag=admin.tableExists(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
        return flag;
    }

    /**
     * 创建表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @param columnFamily 列族
     * @throws IOException
     */
    public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
        Admin admin=connection.getAdmin();
        //创建表格
        TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
        for (String o : columnFamily) {
            //设置列族
            ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
            //设置列族的最大版本为3
            c.setMaxVersions(3);
            tableDescriptorBuilder.setColumnFamily(c.build());
        }
        admin.createTable(tableDescriptorBuilder.build());
        //关闭连接
        admin.close();
    }

    public static void main(String[] args) throws IOException {
        //创建bbb命名空间下的 user表格
        createTable("bbb","user","info","msg");
        //判断表格是否存在
        boolean aa=tableExists("bbb","user");
        System.out.println(aa);
        Solution.close();
    }
}

修改表格

package com.example.demo7;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Ddl {

    public static  Connection connection= Solution.connection;
    /**
     * 创建命名空间
     * @param name
     */
    public static void createNamespace(String namespace) throws IOException {
        Admin admin=connection.getAdmin();
        NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
        try {
            admin.createNamespace(namespaceDescriptor.build());
        } catch (IOException e) {
            System.out.println("命名空间已存在");
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
    }

    /**
     * 判断表格是否存在
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @throws IOException
     */
    public static boolean tableExists(String namespace,String tableName) throws IOException {
        Admin admin=connection.getAdmin();
        boolean flag=false;
        try {
            flag=admin.tableExists(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
        return flag;
    }

    /**
     * 创建表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @param columnFamily 列族
     * @throws IOException
     */
    public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
        Admin admin=connection.getAdmin();
        //创建表格
        TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
        for (String o : columnFamily) {
            //设置列族
            ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
            //设置列族的最大版本为3
            c.setMaxVersions(3);
            tableDescriptorBuilder.setColumnFamily(c.build());
        }
        admin.createTable(tableDescriptorBuilder.build());
        //关闭连接
        admin.close();
    }


    /**
     * 修改表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @param columnFamily 列族
     * @param version 版本号
     * @throws IOException
     */
    public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
        Admin admin=connection.getAdmin();
        //获取表格
        TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
        TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(descriptor);
        //获取列族
        ColumnFamilyDescriptor columnFamilyDescriptor=descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
        ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder=ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyDescriptor);
        //修改版本号
        columnFamilyDescriptorBuilder.setMaxVersions(version);
        //对列族进行修改
        tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
        //对表格进行修改
        admin.modifyTable(tableDescriptorBuilder.build());
        admin.close();
    }
    public static void main(String[] args) throws IOException {
        //修改ccc命名空间下的 user表格 的info列族 的版本号为4
        modifyTable("ccc","user","info",4);
        //关闭连接
        Solution.close();
    }
}

删除表格 

package com.example.demo7;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Ddl {

    public static  Connection connection= Solution.connection;
    /**
     * 创建命名空间
     * @param name
     */
    public static void createNamespace(String namespace) throws IOException {
        Admin admin=connection.getAdmin();
        NamespaceDescriptor.Builder namespaceDescriptor=NamespaceDescriptor.create(namespace);
        try {
            admin.createNamespace(namespaceDescriptor.build());
        } catch (IOException e) {
            System.out.println("命名空间已存在");
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
    }

    /**
     * 判断表格是否存在
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @throws IOException
     */
    public static boolean tableExists(String namespace,String tableName) throws IOException {
        Admin admin=connection.getAdmin();
        boolean flag=false;
        try {
            flag=admin.tableExists(TableName.valueOf(namespace,tableName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭连接
        admin.close();
        return flag;
    }

    /**
     * 创建表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @param columnFamily 列族
     * @throws IOException
     */
    public static void createTable(String namespace,String tableName,String ... columnFamily) throws IOException {
        Admin admin=connection.getAdmin();
        //创建表格
        TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));
        for (String o : columnFamily) {
            //设置列族
            ColumnFamilyDescriptorBuilder c=ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(o));
            //设置列族的最大版本为3
            c.setMaxVersions(3);
            tableDescriptorBuilder.setColumnFamily(c.build());
        }
        admin.createTable(tableDescriptorBuilder.build());
        //关闭连接
        admin.close();
    }


    /**
     * 修改表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @param columnFamily 列族
     * @param version 版本号
     * @throws IOException
     */
    public static void modifyTable(String namespace,String tableName,String columnFamily,int version) throws IOException {
        Admin admin=connection.getAdmin();
        //获取表格
        TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));
        TableDescriptorBuilder tableDescriptorBuilder=TableDescriptorBuilder.newBuilder(descriptor);
        //获取列族
        ColumnFamilyDescriptor columnFamilyDescriptor=descriptor.getColumnFamily(Bytes.toBytes(columnFamily));
        ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder=ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyDescriptor);
        //修改版本号
        columnFamilyDescriptorBuilder.setMaxVersions(version);
        //对列族进行修改
        tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());
        //对表格进行修改
        admin.modifyTable(tableDescriptorBuilder.build());
        admin.close();
    }

    /**
     * 删除表格
     * @param namespace 命名空间 如果不传 就是默认的命名空间
     * @param tableName 表格
     * @throws IOException
     */
    public static void deleteTable(String namespace,String tableName) throws IOException {
        Admin admin=connection.getAdmin();
        TableName tableName1=TableName.valueOf(namespace,tableName);
        //先标记为不可用
        admin.disableTable(tableName1);
        //在删除表格
        admin.deleteTable(tableName1);
        admin.close();
    }
    public static void main(String[] args) throws IOException {
        //删除表格
        deleteTable("ccc","user");
        //关闭连接
        Solution.close();
    }
}

添加表格内容

package com.example.demo7;

import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }


    public static void main(String[] args) throws IOException {
        //添加表格内容
        put("ccc","user","100","info","age","777");
        Solution.close();
    }
}

获取表格内容 

package com.example.demo7;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }

    /**
     * 获取内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @throws IOException
     */
    public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Get g=new Get(Bytes.toBytes(rowKey));
        g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        //读取所有的版本
        g.readAllVersions();
        //获取内容
        Result result = table.get(g);

        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            String v=new String(CellUtil.cloneValue(cell));
            System.out.println(v);
        }

        //关闭表格
        table.close();
    }
    public static void main(String[] args) throws IOException {
        //获取表格内容
        get("ccc","user","100","info","age");
        Solution.close();
    }
}

获取多行数据

package com.example.demo7;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }

    /**
     * 获取内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @throws IOException
     */
    public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Get g=new Get(Bytes.toBytes(rowKey));
        g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        //读取所有的版本
        g.readAllVersions();
        //获取内容
        Result result = table.get(g);

        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            String v=new String(CellUtil.cloneValue(cell));
            System.out.println(v);
        }

        //关闭表格
        table.close();
    }


    /**
     * 获取多行内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @throws IOException
     */
    public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }
    public static void main(String[] args) throws IOException {
        //获取表格内容
        scan("ccc","user","100","102");
        Solution.close();
    }
}

过滤列的数据,只显示对应的列的数据

package com.example.demo7;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.FileFilter;
import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }

    /**
     * 获取内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @throws IOException
     */
    public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Get g=new Get(Bytes.toBytes(rowKey));
        g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        //读取所有的版本
        g.readAllVersions();
        //获取内容
        Result result = table.get(g);

        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            String v=new String(CellUtil.cloneValue(cell));
            System.out.println(v);
        }

        //关闭表格
        table.close();
    }


    /**
     * 获取多行内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @throws IOException
     */
    public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 过滤列的数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @param family 列族
     * @param qualifier 列名
     * @param value 值
     * @throws IOException
     */
    public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        //添加过滤条件
        FilterList filterList=new FilterList();
        //查询等于值的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
                Bytes.toBytes(qualifier),
                //等于
                CompareOperator.EQUAL
                ,Bytes.toBytes(value));
        filterList.addFilter(columnValueFilter);

        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }
    public static void main(String[] args) throws IOException {
        //获取表格内容
        filterScan("ccc","user","100","102","info","age","888");
        Solution.close();
    }
}

 

过滤数据,并显示整行数据

package com.example.demo7;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.FileFilter;
import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }

    /**
     * 获取内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @throws IOException
     */
    public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Get g=new Get(Bytes.toBytes(rowKey));
        g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        //读取所有的版本
        g.readAllVersions();
        //获取内容
        Result result = table.get(g);

        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            String v=new String(CellUtil.cloneValue(cell));
            System.out.println(v);
        }

        //关闭表格
        table.close();
    }


    /**
     * 获取多行内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @throws IOException
     */
    public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 过滤列的数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @param family 列族
     * @param qualifier 列名
     * @param value 值
     * @throws IOException
     */
    public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        //添加过滤条件
        FilterList filterList=new FilterList();
        //查询等于值的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
                Bytes.toBytes(qualifier),
                //等于
                CompareOperator.EQUAL
                ,Bytes.toBytes(value));
        filterList.addFilter(columnValueFilter);

        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 过滤数据,并显示整行数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @param family 列族
     * @param qualifier 列名
     * @param value 值
     * @throws IOException
     */
    public static void singleFilter(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        //添加过滤条件
        FilterList filterList=new FilterList();
        //查询等于值的数据
        SingleColumnValueFilter columnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(family),
                Bytes.toBytes(qualifier),
                //等于
                CompareOperator.EQUAL
                ,Bytes.toBytes(value));
        filterList.addFilter(columnValueFilter);

        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a+" ");

            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }
    public static void main(String[] args) throws IOException {
        //获取表格内容 虽然查询的是age,但是也会把这一行的name也显示
        singleFilter("ccc","user","100","102","info","age","999");
        Solution.close();
    }
}

删除数据

package com.example.demo7;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.FileFilter;
import java.io.IOException;

public class Dml {

    public static Connection connection=Solution.connection;

    /**
     * 添加内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @param value  值
     * @throws IOException
     */
    public static void put(String namespace,String tableName,String rowKey,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Put put=new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        //添加内容
        table.put(put);
        //关闭表格
        table.close();
    }

    /**
     * 获取内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param rowKey 行号
     * @param family 列族
     * @param qualifier 列名
     * @throws IOException
     */
    public static void get(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Get g=new Get(Bytes.toBytes(rowKey));
        g.addColumn(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        //读取所有的版本
        g.readAllVersions();
        //获取内容
        Result result = table.get(g);

        Cell[] cells = result.rawCells();
        for (Cell cell : cells) {
            String v=new String(CellUtil.cloneValue(cell));
            System.out.println(v);
        }

        //关闭表格
        table.close();
    }


    /**
     * 获取多行内容
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @throws IOException
     */
    public static void scan(String namespace,String tableName,String startRow,String stopRow) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 过滤列的数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @param family 列族
     * @param qualifier 列名
     * @param value 值
     * @throws IOException
     */
    public static void filterScan(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        //添加过滤条件
        FilterList filterList=new FilterList();
        //查询等于值的数据
        ColumnValueFilter columnValueFilter = new ColumnValueFilter(Bytes.toBytes(family),
                Bytes.toBytes(qualifier),
                //等于
                CompareOperator.EQUAL
                ,Bytes.toBytes(value));
        filterList.addFilter(columnValueFilter);

        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a);
            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 过滤数据,并显示整行数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param startRow 开始行
     * @param stopRow 结束行 不包含这一行
     * @param family 列族
     * @param qualifier 列名
     * @param value 值
     * @throws IOException
     */
    public static void singleFilter(String namespace,String tableName,String startRow,String stopRow,String family,String qualifier,String value) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Scan scan=new Scan();
        //开始行
        scan.withStartRow(Bytes.toBytes(startRow));
        //结束行  不包含这一行
        scan.withStopRow(Bytes.toBytes(stopRow));

        //添加过滤条件
        FilterList filterList=new FilterList();
        //查询等于值的数据
        SingleColumnValueFilter columnValueFilter = new SingleColumnValueFilter(Bytes.toBytes(family),
                Bytes.toBytes(qualifier),
                //等于
                CompareOperator.EQUAL
                ,Bytes.toBytes(value));
        filterList.addFilter(columnValueFilter);

        scan.setFilter(filterList);

        ResultScanner scanner = table.getScanner(scan);
        for (Result result : scanner) {
            Cell[] cells = result.rawCells();
            for (Cell cell : cells) {
                String a=new String(CellUtil.cloneValue(cell));
                String b=new String(CellUtil.cloneFamily(cell));
                String c=new String(CellUtil.cloneQualifier(cell));
                String d=new String(CellUtil.cloneRow(cell));
                System.out.print("行号:"+d+",列族:"+b+",列名:"+c+",值:"+a+" ");

            }
            System.out.println();
        }
        //关闭表格
        table.close();
    }

    /**
     * 删除数据
     * @param namespace 命名空间
     * @param tableName 表格
     * @param family 列族
     * @param qualifier 列名
     * @param rowKey 行
     * @throws IOException
     */
    public static void delete(String namespace,String tableName,String rowKey,String family,String qualifier) throws IOException {
        //获取表格
        Table table=connection.getTable(TableName.valueOf(namespace,tableName));
        Delete del=new Delete(Bytes.toBytes(rowKey));
        //删除所有版本的数据
        del.addColumns(Bytes.toBytes(family),Bytes.toBytes(qualifier));
        table.delete(del);
        //关闭表格
        table.close();
    }
    public static void main(String[] args) throws IOException {
        //删除表格数据
        delete("ccc","user","100","info","name");
        Solution.close();
    }
}

phoenix

安装部署

解压到102的/opt/module目录下

cd /opt/module

wget https://mirrors.tuna.tsinghua.edu.cn/apache/phoenix/phoenix-5.1.2/phoenix-hbase-2.4.0-5.1.2-bin.tar.gz --no-check-certificate

tar -zxvf phoenix-hbase-2.4.0-5.1.2-bin.tar.gz

mv phoenix-hbase-2.4.0-5.1.2-bin phoenix

把jar包拷贝到3台服务器上

cd /opt/module/phoenix

cp phoenix-server-hbase-2.4.0-5.1.2.jar /opt/module/hbase/lib/

在102机器上配置环境变量

vi /etc/profile

export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PHOENIX_HOME/bin:$PATH 

使得环境变量生效

source /etc/profile 

在102机器 重启hbase

cd /opt/module/hbase/bin

./stop-hbase.sh

./start-hbase.sh 

连接phoenix

cd /opt/module/phoenix/bin 

./sqlline.py hadoop102,hadoop103,hadoop104:2181

!tables是查看所有表的意思 

基础命令 

创建表,指定单个列作为rowKey,就是id

create table student(
id varchar primary key,
name varchar,
age bigint,
addr varchar
);

表名会自动转换成大写,如果要小写展示,那么创建表的时候需在表名加双引号,例如:"student" 

 hbase默认的命名空间下,也显示了student表

指定多个列当做rowKey 

就是把id和name当做联合主键

create table student1(
id varchar not null,
name varchar not null,
age bigint,
addr varchar
constraint my_pk primary key (id,name)
);

插入数据

upsert into student values('1001','zhangsan',10,'aaaaa');

 

视图映射 

在hbase创建表格,phoenix创建视图,就能看到hbase插入的数据了

在hbase创建表格
create 'test','info1','info2'
添加数据
put 'test','1001','info1:name','zhangsan'
put 'test','1001','info2:address','aaaaa'

 在phoenix创建视图映射


create view "test"
(
id varchar primary key,
"info1"."name" varchar,
"info2"."address" varchar
); 

 删除视图,但是不会删除hbase的数据

drop view "test"; 

表映射 

在phoenix创建表

不使用字段优化 必须设置column_encoded_bytes=0;

create table "test"
(
id varchar primary key,
"info1"."name" varchar,
"info2"."address" varchar
)column_encoded_bytes=0;

删除表 会把hbase的数据也删除掉

drop table "test"

集成hive

在hive-site.xml追加zookeeper配置

cd /opt/module/hive/conf

vi hive-site.xml

 

<!-- 指定zookeeper的主机和端口号-->
<property>
    <name>hive.zookeeper.quorum</name>
    <value>hadoop102,hadoop103,hadoop104</value>
</property>
<property>
    <name>hive.zookeeper.client.port</name>
    <value>2181</value>
</property>

 

在hive中创建表aaa

CREATE TABLE aaa(
empno int,
ename string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "
                      :key,
                      info:ename
                      ")
TBLPROPERTIES ("hbase.table.name" = "aaa"); 

 

 

在hive添加数据

insert into aaa values('1','zhangsan'); 

 

在hbase查看aaa的数据

 

 

关联hbase已经存在的表aaa

在hive创建外部表bbb

CREATE EXTERNAL TABLE bbb(
empno int,
ename string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = "
                      :key,
                      info:ename
                      ") 
TBLPROPERTIES ("hbase.table.name" = "aaa");

 在Hive查询的时候,就可以拿到hbase的所有数据了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值