美文网首页
Hbase笔记

Hbase笔记

作者: 商陆_990e | 来源:发表于2019-08-06 18:29 被阅读0次

    HBase

    - 1.hbase 介绍

            Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。
        当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™。该项目的目标是托
        管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式
        的,版本化的非关系数据库,模仿Google的Bigtable: Chang等人的结构化数据分布式存储系
        统。正如Bigtable利用Google文件系统提供的分布式数据存储一样,Apache HBase在Hadoop和
        HDFS之上提供类似Bigtable的功能。
    
        2006年-google发表了bigtable的白皮书
        2006年-开始开发hbase
        2008年-hbase正式成为apache的子项目
        2010年-正式成为apache的顶级项目
    
        1.HBase是在HDFS上面向列的分布式的数据库;
          HBase首先是数据库,分布式的,面向列的,稀疏,<首选在HDFS基础上>;
          Google发布三篇论文:GFS、MapReduce、BigTable开启分布式存储和计算的纪元;
          hdfs+MapRedece(Hadoop)解决离线分析;HBase解决实时处理业务需求;
        2.HBase不是关系型数据库,它不支持SQL;
        3.列簇(Column family):
           物理上,列簇存储在文件系统中,面向列簇的存储器;
           创建table时,必须制定列簇,列簇的中列可随时增加;
           针对调优和存储考虑,需将列簇成员设置成相同的访问权限和大小特征;
    
    5cf62127380d361164

    - 2.hbase 特点

        大:一个表可以有数十亿行,上百万列; 
    
        无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态的增加,同一张表中不同的行可以有截然不同的列; 
        面向列:面向列(族)的存储和权限控制,列(族)独立检索; 
    
        稀疏:对于空(null)的列,并不占用存储空间,表可以设计的非常稀疏; 
        数据多版本:每个单元中的数据可以有多个版本,默认情况下版本号自动分配,是单元格插入时的时间戳; 
        数据类型单一:Hbase中的数据都是字符串,没有类型。
    

    - 3.hbase 搭建(完全分布式+HA)

    1) 解压

        tar -zxvf  hbase-1.3.1-bin.tar.gz -C /root/soft/
        mv ~/soft/hbase-1.3.1 ~/soft/hbase
    

    2) 添加环境变量

        echo "#hbase install" >> /etc/profile
        echo "export HBASE_HOME=/root/soft/hbase" >> /etc/profile
        echo "export PATH=$HBASE_HOME/bin:$PATH" >> /etc/profile
        source /etc/profile
    

    3) 修改配置文件

    (1) hbase-env.sh

        export JAVA_HOME=/root/soft/java
        export HBASE_CLASSPATH=/root/soft/hadoop/etc/hadoop
        # 去掉后边的 -XX:PermSize=128m -XX:MaxPermSize=128m 
        # java1.8 后会自动调整内存 添加参数会有警告
        export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS "
        export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS "
        # 关闭hbase自带Zookeeper
        export HBASE_MANAGES_ZK=false
    

    (2) hbase-site.xml

      <property>
        <name>hbase.rootdir</name>
        <value>hdfs://mycluster/hbase</value>
      </property>
      <property>
        <name>hbase.cluster.distributed</name>
        <value>true</value>
      </property>
      <property>
        <name>hbase.zookeeper.quorum</name>
        <value>mstr,slv1,slv2,slv3,slv4</value>
      </property>
      <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/root/zookeeper/zkdata</value>
      </property>
      <property>
        <name>hbase.tmp.dir</name>
        <value>/root/tmp/hbase</value>
      </property>
    

    (3) regionservers

    slv1
    slv2
    slv3
    

    (4) backup-masters (自己在conf下创建 )

    slv4
    

    (5) 软连接hadoop的配置文件(core, hdfs)

    #软连接hadoop配置
    
    ln -s ~/soft/hadoop/core-site.xml ~/soft/hbase/conf
    
    ln -s ~/root/hadoop/hdfs-site.xml ~/soft/hbase/conf
    

    (6) 分发软件, 配置文件和环境变量

    - 4 hbase 操作

    1) 启动集群

        zkServer.sh start  //在Zk集群节点上执行 
        start-dfs.sh
        start-hbase.sh
    
    image

    2) Web-UI

    (mstr:16010)

    image

    (slv4:16010)

    [图片上传失败...(image-b9822d-1565087262349)]

    3) hbase shell

    [root@mstr ~]# hbase shell
    
    HBase Shell; enter 'help<RETURN>' for list of supported commands.
    Type "exit<RETURN>" to leave the HBase Shell
    Version 1.3.1, r930b9a55528fe45d8edce7af42fef2d35e77677a, Thu Apr  6 19:36:54 PDT 2017
    
    1."查看服务器状态"
        > status 
    
        1 active master, 1 backup masters, 3 servers, 0 dead, 2.0000 average load
    
    2."查看表"
        > list
        TABLE                                                                          
        mfrain:student                                                                 
        mfrain:tt                                                                      
        testtable                                                                      
        wordcount                  
    
    3."扫描"
        # 全表扫描
        > scan 'mfrain:tt'
    
        ROW                  COLUMN+CELL                                               
         1001                column=info1:a, timestamp=1557909052757, value=aaa        
         1001                column=info1:b, timestamp=1557909063664, value=bbb    
        # 筛选扫描
        > scan 'user',{STARTROW =>'101',STOPROW => '101'}
        # 获取一行数据
        > get 'mfrain:tt','1001'
        COLUMN                                   CELL                                                                                                                  
         info1:a                                 timestamp=1557909052757, value=aaa                                                                                    
         info1:b                                 timestamp=1557909063664, value=bbb
        # 查看某单元格值
        > get 'mfrain:tt','1001','info1:a'
        COLUMN                                   CELL                                                                                                                  
         info1:a                                 timestamp=1557909052757, value=aaa
    
    
    4."创建表"
        > create '表名','列族名'
    
    5."插入数据"
        > put '表名','行键','列族名:列名','值'
        #在hbase中没有修改,但是可以覆盖只要保持rowkey,列族,列相同即可进行覆盖操作
    
    6."查看表结构"
        > describe 'testtable'
    
        Table testtable is ENABLED                                                                                                                                     
        testtable                                                                                                                                                      
        COLUMN FAMILIES DESCRIPTION                                                                                                                                    
        {NAME => 'colfaml', 
        BLOOMFILTER => 'ROW', 
        VERSIONS => '1', 
        IN_MEMORY => 'false', 
        KEEP_DELETED_CELLS => 'FALSE', 
        DATA_BLOCK_ENCODING => 'NONE', 
        TTL => 'FOREVER', 
        COMPRESSION => 'NONE', 
        MIN_VERSIONS => '0', 
        BLOCKCACHE => 'true', 
        BLOCKSIZE => '65536',     
        REPLICATION_SCOPE => '0'} 
    
    7."更改表信息"     
        # 更改列族的版本号
        > alter '表名',{NAME => 'info',VERSIONS => '3'} 
        # 添加列族
        > disable '表名'
        > alter '表名',NAME=>'新增列族名'
        > enable '表名'
    
    8."删除表信息"
        # 删除具体单元格值
        > delete '表名','行键','列族:列'
        # 删除一行值
        > deleteall '表名','行键'
        # 清空表信息
        > truncate '表名'
        # 删除列族
        > alter "表名",'delete' => '列族名'
    
    9."删除表"
        # 第一步 将表设置为disable
        > disable '表名'
        # 第二部 删除表
        > drop '表名'
    
    10."多版本控制"
        # 默认version为1,只能存1个版本
        # 更改表的列族的最多版本
        > alter 'mfrain:student',{NAME=>'info1',VERSIONS=>3}
        # 扫描表最近三个版本信息
        > scan 'mfrain:student' ,{VERSIONS=>3}
        ROW                                      COLUMN+CELL                                                                                                           
         1001                                    column=info1:nage, timestamp=1557901465180, value=18                                                                  
         1001                                    column=info1:name, timestamp=1557905467926, value=mfre4                                                               
         1001                                    column=info1:name, timestamp=1557905336099, value=mfr3                                                                
         1001                                    column=info1:name, timestamp=1557902966333, value=mfr2                                                                
         1001                                    column=info2:addr, timestamp=1557901498209, value=JiLin  
        # 执行delete删除命令时,如需按照ts(timestamp)时间戳进行删除操作时,之前版本一并删除掉;
        > delete 'mfrain:student','1001','info1:name',1557905336099
        > scan 'mfrain:student' ,{VERSIONS=>3}
            ROW                                      COLUMN+CELL                                                                                                           
         1001                                    column=info1:nage, timestamp=1559645182639, value=20                                                                  
         1001                                    column=info1:nage, timestamp=1557901465180, value=18                                                                  
         1001                                    column=info1:name, timestamp=1557905467926, value=mfre4                                                               
         1001                                    column=info2:addr, timestamp=1557901498209, value=JiLin
    
    11."get_table指令"  
        # 将table映射成相对应的变量值(table实例),通过table实例对表进行相关操作
    
        > t1 = get_table '表名'
    
        > t1.scan
    
        > t1.put 'row-2','info1:name','zhangsan'
    
        > t1.get 'row-2'
    
    12."namespace操作"
        # namespace名字空间,相当于传统数据库的表空间: 
        # 列出名字空间
        > list_namespace 
        # 列出名字空间下有哪些表                       
        > list_namespace_tables 'default'
        # 创建namespace
        > create_namespace 'ns1',{'author'=>'zhangsan','data'=>'2018-07-31'}
        # 查看namespace 信息
        > describe_namespace 'mfrain'
            DESCRIPTION                                                                                                                                                    
        {NAME => 'mfrain', author => 'mfr', data => '20190515'}
        # 删除namespace (先清空表)
        > drop_namespace 'ns1'
    

    4) Flush刷新表(1.3.1版本默认128M进行刷新)

    (1) 插入数据

    (2) 查看hbase/data/列族生成0 bytes

    > hadoop fs -lsr /hbase

    image

    (3) 刷盘/关闭Hbase

    (Hbase)> flush 'mfrain:stu'
    或者 > stop-hbase.sh

    (4) 查看hbase/data/列族生成4918bytes

    > hadoop fs -lsr /hbase
    image

    (5) 设置刷盘阈值

    <property>
      <name>hbase.regionserver.optionalcacheflushinterval</name>
    
      <value>3600000</value>
    
      <description>
    
        在自动刷新之前,编辑在内存中的最长时间。
    
        默认的1小时。将其设置为0以禁用自动刷新。
    
      </description>
    </property>
    
    <property>
    
      <name>hbase.hregion.memstore.flush.size</name>
    
      <value>134217728</value>
      <description>
    
        如果memstore的大小超过128M,进行刷盘操作 
      </description>
    </property>
    

    5) 负载均衡

    balance负载均衡指令,需使用开关模式,原因负载均衡比较耗费资源:

    > balance_switch true //开启负载均衡

    > balancer //执行负载均衡

    > balance_switch false //关闭负载均衡

    > balancer "force" //强制负载均衡

    调节均衡器运行间隔(默认30000)

      <property>
        <name>hbase.balancer.period</name>
        <value>3000</value>
      </property>
    

    6) meta表

    查看meta表(只有mfrain:stu表)

    两条记录

    [图片上传失败...(image-655311-1565087262350)]

    查看WEB-UI

    三个region 包括 hbase:namespace, mfrain:stu, hbase:meta
    image image image
    regionname格式:
    <table_name>+","+<startKey>+","+<timestamp>+"."+<ENCODED>MD5生成码(生成规则由“{<table_name>+","+<startKey>+","+<timestamp>+"."}”
    

    7) split切分

    (1) 添加测试数据,使用Ruby语法添加数据

    hbase(main):003:0> create_namespace 'mfrain'
    
    hbase(main):003:0> create 'mfrain:stu','info'
    
    hbase(main):003:0> for i in 'a'..'z' do for j in 'a'..'z' do \
    hbase(main):009:2* put 'mfrain:stu',"row-#{i}#{j}","info:#{j}","#{j}" end end
    
    hbase(main):008:0> count 'mfrain:stu'
    676 row(s) in 0.2560 seconds
    
    hbase(main):010:0> flush 'mfrain:stu'
    0 row(s) in 0.9240 seconds
    

    (2) 查看/hbase路径和meta表

    ① $> hadoop fs -lsr /hbase

    [图片上传失败...(image-92e46c-1565087262350)]

    ② hbase> scan 'hbase:meta'

    image

    ③ 切分

    # 切分
    hbase(main):012:0> split 'mfrain:stu','row-mm' 
    0 row(s) in 0.2460 seconds
    

    ④ 查看切分后的meta表

    切分时

    切分时

    切分完成

    切分完成

    ⑤ 查看切分后的HDFS

    hdfs

    ⑥ 总结

    1.rowkey区间,前包后不包
    2.切分时原region不会立刻删除,等待切分完成后再删除!切分时原region有如下标记:
        STARTKEY => '', ENDKEY => '', OFFLINE => true, SPLIT => true
    

    8) merge合并

    (1) 合并指令

    hbase(main):019:0> merge_region '53c1b5981f6c7eab63b0f260eddff79a','7c0fda1423359fd3152466935b56d8bd'
    

    (2) 合并过程

    合并时

    [图片上传失败...(image-5486e5-1565087262350)]

    合并完成

    合并完成

    (3) Web-UI merge

    webUI wancheng

    (4) Region移动

    随机移动

    # move 'encoded'
    move '2530e3effe529c9f8d51141525d478f2'
    

    指定移动

    # move 'encoded','regionserver_hostname,16020,regionservertimestamp'
    move '2530e3effe529c9f8d51141525d478f2','slv1,16020,1560150516386'
    

    9) 预分区 (事先指定分区(rowkey设计至关重要))

    # 说明:在ns1命名空间下,创建t1表,列簇为f1;预分区为5个(字符串):['',10);[10,20);[20,30);[30,40);[40,'']
    hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']
    

    - 5. HBase API

    1) 开发环境准备

    hbase 对应版本相关Jar hdfs-site.xml core-site.xml hbase-site.xml

    //编写HBaseTool工具类
    
    //1.定义conn对象
    private static Configuration conf; 
    private static Connection conn;         
    static{
    
        conf = HBaseConfiguration.create();
    
        try {
    
            conn = ConnectionFactory.createConnection(conf);
    
        } catch (IOException e) {
    
            e.printStackTrace();
    
        }
    
    }
    

    2) namespace 操作

    /**
     * 创建名字空间
     * create_namespace 'ns1'  
    
     */
    public static void createNS(String namespace){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            NamespaceDescriptor nsdesc = NamespaceDescriptor.create(namespace).build();
            admin.createNamespace(nsdesc);
            System.out.println("---创建成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---创建失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    
    /**
     * 查询名字空间
     * list_namespace
     */
    public static void listNS(){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            NamespaceDescriptor[] nss = admin.listNamespaceDescriptors();
            for (NamespaceDescriptor ns : nss) {
                System.out.println(ns);
            }
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    /**
     * 删除名字空间
     * drop_namespace 'ns1'
    
     */
    public static void deleteNS(String namespace){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            admin.deleteNamespace(namespace);
            System.out.println("---删除成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---删除失败!---");
        } finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    3) Table 操作

    /**
     * 创建Table
     * create 'ns1:student','f1'
    
     */
    public static void createTable(String tablename,String colunmfamily){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            TableName tname = TableName.valueOf(tablename);
            HTableDescriptor htdesc = new HTableDescriptor(tname);
            HColumnDescriptor hcdesc = new HColumnDescriptor(colunmfamily);
            htdesc.addFamily(hcdesc);
            admin.createTable(htdesc);
            System.out.println("---表创建成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---表创建失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 查看表
     * list
     */
    
    public static void getTable() {
        try {
            HTableDescriptor[] listtable = admin.listTables();
            for(HTableDescriptor tables :listtable) {
                System.out.println(tables);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    /**
     * 删除Table
     * drop 'ns1:student'
    
     */
    public static void dropTable(String tablename){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            TableName tname = TableName.valueOf(tablename);
            admin.disableTable(tname);
            admin.deleteTable(tname);
            System.out.println("---表删除成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---表删除失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    4) Put 操作

    /**
     * 单行put
     * put 'ns1:student','row-1','f1:name','zhangsan'
    
     */
    public static void putTable(String tablename){
        TableName tableName =TableName.valueOf(tablename);
        try {
            HTable table = new HTable(conf,tableName);
            for(int i = 20; i<=23 ; i++) {
                byte[] row = Bytes.toBytes("row"+i);
                Put put = new Put(row);
                byte[] columFamily = Bytes.toBytes("fA");
                byte[] qualifier = Bytes.toBytes(String.valueOf(i));
                byte[] value = Bytes.toBytes("value"+i);
                put.addColumn(columFamily,qualifier,value);
                table.put(put);
                System.out.println("put 成功!");
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    
    
    /**
     * 多行put
     *
     */
    public static void puts(String tablename,List<Put> puts){
        try {
            Table _table = conn.getTable(TableName.valueOf(tablename));
            for (int i = 0; i < puts.size(); i++) {
                _table.put(puts.get(i));
            }
            System.out.println("---插入成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---插入失败!---");
        }
    }
    //测试多行插入
    public static void main(String[] args) throws IOException {
        List<Put> _puts = new ArrayList<Put>();
        for (int i = 3; i < 10000; i++) {
            Put _put = new Put(Bytes.toBytes("row-"+i));
            _put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("asa"+i));
            _put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("23"));
            _put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("sex"), Bytes.toBytes("男"+i));
            _put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("class"), Bytes.toBytes("BD1709"+i));
            _puts.add(_put);
        }
        HBaseTool.puts("ns1:t1", _puts);
    }
    

    5) Get 操作

    HBase以表的方式存储数据。表是由行和列构成的,列从属于某一个列族(column family)。
    行和列的交叉点称之为cell,cell是版本化的,cell的内容就是数据,cell中的数据是没有类型的,
    全部是字节码形式存贮,是不可分割的字节数组。

    /**
     * 查询单条记录通过rowkey查询   get 'tableName','rowKey'
     * @param tablename
     * @param rowkey
     */
    public static void getone(String tablename,String rowkey){
        try {
            Table _table = conn.getTable(TableName.valueOf(tablename));
    
            //get 对象首先指定rowkey
            Get _get = new Get(Bytes.toBytes(rowkey));
            Result rs = _table.get(_get);
            List<Cell> cells = rs.listCells();
            for (Cell cell : cells) {
                System.out.println("列簇为:"+Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("限定符为:"+Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("rowkey为:"+Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("value为:"+Bytes.toString(CellUtil.cloneValue(cell)));
            }
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }
    }
    
    /**
     * 查询单条记录,并返回指定Version数
     * @param tablename
     * @param rowkey
     */
    public static void getone(String tablename,String rowkey,int version){
        try {
            Table _table = conn.getTable(TableName.valueOf(tablename));
            Get _get = new Get(Bytes.toBytes(rowkey));
            _get.setMaxVersions(version);
            Result rs = _table.get(_get);
            List<Cell> cells = rs.listCells();
            for (Cell cell : cells) {
                System.out.println("列簇为:"+Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("限定符为:"+Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("rowkey为:"+Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("value为:"+Bytes.toString(CellUtil.cloneValue(cell)));
                System.out.println("timestamp为:"+cell.getTimestamp());
            }
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }
    }
    
    /**
     * 按照hbase shell 格式输出
     *  
     */
    private static void printOut(Result rs){
        List<Cell> cells = rs.listCells();
        for (Cell cell : cells) {
            String family = Bytes.toString(CellUtil.cloneFamily(cell));
            String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
            String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
            String value = Bytes.toString(CellUtil.cloneValue(cell));
            long timestamp = cell.getTimestamp();
            System.out.println(rowkey+" column="+family+":"+qualifier+", timestamp="+timestamp+", value="+value);
        }
    }
    
    /**
     * 查询所有
     * @param tablename
     * @param rowkey
     */
    public static void findAll(String tablename){
        try {
            Table _table = conn.getTable(TableName.valueOf(tablename));
            Scan scan = new Scan();
            ResultScanner rsscan = _table.getScanner(scan);
            Iterator<Result> its = rsscan.iterator();
            while (its.hasNext()) {
                printOut(its.next());
            }
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }
    }
    
    /**
     * 查询startkey至endkey之间的数据
     * @param tablename
     * @param rowkey
     */
    public static void findByRowkey(String tablename,String startkey,String endkey){
        try {
            Table _table = conn.getTable(TableName.valueOf(tablename));
            Scan scan = new Scan(Bytes.toBytes(startkey),Bytes.toBytes(endkey));
            ResultScanner rsscan = _table.getScanner(scan);
            Iterator<Result> its = rsscan.iterator();
            while (its.hasNext()) {
                printOut(its.next());
            }
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }
    }
    
        按rowKey删除 $> deleteall 'ts1','33'
    
    public static void deleteRowKey(String tableName,String rowkey) throws IOException {
        Table _table = conn.getTable(TableName.valueOf(tablename));
        Delete delete = new Delete(Bytes.toBytes(rowkey));
        table.delete(delete);
    }
    

    6) split 操作

    /**
     * 切分Table
    
     * 查看HDFS hadoop fs -lsr /hbase
     */
    public static void splittable(String tablename){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            admin.split(TableName.valueOf(tablename),Bytes.toBytes("5"));
            System.out.println("---切分成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---切分失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 切分region和table 相同
     *  
     */
    public static void splitregion(String regionname){
        Admin admin = null;
        try {
            admin = conn.getAdmin();
            admin.splitRegion(Bytes.toBytes(regionname),"row-nu".getBytes());
            System.out.println("---切分成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---切分失败!---");
        }finally{
            try {
                admin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    7) merge 操作 / move 操作

    
    //合并region
    
    admin = conn.getAdmin();
    admin.mergeRegions("ffd7e19bf6dabc990aa9da07cea32afc".getBytes(), "27e639cc8d5d43d4ff25d38c59a3bc1e".getBytes(), true);
    
    
    
    //移动region到指定节点
    
    admin = conn.getAdmin();
    admin.move("ffd7e19bf6dabc990aa9da07cea32afc".getBytes(), "slave1,16020,1558184978689".getBytes());
    

    8) Scan缓存/bacth批量查询

    一、设置Scan缓存

    通过Scan扫描,每一次调用next()方法都会生成一个单独的PRC请求,并且返回一条记录
    缓存可以让next()一次获取多条记录
    设置缓存方式有两种 :
    1)表Htable层面 setScannerCaching(int)
    2)Scan类 setCaching(int)

    也可以通过设置配置文件hbase-site.xml

    <property>
        <name>hbase.client.scanner.caching</name>
        <value>10</value>
    </property>
    

    优先级顺序为: scan类 -->Htable类-->配置文件

    二、设置bacth批量查询
    批量可以让用户选择每一次ResultScanner实例的next()操作要取回多少列
    例如,setBatch(5),则一次next()返回的Resulut实例包括5列

    缓存是面向行一级的操作,而批量则是面向列一级的操作

    public static void findAll(String tablename){
        try {
    
            Table table = conn.getTable(TableName.valueOf(tablename));
            //EQUAL    匹配等于设定值的值
            Scan scan = new Scan();
            //设置扫描批次,一次next()返回 Result实例会包括5列
    //        scan.setBatch(5);
    //        //hbase设置缓存
    //        scan.setCaching(100);
    
            long starttime = System.currentTimeMillis(); 
            ResultScanner scanner = table.getScanner(scan);
            Iterator<Result> its = scanner.iterator();
            while (its.hasNext()) {
                printOut(its.next());
            }
            scanner.close();
            System.out.println(System.currentTimeMillis()-starttime);
            System.out.println("---查询成功!---");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("---查询失败!---");
        }
    }
    

    相关文章

      网友评论

          本文标题:Hbase笔记

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