美文网首页我爱编程
Java代码中Hbase的使用

Java代码中Hbase的使用

作者: 凌冰_lonny | 来源:发表于2017-12-26 16:15 被阅读26次

    hbase简介

    HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。

    hbase表结构


    列簇1 列簇2(建议1-3个列簇)
    列a 列b... 列a 列b...
    列簇会用于做索引,一般列簇1,2用于存放常用的筛选用字段,列簇3用于存放内容字段
    在下面的代码示例中,一共有两个列簇,familyName1和familyName2
    familyName1中存放了三个用于频繁查询筛选的字段:ab,dt,hb
    familyName2中存放了整个数据结构的json化字符串

    hbase操作 代码示例

    1、创建表

    2、增/改

    public void put(String tableName, Object item) {
            if (item== null) {
                LOG.error("[HBase] itemis null!");
                return;
            }
            // 设置rowkey
            if (item.getid() == null || item.getid().isEmpty()) {
                LOG.error("[HBase] Adding null/empty key!");
                return;
            }
    
            String ultimateRowKey = getHashedID(item.getid());
            if (ultimateRowKey == null || ultimateRowKey.isEmpty()) {
                LOG.error("[HBase] Adding null/empty hashed key! Original key is " + item.getid());
                return;
            }
            Put put = new Put(Bytes.toBytes(ultimateRowKey));
            // HTabel负责跟记录相关的操作如增删改查等
            Table table = null;
            try {
                table = con.getTable(TableName.valueOf(tableName));
                put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("ab"), Bytes.toBytes(item.getAvailable()));
                put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("dt"), Bytes.toBytes(item.getDistype()));
                put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("hb"), Bytes.toBytes(item.getHotboost()));
                Gson gson = new Gson();
                String value = gson.toJson(item);
                put.addColumn(Bytes.toBytes(familyName2), Bytes.toBytes("js"), Bytes.toBytes(value));
                table.put(put);
            } catch (IOException e) {
                LOG.error("[HBase] Failed to connect to table while adding!  " + e.getMessage());
            } finally {
                try {
                    if (table != null)
                        table.close();
                } catch (IOException e) {
                    LOG.error("[HBase] Error while closing table " + e.getMessage());
                }
            }
        }
    

    3、删

    //按照rowkey进行删除某一行
    public void del(String tablename, String rowkey) {
            // 设置rowkey
            if (rowkey == null || rowkey.isEmpty()) {
                LOG.error("[HBase] Adding null/empty key!");
                return;
            }
            String ultimateRowKey = getHashedID(rowkey);
            if (ultimateRowKey == null || ultimateRowKey.isEmpty()) {
                LOG.error("[HBase] Adding null/empty hashed key! Original key is " + rowkey);
                return;
            }
            Table table = null;
            Delete delete = new Delete(Bytes.toBytes(ultimateRowKey));
            try {
                table = con.getTable(TableName.valueOf(tablename));
                table.delete(delete);
            } catch (IOException e) {
                LOG.error("[HBase] Failed to connect to table while del!  " + e.getMessage());
            } finally {
                try {
                    if (table != null)
                        table.close();
                } catch (IOException e) {
                    LOG.error("[HBase] Error while closing table " + e.getMessage());
                }
            }
        }
    

    4、查

    public String get(String tablename, String rowKey) {
            // 先查询索引表
            Table cntTable = null;
            try {
                cntTable = con.getTable(TableName.valueOf(tablename));
                String ultimateRowKey = getHashedID(rowKey);
                if (ultimateRowKey == null || ultimateRowKey.isEmpty()) {
                    LOG.error("[HBase] Getting hashed null/empty key! Original key is " + rowKey);
                    return null;
                }
                Get get = new Get(Bytes.toBytes(ultimateRowKey));
                Result result = cntTable.get(get);
    
                String hbaseValue = Bytes.toString(result.getValue(Bytes.toBytes(familyName2), Bytes.toBytes("js")));
                return hbaseValue;
            } catch (IOException e) {
                LOG.error("[HBase] Failed to connect to " + tablename + " while getting!  " + e.getMessage());
                return null;
            } finally {
                try {
                    if (cntTable != null)
                        cntTable.close();
                } catch (IOException e) {
                    LOG.error("[HBase] Error while closing table " + tablename + e.getMessage());
                }
            }
        }
    

    5、批量写入

    public <T> void puts(String tableName, Map<String, Object> items) {
            if (items == null || items.isEmpty()) {
                LOG.error("[HBase] Adding null/empty item map!");
                return;
            }
            int maxSize = 10000;
            Table table = null;
            try {
                table = con.getTable(TableName.valueOf(tableName));
                int eachSize = Math.min(maxSize, items.size());
                List<Put> puts = new ArrayList<Put>(eachSize);
                int handled = 0;
                for (Entry<String, Object> entry : items.entrySet()) {
                    String ultimateRowKey = getHashedID(entry.getKey());
                    Object value = entry.getValue();
                    if (ultimateRowKey == null || ultimateRowKey.isEmpty()) {
                        LOG.error("[HBase] Adding null/empty hashed key! Original key is " + entry.getKey());
                        handled++;
                        continue;
                    }
                    // System.out.println(ultimateRowKey);
                    Put put = new Put(Bytes.toBytes(ultimateRowKey));
                    put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("ab"), Bytes.toBytes(value .getAb()));
                    put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("dt"), Bytes.toBytes(value .getDt()));
                    put.addColumn(Bytes.toBytes(familyName1), Bytes.toBytes("hb"), Bytes.toBytes(value .getHb()));
                    Gson gson = new Gson();
                    String valuestr = gson.toJson(value);
                    put.addColumn(Bytes.toBytes(familyName2), Bytes.toBytes("js"), Bytes.toBytes(valuestr));
                    puts.add(put);
                    handled++;
                    // 每隔10000,写一次
                    if (handled == eachSize) {
                        LOG.info("[HBase] Adding " + eachSize + "rows!");
                        table.put(puts);
                        puts = new ArrayList<Put>(eachSize);
                    }
                }
                if (puts.size() > 0)
                    table.put(puts);
            } catch (IOException e) {
                LOG.error("[HBase] Error while putting data " + e.getMessage());
            } finally {
                try {
                    if (table != null)
                        table.close();
                } catch (IOException e) {
                    LOG.error("[HBase] Error while closing table " + e.getMessage());
                }
            }
        }
    

    相关文章

      网友评论

        本文标题:Java代码中Hbase的使用

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