HBase入門指南

目錄導航

1、概念介紹
2、原理圖
3、基本命令
4、java遠程連接hbase

一、概念介紹

  1. 列(column)是最基本的存儲單位
    列的名稱規範:列族名:列名
    hbase 會盡量將屬於同一個列族的列放在一臺機器上面

  2. 多個列可以組成一個列族(column family)
    表的屬性定義在列族上,如:過期時間、數據塊緩存、是否壓縮等
    因此,同一個表的列族可以有完全不同的屬性,
    但是,同一個列族內的列具有相同的屬性

  3. 每個行都擁有唯一的一個行鍵(rowkey),行鍵是一串不可重複的字符串
    hbase中無法根據column來排序,只能根據rowkey進行排序,排序規則是根據字典
    如:key1 key2 key11
    結果:key1 key11 key2

  4. 單元格
    一個列上面可能存儲多個版本的值
    多個版本的值被存儲在多個單元格中
    唯一確定一條結果的表達式應該是:行鍵:列族:列:版本號
    版本號可以省略,如果不寫版本號,hbase會默認使用最後一個版本的數據
    每個列或者每個單元都會被賦予一個時間戳,
    該時間戳默認由系統指定,也可以用戶顯示指定

  5. 注意:
    行與行的列可以完全不一樣
    上一行和下一行的數據也可以存儲在不同的機器上
    同一行內的列可以存儲在完全不同的機器上

  6. 提示:
    一個表設置多少列族比較好?官方建議越少越好
    雖然hbase是分佈式數據庫,但是數據在同一臺物理機上依然會加速數據的查詢速度
    所以列族太多會極大的降低數據庫性能,並且列族定義太多容易出現bug

  7. Region
    region是一段數據的集合
    region是基於searchserver的,它的所有數據存取操作都是調用hdfs客戶端來實現
    一個region就是多個行

  8. zookeeper、hbase、hdfs的關係
    hbase中的regionServer存儲實際的表數據信息
    這些數據信息存儲在hdfs上面
    zookeeper管理這些regionServer,
    包括具體的數據字段存儲在哪個regionServer上面,
    客戶端每次與hbase連接,其實先和zookeeper通信,
    查詢出需要先和哪個regionServer通信,然後再連接該regionServer


二、原理圖

在這裏插入圖片描述

三、基本命令

  • hbase shell 進入操作行
  • list 查看錶
  • get ‘表名’ ‘rowkey名稱’,‘列族:列的名稱’
    get ‘patient_count’,‘pat_001’
  • describe ‘表名’ 查看錶結構
    獲取的結果 name屬性是列族名稱
    其餘顯示的是列族的屬性
  • scan ‘表名’ 查看 表數據
  • count ‘表名’ 查看錶中的記錄總數
  • create ‘表名’,‘列族名1’,‘列族名2’ …
  • disable ‘表名’
    drop ‘表名’ 刪除表 必須先disable然後才能drop
  • exists ‘表名’ 判斷該表是否存在
  • put ‘表名’,‘rowkey名稱’,‘列族:列名’,‘數據值’ 插入數據信息,如果存在則覆蓋
  • delete ‘表名’,‘rowkey名稱’,‘列族:列名’


四、java遠程連接hbase

1、拷貝服務器上 hadoop core-site.xml 和hbase hbase-site.xml 文件放到項目的resource目錄下面
2、即使是連接遠程的 hadoop,也需要在本地安裝 hadoop
下載winutils的windows版本 https://github.com/srccodes/hadoop-common-2.2.0-bin
下載後文件名爲 hadoop-common-2.2.0-bin-master.zip ,然後再解壓
3、配置環境變量
在這裏插入圖片描述
在這裏插入圖片描述
4、代碼

  • 使用 Admin 類管理元數據
public class HBaseAdminUtil {
    private static Logger logger = LoggerFactory.getLogger(HBaseAdminUtil.class);

    /**
     * 獲取一個hbase的連接
     * @return 返回一個連接
     */
    public static Connection getConnection(){
        Connection connection = null;
        try {
            //1、創建一個Configuration 加載hbase的配置項
            Configuration configuration = HBaseConfiguration.create();
            //2、加載配置文件放入 Configuration
            Path basePath = new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI());
            Path hadoopPath = new Path(ClassLoader.getSystemResource("core-site.xml").toURI());
            configuration.addResource(basePath);
            configuration.addResource(hadoopPath);
            //3、加載配置類創建一個hbase的連接
            connection = ConnectionFactory.createConnection(configuration);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 創建表,創建表的時候需要指定列族
     * @param connection hbase連接
     * @param tableName hbase表名
     * @param columnFamily hbase列族名
     */
    public static void createTable(Connection connection,String tableName,String columnFamily){
        //1、定義一個表名
        TableName hTableName = TableName.valueOf(tableName);
        //2、定義表屬性
        HTableDescriptor hTableDescriptor = new HTableDescriptor(hTableName);
        //3、定義列族
        HColumnDescriptor column_family = new HColumnDescriptor(columnFamily);
        //4、將表屬性作用於列族
        hTableDescriptor.addFamily(column_family);
        //5、使用Admin對象創建表
        Admin admin;
        try {
            admin = connection.getAdmin();
            //如果表存在刪除,不存在創建
            if (admin.tableExists(hTableName)){
               deleteTable(connection,tableName);
            }
            admin = connection.getAdmin();
            admin.createTable(hTableDescriptor);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 刪除表
     * @param connection hbase連接
     * @param tableName hbase表名
     */
    public static void deleteTable(Connection connection, String tableName){
        try {
            TableName table_name = TableName.valueOf(tableName);
            Admin admin = connection.getAdmin();
            admin.disableTable(table_name);
            admin.deleteTable(table_name);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 給指定表添加列
     * @param connection hbase連接
     * @param tableName 表名
     * @param columnFamily 列族名
     */
    public static void addColumnFamily(Connection connection, String tableName, String columnFamily){
        TableName hTableName = TableName.valueOf(tableName);
        HTableDescriptor hTableDescriptor = new HTableDescriptor(hTableName);
        HColumnDescriptor column_family = new HColumnDescriptor(columnFamily);
        hTableDescriptor.addFamily(column_family);
        try {
            Admin admin = connection.getAdmin();
            admin.addColumn(hTableName,column_family);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • 使用HTable類和Table接口實現數據增刪改查
public class HBaseTableUtil {
    /**
     * 獲取hbase的連接
     * @return 返回一個hbase的連接
     */
    public static Connection getConnection(){
        Connection connection = null;
        try {
            Configuration configuration = HBaseConfiguration.create();
            Path basePath = new Path(ClassLoader.getSystemResource("hbase-site.xml").toURI());
            Path hadoopPath = new Path(ClassLoader.getSystemResource("core-site.xml").toURI());
            configuration.addResource(basePath);
            configuration.addResource(hadoopPath);
            connection = ConnectionFactory.createConnection(configuration);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 向表中插入數據內容
     * 如果輸入的表名、列族、列相同,內容會被覆蓋
     * @param connection hbase連接
     * @param tableName 表名
     * @param columnFamily 列族
     * @param rowkey 行鍵
     * @param value 內容
     */
    public static void addColumn(Connection connection, String tableName, String rowkey, String columnFamily, String column, String value){
        try {
            TableName table_name = TableName.valueOf(tableName);
            Table table = connection.getTable(table_name);
            Put put = new Put(Bytes.toBytes(rowkey));
            put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
            table.put(put);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 向指定的行鍵、列族、列中追加指定內容
     * @param connection hbase連接
     * @param tableName hbase表名
     * @param rowkey 行鍵
     * @param columnFamily 列族
     * @param column 列
     * @param value 值
     */
    public static void appendContent(Connection connection,String tableName, String rowkey, String columnFamily, String column, String value){
        try {
            TableName table_name = TableName.valueOf(tableName);
            Table table = connection.getTable(table_name);
            Append append = new Append(Bytes.toBytes(rowkey));
            append.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(value));
            table.append(append);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 使用某個rowkey、某個列族、某列對應的值
     * @param connection 獲取hbase連接
     * @param tableName hbase表名
     * @param rowkey hbase的行鍵
     */
    public static String getContent(Connection connection,String tableName, String rowkey, String columnFamily, String column){
        String resultStr = null;
        try {
            TableName table_name = TableName.valueOf(tableName);
            Table table = connection.getTable(table_name);
            Get get = new Get(Bytes.toBytes(rowkey));
            Result result = table.get(get);
            byte[] resultBytes = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
            resultStr = new String(resultBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultStr;
    }

    /**
     * 刪除指定的行鍵 列族 列
     * @param connection 連接
     * @param tableName 表名
     * @param rowKey 行鍵
     * @param columnFamily 列族
     * @param column 列
     */
    public static void deleteContent(Connection connection, String tableName, String rowKey, String columnFamily, String column){
        try {
            TableName table_name = TableName.valueOf(tableName);
            Table table = connection.getTable(table_name);
            Delete delete = new Delete(Bytes.toBytes(rowKey));
            delete.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));
            table.delete(delete);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章