HBASE

作者: 转身一世铅华尽 | 来源:发表于2020-09-18 11:38 被阅读0次

    HBASE操作
    JAVAAPI操作HBASE
    添加maven依赖:

    <!-->
        hbase连接依赖
    </-->
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.7.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.7.4</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>2.7.4</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-core</artifactId>
                <version>2.8.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-jdbc</artifactId>
                <version>2.3.2</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-auth</artifactId>
                <version>2.6.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>2.0.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-common</artifactId>
                <version>2.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-protocol</artifactId>
                <version>2.0.0</version>
            </dependency>
    

    通过相应的语法进行操作:
    一、连接:
    1、通过创建connection,创建configuration进行连接:

    Configuration hBaseConfiguration = HBaseConfiguration.create();
    hBaseConfiguration.setInt("hbase.client.retries.number", 1);
    hBaseConfiguration.set("hbase.zookeeper.property.clientPort","2181");//连接端口
    hBaseConfiguration.set("hbase.zookeeper.quorum","集群节点1:2181,集群节点2:2181,集群节点3:2181,集群节点4:2181,集群节点5:2181");
    hBaseConfiguration.set("zookeeper.session.timeout", "5000");/ZK连接超时时间
    hBaseConfiguration.set("hbase.zookeeper.property.maxclientcnxns", "300");
    hBaseConfiguration.set("hbase.ipc.client.socket.timeout.connect", "10000");//HBASE连接超时时间
    hBaseConfiguration.set("hbase.regionserver.handler.count", "500");
    connection = ConnectionFactory.createConnection(hBaseConfiguration);
    

    2、通过导入配置连接:

    hBaseConfiguration.addResource(new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI()));
    hBaseConfiguration.addResource(new Path(ClassLoader.getSystemResource("core-site.xml").toURI()));
    connection = ConnectionFactory.createConnection(hBaseConfiguration);
    

    PS!!!依赖包的版本一定要配套

    二、操作:
    1、SCAN:通过上边连接获取到的连接(connection),我们可以获取到操作用户

    Admin admin = connection.getAdmin();
    

    通过admin我们可以获取到表属性和列簇属性

    TableName[] tableNames = admin.listTableNames();//查看所有表名
    HTableDescriptor[] hTableDescriptors = admin.listTables();//查看所有表属性
    
    
    Scan scan = new Scan();//创建一个SCAN操作对象
    Table table = connection.getTable(TableName.valueOf("表名"));//通过获取到的连接和表名获取到表操作对象
    System.out.println(table.getName());
    ResultScanner scanner = table.getScanner(scan);//执行scan操作
    for (Result result : scanner){ //每一个result都是查询出来的一行数据结果
        System.out.println(new String(result.getRow()));//获取到表中的所有行键[行键建后文 PS行键]
        byte[] value = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("id"));//可以通过result获取到具体的数据
        System.out.println(new String(value));//HBASE中的所有事物都是以二进制存放在文件内存区中的,所以取出时需要进行转换
    }
    

    2、GET操作:

    Get get = new Get(Bytes.toBytes("表名"));//创建GET操作对象
    get.addFamily(Bytes.toBytes("info"));//添加列簇筛选条件
    Result result = table.get(get);//执行GET操作,获取到结果
    Cell[] cells = result.rawCells();//获取属性操作,这个可以获取到result中的列簇,属性,行键等
    byte[] row = result.getRow();//获取行键
    System.out.println(new String(row));
    byte[] value = result.getValue(Bytes.toBytes("info"), Bytes.toBytes("id"));//获取到info列簇下对应id列的值
    System.out.println(new String(value));
    

    3、DELETE删除操作:

     // 创建一个删除请求
    Delete delete = new Delete(Bytes.toBytes("行键"));
    // 可以自定义一些筛选条件
    delete.addFamily(Bytes.toBytes("列簇名"));
    table.delete(delete);
    // 停用表
    admin.disableTable(tableName);
    // 删除列族
    admin.deleteColumnFamily(tableName, "列簇名".getBytes());
    // 删除表
    admin.deleteTable(tableName);
    

    4、PUT新增操作:

    TableDescriptor tableDescriptor = TableDescriptorBuilder.newBuilder(TableName.valueOf("表名")).build();
    admin.createTable(tableDescriptor);//新增表,这个是1.3之后版本的用法
    
    TableName tableName = TableName.valueOf("表名");
    HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
    // 新建一个列族名为test的列族
    HColumnDescriptor test= new HColumnDescriptor("test");
    // 将列族添加到表中
    tableDescriptor.addFamily(test);
    admin.createTable(tableDescriptor);//老版本API用法
    
    // 创建一个put请求,用于添加数据或者更新数据
    Put put = new Put(Bytes.toBytes("行键"));
    put.addColumn(Bytes.toBytes("列簇"), Bytes.toBytes("数据列名"), Bytes.toBytes("数据"));
    table.put(put);
    // 创建一个append请求,用于在数据后面添加内容
    Append append = new Append(Bytes.toBytes("行键"));
    append.add(Bytes.toBytes("列簇"), Bytes.toBytes("数据列名"), Bytes.toBytes("数据"));
    table.append(append);
    

    HBASE shell命令:

    hbase shell //进入HBASE的shell命令客户端,exit为退出
    
    create_namespace '表空间名'  //创建一个表空间
    drop_namespace '表空间名'  //删除一个表空间
    describe_namespace '表空间名'   //查看一个表空间
    list_namespace   //查看所有表空间
    create '表空间名:表名', '列簇名'  //在对应表空间下创建表
    list_namespace_tables '表名'   //查看一个表空间下的某个表
    create '表名','列簇名','列簇名'  //创建表
    list   //列出所有表
    disable '表名'  //禁用表
    alter '表名', '列族名' //修改列簇
    alter '表名', {NAME=> '列族名', METHOD=> 'delete'}   //删除列簇
    # 修改f1列族的版本为5
    alter 't1', NAME => 'f1', VERSIONS => 5
    # 修改多个列族,修改f2为内存,版本号为5
    alter 't1', 'f1', {NAME => 'f2', IN_MEMORY => true}, {NAME => 'f3', VERSIONS => 5}
    describe '表名' //获取表的描述
    exists '表名'  //判断表是否存在
    enable '表名'     //启用表,和禁用表对应
    drop '表名'     表的删除需要先禁用,启用的表是不允许删除的
    put '表名', '行键', '列族名', '列值'
    put '表名', '行键', '列族名:列名', '列值'  //插入数据语法
    scan '表名'     //全表扫描
    scan '表名', {COLUMN=>'列族名:列名'}     //扫描某个列簇对应的列
    get '表名', '行键', '列族名'
    get '表名', '行键'     //查询数据
    delete '表名', '行键', '列族名:列名'     //删除某个列簇下的列
    deleteall '表名', '行键'     //删除某行数据
    truncate '表名'     //清空表数据,底层为先禁用再删除再重新创建
    count '表名'     //查询有多少行数据
    scan '表名', { LIMIT => 行数} //指定行数扫描
    

    简单错误排查。
    有问题建议先检查节点和端口是否都正常,然后查看ZK运转是否正常
    RIT问题:一般可以先使用 hbase hbck进行错误扫描,一般出现这个问题,都是由于数据读写异常或者是内存异常或大量短连接造成的,一般来说重启节点就能解决问题。还是没有解决,建议手动排查一下引用文件是否出了问题,如果是的话,删除异常的引用文件
    hbase2.0以下的hbase可以使用hbase hbck -fix进行自我修复。
    hbase2.03以上版本可以使用hbck2工具进行修复,如果是hbase2.0的话,目前我还没有找到可以使用的。

    相关文章

      网友评论

          本文标题:HBASE

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