zoukankan      html  css  js  c++  java
  • Hbase数据库简介

    Hbase概念:

    常用的oracle、mySQL数据库都是面向行储存的,而hbase是面向列储存的数据库,储存本身具有水平延展性。

    hbase有两个主要概念:Row key和Column Famliy

    Column Famliy又称为“列族”,每一个Column Family都可以根据“限定符”有多个column。

    例如:有一个User表,传统的数据库中,表的列是固定的,name,age,sex等属性,User的属性不能动态增加。

    但采用列储存系统,比如Hbase,那么我们可以定义User表,然后定义info 列族,User的数据可以分为:info:name = zhangsan,info:age=30,info:sex=male等,

    如果后来你又想增加另外的属性,这样很方便只需要info:newProperty就可以了。

    又比如储存用户信息,信息并不一定完整,而null的单元会造成空间浪费,在Hbase里,如果每一个column 单元没有值,那么是不占用空间的。

    采用Hbase的这种方式,还有一个非常重要的好处就是会自动切分,当表中的数据超过某一个阀值以后,Hbase会自动为我们切分数据,这样的话,查询就具有了伸缩性,而再加上Hbase的弱事务性的特性,对Hbase的写入操作也将变得非常快。

    另一个主要概念:Row key,其实可以理解row key 是某一行的主键,但是因为Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要根据你系统的查询需求来设计了。

    例如我们查询某人信息,因此我们的Row key可以有以下三个部分构成<userId><timestamp><feedId>,这样以来当我们要查询某个人的最进的Feed就可以指定Start Rowkey为<userId><0><0>,End Rowkey为<userId><Long.MAX_VALUE><Long.MAX_VALUE>来查询了,同时因为Hbase中的记录是按照rowkey来排序的,这样就使得查询变得非常快。

     Hbase的优缺点 
    1 列的可以动态增加,并且列为空就不存储数据,节省存储空间.

    2 Hbase自动切分数据,使得数据存储自动具有水平可扩展性

    3 Hbase可以提供高并发读写操作的支持

    Hbase的缺点:

    1 不能支持条件查询,只支持按照Row key来查询.

    2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.

    补充:

    1.数据类型,HBase只有简单的字符类型,所有的类型都是交由用户自己处理,它只保存字符串。而关系数据库有丰富的类型和存储方式。

    2.数据操作:HBase只有很简单的插入、查询、删除、清空等操作,表和表之间是分离的,没有复杂的表和表之间的关系,而传统数据库通常有各式各样的函数和连接操作。  

    3.存储模式:HBase是基于列存储的,每个列族都由几个文件保存,不同的列族的文件时分离的。而传统的关系型数据库是基于表格结构和行模式保存的 

    4.数据维护,HBase的更新操作不应该叫更新,它实际上是插入了新的数据,而传统数据库是替换修改

    5.可伸缩性,Hbase这类分布式数据库就是为了这个目的而开发出来的,所以它能够轻松增加或减少硬件的数量,并且对错误的兼容性比较高。而传统数据库通常需要增加中间层才能实现类似的功

    只要Row key相同就可以看作一条数据,该数据的列,也就是属性可以添加。

    基本使用

    import java.io.IOException; 
    import java.util.ArrayList; 
    import java.util.List; 
     
    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.KeyValue; 
    import org.apache.hadoop.hbase.MasterNotRunningException; 
    import org.apache.hadoop.hbase.ZooKeeperConnectionException; 
    import org.apache.hadoop.hbase.client.Delete; 
    import org.apache.hadoop.hbase.client.Get; 
    import org.apache.hadoop.hbase.client.HBaseAdmin; 
    import org.apache.hadoop.hbase.client.HTable; 
    import org.apache.hadoop.hbase.client.HTablePool; 
    import org.apache.hadoop.hbase.client.Put; 
    import org.apache.hadoop.hbase.client.Result; 
    import org.apache.hadoop.hbase.client.ResultScanner; 
    import org.apache.hadoop.hbase.client.Scan; 
    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.filter.CompareFilter.CompareOp; 
    import org.apache.hadoop.hbase.util.Bytes; 
     
    public class HbaseTest { 
     
        public static Configuration configuration; 
        static { 
            configuration = HBaseConfiguration.create(); 
            configuration.set("hbase.zookeeper.property.clientPort", "2181"); 
            configuration.set("hbase.zookeeper.quorum", "192.168.1.100"); 
            configuration.set("hbase.master", "192.168.1.100:600000"); 
        } 
     
        public static void main(String[] args) { 
            // createTable("wujintao"); 
            // insertData("wujintao"); 
            // QueryAll("wujintao"); 
            // QueryByCondition1("wujintao"); 
            // QueryByCondition2("wujintao"); 
            //QueryByCondition3("wujintao"); 
            //deleteRow("wujintao","abcdef"); 
            deleteByCondition("wujintao","abcdef"); 
        } 
     
         
        public static void createTable(String tableName) { 
            System.out.println("start create table ......"); 
            try { 
                HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration); 
                if (hBaseAdmin.tableExists(tableName)) {// 如果存在要创建的表,那么先删除,再创建 
                    hBaseAdmin.disableTable(tableName); 
                    hBaseAdmin.deleteTable(tableName); 
                    System.out.println(tableName + " is exist,detele...."); 
                } 
                HTableDescriptor tableDescriptor = new HTableDescriptor(tableName); 
                tableDescriptor.addFamily(new HColumnDescriptor("column1")); 
                tableDescriptor.addFamily(new HColumnDescriptor("column2")); 
                tableDescriptor.addFamily(new HColumnDescriptor("column3")); 
                hBaseAdmin.createTable(tableDescriptor); 
            } catch (MasterNotRunningException e) { 
                e.printStackTrace(); 
            } catch (ZooKeeperConnectionException e) { 
                e.printStackTrace(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
            System.out.println("end create table ......"); 
        } 
     
         
        public static void insertData(String tableName) { 
            System.out.println("start insert data ......"); 
            HTablePool pool = new HTablePool(configuration, 1000); 
            HTable table = (HTable) pool.getTable(tableName); 
            Put put = new Put("112233bbbcccc".getBytes());// 一个PUT代表一行数据,再NEW一个PUT表示第二行数据,每行一个唯一的ROWKEY,此处rowkey为put构造方法中传入的值 
            put.add("column1".getBytes(), null, "aaa".getBytes());// 本行数据的第一列 
            put.add("column2".getBytes(), null, "bbb".getBytes());// 本行数据的第三列 
            put.add("column3".getBytes(), null, "ccc".getBytes());// 本行数据的第三列 
            try { 
                table.put(put); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
            System.out.println("end insert data ......"); 
        } 
     
         
        public static void dropTable(String tableName) { 
            try { 
                HBaseAdmin admin = new HBaseAdmin(configuration); 
                admin.disableTable(tableName); 
                admin.deleteTable(tableName); 
            } catch (MasterNotRunningException e) { 
                e.printStackTrace(); 
            } catch (ZooKeeperConnectionException e) { 
                e.printStackTrace(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
     
        } 
         
         public static void deleteRow(String tablename, String rowkey)  { 
            try { 
                HTable table = new HTable(configuration, tablename); 
                List list = new ArrayList(); 
                Delete d1 = new Delete(rowkey.getBytes()); 
                list.add(d1); 
                 
                table.delete(list); 
                System.out.println("删除行成功!"); 
                 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
             
     
        } 
     
          
         public static void deleteByCondition(String tablename, String rowkey)  { 
                //目前还没有发现有效的API能够实现根据非rowkey的条件删除这个功能能,还有清空表全部数据的API操作 
     
        } 
     
     
         
        public static void QueryAll(String tableName) { 
            HTablePool pool = new HTablePool(configuration, 1000); 
            HTable table = (HTable) pool.getTable(tableName); 
            try { 
                ResultScanner rs = table.getScanner(new Scan()); 
                for (Result r : rs) { 
                    System.out.println("获得到rowkey:" + new String(r.getRow())); 
                    for (KeyValue keyValue : r.raw()) { 
                        System.out.println("列:" + new String(keyValue.getFamily()) 
                                + "====值:" + new String(keyValue.getValue())); 
                    } 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
     
         
        public static void QueryByCondition1(String tableName) { 
     
            HTablePool pool = new HTablePool(configuration, 1000); 
            HTable table = (HTable) pool.getTable(tableName); 
            try { 
                Get scan = new Get("abcdef".getBytes());// 根据rowkey查询 
                Result r = table.get(scan); 
                System.out.println("获得到rowkey:" + new String(r.getRow())); 
                for (KeyValue keyValue : r.raw()) { 
                    System.out.println("列:" + new String(keyValue.getFamily()) 
                            + "====值:" + new String(keyValue.getValue())); 
                } 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
     
         
        public static void QueryByCondition2(String tableName) { 
     
            try { 
                HTablePool pool = new HTablePool(configuration, 1000); 
                HTable table = (HTable) pool.getTable(tableName); 
                Filter filter = new SingleColumnValueFilter(Bytes 
                        .toBytes("column1"), null, CompareOp.EQUAL, Bytes 
                        .toBytes("aaa")); // 当列column1的值为aaa时进行查询 
                Scan s = new Scan(); 
                s.setFilter(filter); 
                ResultScanner rs = table.getScanner(s); 
                for (Result r : rs) { 
                    System.out.println("获得到rowkey:" + new String(r.getRow())); 
                    for (KeyValue keyValue : r.raw()) { 
                        System.out.println("列:" + new String(keyValue.getFamily()) 
                                + "====值:" + new String(keyValue.getValue())); 
                    } 
                } 
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
     
        } 
     
         
        public static void QueryByCondition3(String tableName) { 
     
            try { 
                HTablePool pool = new HTablePool(configuration, 1000); 
                HTable table = (HTable) pool.getTable(tableName); 
     
                List<Filter> filters = new ArrayList<Filter>(); 
     
                Filter filter1 = new SingleColumnValueFilter(Bytes 
                        .toBytes("column1"), null, CompareOp.EQUAL, Bytes 
                        .toBytes("aaa")); 
                filters.add(filter1); 
     
                Filter filter2 = new SingleColumnValueFilter(Bytes 
                        .toBytes("column2"), null, CompareOp.EQUAL, Bytes 
                        .toBytes("bbb")); 
                filters.add(filter2); 
     
                Filter filter3 = new SingleColumnValueFilter(Bytes 
                        .toBytes("column3"), null, CompareOp.EQUAL, Bytes 
                        .toBytes("ccc")); 
                filters.add(filter3); 
     
                FilterList filterList1 = new FilterList(filters); 
     
                Scan scan = new Scan(); 
                scan.setFilter(filterList1); 
                ResultScanner rs = table.getScanner(scan); 
                for (Result r : rs) { 
                    System.out.println("获得到rowkey:" + new String(r.getRow())); 
                    for (KeyValue keyValue : r.raw()) { 
                        System.out.println("列:" + new String(keyValue.getFamily()) 
                                + "====值:" + new String(keyValue.getValue())); 
                    } 
                } 
                rs.close(); 
     
            } catch (Exception e) { 
                e.printStackTrace(); 
            } 
     
        } 
     
    }

    数据获取实例:

    /*
     * Need Packages:
     * commons-codec-1.4.jar
     *
     * commons-logging-1.1.1.jar
     *
     * hadoop-0.20.2-core.jar
     *
     * hbase-0.90.2.jar
     *
     * log4j-1.2.16.jar
     *
     * zookeeper-3.3.2.jar
     *
     */
    
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.KeyValue;
    import org.apache.hadoop.hbase.client.Get;
    import org.apache.hadoop.hbase.client.HTable;
    import org.apache.hadoop.hbase.client.Result;
    import org.apache.hadoop.hbase.client.ResultScanner;
    import org.apache.hadoop.hbase.client.Scan;
    import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
    import org.apache.hadoop.hbase.filter.FilterList;
    import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
    import org.apache.hadoop.hbase.util.Bytes;
    
    public class HbaseSelecter
    {
        public static Configuration configuration = null;
        static
        {
            configuration = HBaseConfiguration.create();
            //configuration.set("hbase.master", "192.168.0.201:60000");
            configuration.set("hbase.zookeeper.quorum", "idc01-hd-nd-03,idc01-hd-nd-04,idc01-hd-nd-05");
            //configuration.set("hbase.zookeeper.property.clientPort", "2181");
        }
    
        public static void selectRowKey(String tablename, String rowKey) throws IOException
        {
            HTable table = new HTable(configuration, tablename);
            Get g = new Get(rowKey.getBytes());
            Result rs = table.get(g);
    
            for (KeyValue kv : rs.raw())
            {
                System.out.println("--------------------" + new String(kv.getRow()) + "----------------------------");
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       :" + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        public static void selectRowKeyFamily(String tablename, String rowKey, String family) throws IOException
        {
            HTable table = new HTable(configuration, tablename);
            Get g = new Get(rowKey.getBytes());
            g.addFamily(Bytes.toBytes(family));
            Result rs = table.get(g);
            for (KeyValue kv : rs.raw())
            {
                System.out.println("--------------------" + new String(kv.getRow()) + "----------------------------");
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       :" + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        public static void selectRowKeyFamilyColumn(String tablename, String rowKey, String family, String column)
                throws IOException
        {
            HTable table = new HTable(configuration, tablename);
            Get g = new Get(rowKey.getBytes());
            g.addColumn(family.getBytes(), column.getBytes());
    
            Result rs = table.get(g);
    
            for (KeyValue kv : rs.raw())
            {
                System.out.println("--------------------" + new String(kv.getRow()) + "----------------------------");
                System.out.println("Column Family: " + new String(kv.getFamily()));
                System.out.println("Column       :" + new String(kv.getQualifier()));
                System.out.println("value        : " + new String(kv.getValue()));
            }
        }
    
        public static void selectFilter(String tablename, List<String> arr) throws IOException
        {
            HTable table = new HTable(configuration, tablename);
            Scan scan = new Scan();// 实例化一个遍历器
            FilterList filterList = new FilterList(); // 过滤器List
    
            for (String v : arr)
            { // 下标0为列簇,1为列名,3为条件
                String[] wheres = v.split(",");
    
                filterList.addFilter(new SingleColumnValueFilter(// 过滤器
                        wheres[0].getBytes(), wheres[1].getBytes(),
    
                        CompareOp.EQUAL,// 各个条件之间是" and "的关系
                        wheres[2].getBytes()));
            }
            scan.setFilter(filterList);
            ResultScanner ResultScannerFilterList = table.getScanner(scan);
            for (Result rs = ResultScannerFilterList.next(); rs != null; rs = ResultScannerFilterList.next())
            {
                for (KeyValue kv : rs.list())
                {
                    System.out.println("--------------------" + new String(kv.getRow()) + "----------------------------");
                    System.out.println("Column Family: " + new String(kv.getFamily()));
                    System.out.println("Column       :" + new String(kv.getQualifier()));
                    System.out.println("value        : " + new String(kv.getValue()));
                }
            }
        }
    
        public static void main(String[] args) throws Exception
        {
            if(args.length < 2){
                System.out.println("Usage: HbaseSelecter table key");
                System.exit(-1);
            }
    
            System.out.println("Table: " + args[0] + " , key: " + args[1]);
            selectRowKey(args[0], args[1]);
    
            /*
            System.out.println("------------------------行键  查询----------------------------------");
            selectRowKey("b2c", "yihaodian1002865");
            selectRowKey("b2c", "yihaodian1003396");
    
            System.out.println("------------------------行键+列簇 查询----------------------------------");
            selectRowKeyFamily("riapguh", "用户A", "user");
            selectRowKeyFamily("riapguh", "用户B", "user");
    
            System.out.println("------------------------行键+列簇+列名 查询----------------------------------");
            selectRowKeyFamilyColumn("riapguh", "用户A", "user", "user_code");
            selectRowKeyFamilyColumn("riapguh", "用户B", "user", "user_code");
    
            System.out.println("------------------------条件 查询----------------------------------");
            List<String> arr = new ArrayList<String>();
            arr.add("dpt,dpt_code,d_001");
            arr.add("user,user_code,u_0001");
            selectFilter("riapguh", arr);
            */
        }
    }

    摘自:https://www.cnblogs.com/zhenjing/p/hbase_example.html

  • 相关阅读:
    python-批量执行.py文件
    python-写入excel(xlswriter)
    python-读取excel(xlrd)
    python接口自动化测试-requests.post()
    python-读取配置文件
    python-mysql
    python-Redis的List操作
    python-Redis的String、Hash操作
    Elasitcsearch High Level Rest Client使用示例
    前端并发优化技巧
  • 原文地址:https://www.cnblogs.com/dk2557/p/10180155.html
Copyright © 2011-2022 走看看