美文网首页
Hbase复习总结之一

Hbase复习总结之一

作者: wudl | 来源:发表于2021-12-05 00:22 被阅读0次

    1. Hbase 的简介

    特点
    强一致性读/写: HBASE不是“最终一致的” 数据存储 , 它非常适合于诸如高速计数器聚合等任务
    自动分块: HBase表通过Region分布在集群上,随着数据的增长,区域被自动拆分和重新分布
    自动RegionServer故障转移
    Hadoop/HDFS集成: HBase支持HDFS开箱即用作为其分布式文件系统
    MapReduce : HBase通过MapReduce支持大规模并行处理,将HBase用作源和接收器
    块缓存和布隆过滤器 : HBase支持块Cache和Bloom过滤器进行大容量查询优化
    运行管理: HBase为业务洞察和JMX度量提供内置网页。
    

    重要特点:
    大:一个表可以有上十亿行,上百万列
    面向列:面向列(族)的存储和权限控制,列(族)独立检索。
    稀疏:对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。

    2.hbase 数据模型:

    列(Column): HBase中的列有列族(column family) 和列限定符(列名)(Column Qualifier)组成。
    列族(Column Family):
        出于性能原因, 列族将一组列及其值组织在一起
        每个列族都有一组存储属性: 例如 是否应该换成在内存中, 数据如何被压缩等
        表中的每一行都有相同的列族, 但在列族中不存储任何内容
        所有的列族的数据全部都存储在一块(文件系统HDFS)
        Hbase官方建议所有的列族保持一样的列, 并且将同一类的列放在一个列族中
    

    列标识符(Column Qualifier)
    列族中包含一个个的列限定符, 这样可以为存储的数据提供索引
    列族在创建表的时候是固定的, 但列限定符是不做限制的
    不同的列可能会存在不同的列标识符
    单元格(Cell): 单元格是行、列族和列限定符的组合,包含一个值和一个时间戳, 数据以二进制存储
    版本号(verson num): 每条数据都会有版本号的概念
    每条数据都可以有多个版本号, 默认值为系统时间戳, 类型为Long
    每条数据都可以有多个版本号, 默认值为系统时间戳, 类型为Long
    在向Hbase插入更新数据的时候, HBase默认会将当前操作的时间记录下来, 当然也可以人为指定时间
    不同版本的数据按照时间倒序排序, 即最新的数据排在最前面。

    物理存储模型
    
    Hbase 物理存储模型.png

    3. Hbase 的常用命令:

    1. 进入hbase : hbase shell
    2. 查看数据库中有哪些表: list
    3. 创建一个表 : 创建 一个user表 和连个列簇:  info data
        create 'user', 'info', 'data'  或者 : create 'user', 'info'
    4. 添加两条数据
        put 'user','10000','info:name','zhangsan'
        put 'user','10000','info:age','20'
    
     5.查询
     通过scan 全表扫描:
        scan 'user'
     指定rowkey 进行查询
        get 'user','10000'
    5. 查看rowkey 下面的某个列簇信息 : get ' 表名','rowkey','列簇'
         get 'user','10000','info'
    6查询rowkey 指定列簇和指定字段的值 :get '表名','rowkey','列簇:列名','列簇:列名'
        get 'user','10000','info:age','info:name'
    7.查看rowkey 指定多个列簇信息
        get 'user','10000','info'
             或者
        get 'user','10000',{COLUMN =>['info','data']}
    8.指定rowkey 和列进行查询
        get 'user','10000',{FILTER=>"ValueFilter(=,'binary:zhangsan')"}
    9.查询所有数据
        sacn 'user'
        scan 'user',{FORMATTER => 'toString'}
        scan 'user' ,{LIMIT =>3,FORMATTER=>'toString'}
    10.列簇查询: 查询user 表中info 的信息
        scan 'user',{COLUMNS => 'info'}
            或
        scan 'user',{COLUMNS => 'info',RAW=>true,VERSIONS=>5}
    11.多列簇的查询:
        scan 'user',{COLUMNS=>['info','data']}
            或
        scan 'user',{COLUMNS=>['info:name','data:pic']}
    12. 查询指定列簇与某个列名的查询
        scan 'user',{COLUMNS=>'info:name'}
    13.指定列簇和列名以及限定版本查询
        scan 'user',{COLUMNS=>'info:name',VERSIONS=>5}
    14.指定多个列簇与按照数据值模糊查询
        scan 'user',{COLUMNS=>['info','data'],FILTER=>"(QualifierFilter(=,'substring:a'))"}
    15. 指定rowkey 的范围值查询
        scan 'user',{COLUMNS=>'info',STARTROW=>'10000',ENDROW=>'10000'}
    16.指定rowkey 模糊查询
        scan 'user',{FILTER=>"PrefixFilter('info')"}
    17.指定数据范围值查询 :   查询user表中指定范围的数据
    scan 'user', {TIMERANGE => [1392368783980, 1392380169184]}
    
    

    4 更新操作

    1. 更新版本号: 更新表user 表f1 列簇的版本号
        alter 'user',NAME=>'info',VERSIONS=>5
        
        
    

    5. 删除操作

    指定rowkey 和列名进行行删除
    delete 'user', '10000', 'info:name'
    指定rowkey 删除正行数据
    deleteall 'user', '10000'
    
    删除一个列簇
        alter 'user', NAME => 'info', METHOD => 'delete’
     或
        alter 'user', 'delete' => 'info'
    清空表数据
    truncate 'user'
    
    删除表: 注意要先禁用表在进行删除
    disable 'user'
    drop 'user'
    
    
    

    6. 统计有多少行的数据

    count 'user'

    7. java代码操作

    需要引入的pom 文件:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>wudl-bigdata</artifactId>
            <groupId>com-wudl-bigdata</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>wudl-hbase-operate</artifactId>
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>2.1.0</version>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
                <version>2.6</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>6.14.3</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <target>1.8</target>
                        <source>1.8</source>
                    </configuration>
                </plugin>
            </plugins>
    
        </build>
    
    </project>
    

    java 代码

    package com.hbase.api;
    
    import javafx.scene.control.Tab;
    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.*;
    import org.apache.hadoop.hbase.util.Bytes;
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @author :wudl
     * @date :Created in 2021-12-04 22:55
     * @description:Hbase 的操作
     * @modified By:
     * @version: 1.0
     */
    
    public class HbaseOperate {
        public static void main(String[] args) throws IOException {
    
            // 创建表
            HbaseOperate.Connection();
            // 添加数据
    //        addData();
    
    //        getList();
            //删除数据
            delData();
        }
    
    
        public static Connection getConnection() throws IOException {
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "192.168.1.161:2181");
            Connection conn = null;
            if (conn == null) {
                return ConnectionFactory.createConnection(conf);
            }
    
            return conn;
        }
    
        public static void Connection() throws IOException {
    
            Admin admin = getConnection().getAdmin();
    
            TableName wudlHbase = TableName.valueOf("wudlHbase");
            boolean isTable = admin.tableExists(wudlHbase);
            if (!isTable) {
                TableDescriptorBuilder newBuilder = TableDescriptorBuilder.newBuilder(wudlHbase);
                List<ColumnFamilyDescriptor> familList = new ArrayList<>();
                // 添加列簇
                familList.add(ColumnFamilyDescriptorBuilder.newBuilder("cf".getBytes()).build());
                // 在表的构造器中添加表的列簇信息
                newBuilder.setColumnFamilies(familList);
                // 通过表构造器,构建表对象
                TableDescriptor build = newBuilder.build();
                // 执行创建表操作
                admin.createTable(build);
            }
            //释放资源
            admin.close();
            // 关闭连接
            getConnection().close();
    
        }
    
        /**
         * 往 表中添加一行数据
         */
    
        public static void addData() throws IOException {
            Admin admin = getConnection().getAdmin();
            TableName wudlHbase = TableName.valueOf("wudlHbase");
            boolean isTable = admin.tableExists(wudlHbase);
            if (isTable) {
                Table table = getConnection().getTable(TableName.valueOf("wudlHbase"));
                for (int i = 0; i < 10; i++) {
                    String number = 10000 + i + "";
                    String name = "hdfs" + i;
                    String address = "广东省" + i;
                    String age = 10 + i + "";
                    Put put = new Put(number.getBytes());
                    put.addColumn("cf".getBytes(), "name".getBytes(), name.getBytes());
                    put.addColumn("cf".getBytes(), "age".getBytes(), age.getBytes());
                    put.addColumn("cf".getBytes(), "address".getBytes(), address.getBytes());
                    table.put(put);
                }
                table.close();
                getConnection().close();
                System.out.println("数据添加成功-------------->");
            }
        }
    
        /**
         * 查询数据
         */
        public static void getList() throws IOException {
            Admin admin = getConnection().getAdmin();
            Table table = getConnection().getTable(TableName.valueOf("wudlHbase"));
            // 获取row 为4949191 的数据
            Get get = new Get("4949191".getBytes());
            Result result = table.get(get);
            List<Cell> cells = result.listCells();
            for (Cell cell : cells) {
                byte[] rowKeyBytes = CellUtil.cloneRow(cell);
                byte[] familyBytes = CellUtil.cloneFamily(cell);
                byte[] qualifierBytes = CellUtil.cloneQualifier(cell);
                byte[] valueBytes = CellUtil.cloneValue(cell);
                String rowKey = Bytes.toString(rowKeyBytes);
                String family = Bytes.toString(familyBytes);
                String qualifier = Bytes.toString(qualifierBytes);
    
                if (qualifier.equals("NUM_CURRENT") || qualifier.equals("NUM_PREVIOUS") || qualifier.equals("TOTAL_MONEY") || qualifier.equals("NUM_USAGE")) {
                    double value = Bytes.toDouble(valueBytes);
                    System.out.println("rowkey-->" + rowKey + ":family--->" + family + "--;qualue--->" + qualifier + "---;value----->" + value);
                } else {
                    String value = Bytes.toString(valueBytes);
                    System.out.println("rowkey-->" + rowKey + ":family--->" + family + "--;qualue--->" + qualifier + "---;value----->" + value);
                }
            }
    
            table.close();
            getConnection().close();
            System.out.println("查询数据完成-------------->");
        }
    
        /**
         * 删除一条数据
         * @throws IOException
         */
        public static void delData() throws IOException {
            Table table = getConnection().getTable(TableName.valueOf("wudlHbase"));
            Delete delete = new Delete("4949191".getBytes());
            delete.addFamily("cf".getBytes());
            delete.addColumn("cf".getBytes(), "name".getBytes());
            table.delete(delete);
    
        }
    
        public static  void delTable() throws IOException {
            Admin admin = getConnection().getAdmin();
            if (!admin.tableExists(TableName.valueOf("wudlHbase"))){
                admin.disableTable(TableName.valueOf("wudlHbase"));
            }
            admin.disableTable(TableName.valueOf("wudlHbase"));
    
        }
    
    
    }
    
    

    相关文章

      网友评论

          本文标题:Hbase复习总结之一

          本文链接:https://www.haomeiwen.com/subject/acqixrtx.html