【大資料計算】(二) HBase 的安裝和基礎程式設計

語言: CN / TW / HK

本文已參與 「掘力星計劃」 ,贏取創作大禮包,挑戰創作激勵金

1. 安裝HBase

1.1 下載安裝檔案

1.2 配置環境變數

  • 進入環境中 shell sudo vim ~/.bashrc
  • 新增箭頭所指的兩個路徑 在這裡插入圖片描述
  • 使得環境生效

shell source ~/.bashrc

1.3 新增使用者許可權

shell sudo chown -R zqc /usr/local/hbase 在這裡插入圖片描述

1.4 檢視HBase版本資訊

shell hbase version 在這裡插入圖片描述

2. HBase的配置

2.1 單機模式配置

2.1.1 配置hbase-env.sh檔案

shell sudo vim /usr/local/hbase/conf/hbase-env.sh 在這裡插入圖片描述

2.1.2 配置hbase-site.xml

shell sudo vim /usr/local/hbase/conf/hbase-site.xml

2.1.3 啟動Hbase

  • 先啟動hadoop shell start-dfs.sh
  • 再啟動hbase shell start-hbase.sh
  • jps出現下面這些即可 在這裡插入圖片描述

  • 停止 HBase 執行 shell stop-hbase.sh

  • 停止Hadoop的執行 shell stop-dfs.sh

2.2 偽分佈模式配置

2.2.1 配置hbase-site.xml

在這裡插入圖片描述

3. HBase常用的Shell命令

3.1 在HBase中建立表

sql create 'student','Sname','Ssex','Sage','Sdept','course'

在這裡插入圖片描述

3.2 新增資料

sql put 'student','95001','Sname','LiYing'

在這裡插入圖片描述 sql put 'student','95001','Ssex','male'

在這裡插入圖片描述

3.3 檢視資料

sql get 'student','95001'

在這裡插入圖片描述

3.4 刪除資料

在 Hbase 中用 delete 以及 deleteall 命令進行刪除資料操作 區別: delete 用於刪除一個單元格資料,是 put 的反向操作; deleteall 用於刪除一行資料

shell delete 'student','95001','Ssex' 在這裡插入圖片描述

3.5 刪除表

刪除表需要分兩步操作 第一步先讓該表不可用,第二步刪除表。 比如,要刪除student表,可以使用如下命令:

shell disable 'student'

shell drop 'student' 在這裡插入圖片描述

3.6 查詢歷史記錄

  • 先建立一個teachershell create 'teacher',{NAME=>'username',VERSIONS=>5}
  • 不斷put資料 在這裡插入圖片描述

查詢時,預設情況下回顯示當前最新版本的資料,如果要查詢歷史資料,需要指定查詢的歷史版本數,由於上面設定了儲存版本數為5,所以,在查詢時制定的歷史版本數的有效取值為1到5,具體命令如下: shell get 'teacher','91001', {COLUMN=>'username',VERSIONS=>3} 下面是查詢版本號為3的 在這裡插入圖片描述

3.7 退出HBase資料庫

sql exit 在這裡插入圖片描述

4. HBase程式設計實踐

1) 在IDEA建立專案

2) 為專案新增需要用到的JAR包

JAR包位於HBase安裝目錄下 如位於:/usr/local/hbase/lib目錄下,單擊介面中的Libraries選項卡,再單擊介面右側的Add External JARs按鈕,選中/usr/local/hbase/lib目錄下的所有JAR包,點選OK,繼續新增JAR包,選中client-facing-thirdparty下的所有JAR檔案,點選OK。

3) 編寫Java應用程式 如果程式裡面示例網址“hdfs://localhost:9000/hbase”,執行時出錯,可以把” localhost ”改成” master ”。

4) 編譯執行

4.1 程式設計題 API文件

4.1.1 第一題

在這裡插入圖片描述

利用4中的程式,建立上表:表scores的概念檢視如上圖所示 - 用學生的名字name作為行鍵(rowKey) - 年級grade是一個只有一個列的列族 - score是一個列族。 - 每一門課程都是score的一個列,如English、math、Chinese等。score 的列可以隨時新增。

新增如下資料: Name | Grade | English | Math | Chinese |--|--|--|--|--| Leelei| 6 |78| 88 |90 Dandan |6 |95 |100 |92 Sansan| 6| 67 |99 |60 Zhanshan| 6 |66 |66| 66

  • 建立表

```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import org.apache.hadoop.hbase.HBaseConfiguration; import java.io.IOException;

public class Create { public static Configuration configuration; public static Connection connection; public static Admin admin; //建立連線 public static void init(){ configuration = HBaseConfiguration.create(); configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase"); try{ connection = ConnectionFactory.createConnection(configuration); admin = connection.getAdmin(); }catch (IOException e){ e.printStackTrace(); } } //關閉連線 public static void close(){ try{ if(admin != null){ admin.close(); } if(null != connection){ connection.close(); } }catch (IOException e){ e.printStackTrace(); } }

public static void CreateTable(String tableName) throws IOException {
    if (admin.tableExists(TableName.valueOf(tableName))) {
        System.out.println("Table Exists!!!");
    }
    else{
        HTableDescriptor tableDesc = new HTableDescriptor(tableName);
        tableDesc.addFamily(new HColumnDescriptor("grade"));
        tableDesc.addFamily(new HColumnDescriptor("score"));
        tableDesc.addFamily(new HColumnDescriptor("score.english"));
        tableDesc.addFamily(new HColumnDescriptor("score.math"));
        tableDesc.addFamily(new HColumnDescriptor("score.chinese"));
        admin.createTable(tableDesc);
        System.out.println("Create Table Successfully .");
    }
}

public static void main(String[] args) {
    String tableName = "scores_zqc";
    try {
        init();
        CreateTable(tableName);
        close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} ``` 在這裡插入圖片描述

  • 插入資料

```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import java.io.IOException;

public class Insert { public static Configuration configuration; public static Connection connection; public static Admin admin; //建立連線 public static void init(){ configuration = HBaseConfiguration.create(); configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase"); try{ connection = ConnectionFactory.createConnection(configuration); admin = connection.getAdmin(); }catch (IOException e){ e.printStackTrace(); } } //關閉連線 public static void close(){ try{ if(admin != null){ admin.close(); } if(null != connection){ connection.close(); } }catch (IOException e){ e.printStackTrace(); } }

public static void InsertRow(String tableName, String rowKey, String colFamily, String col, String val) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Put put = new Put(rowKey.getBytes());
    put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
    System.out.println("Insert Data Successfully");
    table.put(put);
    table.close();
}

public static void main(String[] args) {
    String tableName = "scores_zqc";
    String[] RowKeys = {
            "dandan",
            "sansan",
    };
    String[] Grades = {
            "6",
            "6",
    };
    String[] English = {
            "95",
            "87"
    };
    String[] Math = {
            "100",
            "95",
    };
    String[] Chinese = {
            "92",
            "98",
    };
    try {
        init();
        int i = 0;
        while (i < RowKeys.length){
            InsertRow(tableName, RowKeys[i], "grade", "", Grades[i]);
            InsertRow(tableName, RowKeys[i], "score", "english", English[i]);
            InsertRow(tableName, RowKeys[i], "score", "math", Math[i]);
            InsertRow(tableName, RowKeys[i], "score", "chinese", Chinese[i]);
            i++;
        } //031904102 zqc
        close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

} ``` 在這裡插入圖片描述 - hbase shell中檢視資料

在這裡插入圖片描述

4.1.2 第二題

建立並插入相關資料後,檢視Hbase java api 文件 在ExampleForHBase 類中新增兩個個函式分別實現一個rowKey 過濾器(RowFilter)以及一個單列值過濾器(SingleColumValueFilter); 之後通過這兩個函式分別做如下查詢:

  • 插入成功 在這裡插入圖片描述

  • 查詢Zhangshan 的年級以及相關成績,列印在控制檯中並截圖。

  • 查詢數學成績低於100的所有人的名字,列印在控制檯中並截圖。

  • 插入資料 ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*;

import java.io.IOException;

public class InsertTwo { public static Configuration configuration; public static Connection connection; public static Admin admin; //建立連線 public static void init(){ configuration = HBaseConfiguration.create(); configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase"); try{ connection = ConnectionFactory.createConnection(configuration); admin = connection.getAdmin(); }catch (IOException e){ e.printStackTrace(); } } //關閉連線 public static void close(){ try{ if(admin != null){ admin.close(); } if(null != connection){ connection.close(); } }catch (IOException e){ e.printStackTrace(); } }

public static void InsertRow(String tableName, String rowKey, String colFamily, String col, String val) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tableName));
    Put put = new Put(rowKey.getBytes());
    put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());
    System.out.println("Insert Data Successfully");
    table.put(put);
    table.close();
}

public static void main(String[] args) {
    String tableName = "scores_zqc_two";
    String[] RowKeys = {
            "Leelei",
            "Dandan",
            "Sansan",
            "Zhanshan",
    };
    String[] Grades = {
            "6",
            "6",
            "6",
            "6",
    };
    String[] English = {
            "78",
            "95",
            "67",
            "66",
    };
    String[] Math = {
            "78",
            "95",
            "100",
            "66",
    };
    String[] Chinese = {
            "90",
            "92",
            "60",
            "66",
    };
    try {
        init();
        int i = 0;
        while (i < RowKeys.length){
            InsertRow(tableName, RowKeys[i], "grade", "", Grades[i]);
            InsertRow(tableName, RowKeys[i], "score", "english", English[i]);
            InsertRow(tableName, RowKeys[i], "score", "math", Math[i]);
            InsertRow(tableName, RowKeys[i], "score", "chinese", Chinese[i]);
            i++;
        }
        close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

```

在這裡插入圖片描述

  • 查詢

```java import java.io.IOException; import java.util.List;

import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; 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.client.Table; import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp; import org.apache.hadoop.hbase.filter.Filter; import org.apache.hadoop.hbase.filter.RowFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.apache.hadoop.hbase.filter.SubstringComparator; import org.apache.hadoop.hbase.util.Bytes;

public class FindTwo { public static Configuration configuration; public static Connection connection; public static Admin admin;

public static void init() {
    configuration = HBaseConfiguration.create();
    configuration.set("hbase.rootdir", "hdfs://192.168.0.108:9000/hbase");
    try {
        connection = ConnectionFactory.createConnection(configuration);
        admin = connection.getAdmin();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
public static void close() {

    try {
        if(admin !=null) {
            admin.close();
        }
        if(connection !=null) {
            connection.close();
        }
    }catch(IOException e) {
        e.printStackTrace();
    }
}

public static void findRowFilter(String tablename,String rowkey) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tablename));
    Scan scan = new Scan();
    System.out.println("RowKey: "+rowkey);
    Filter filter = new RowFilter(CompareOp.EQUAL,new SubstringComparator(rowkey));
    scan.setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    for (Result res : scanner) {
        List<Cell> cells = res.listCells();
        for (Cell cell : cells) {
            // 列印rowkey,family,qualifier,value
            System.out.println(Bytes.toString(CellUtil.cloneRow(cell))
                    + ": " + Bytes.toString(CellUtil.cloneFamily(cell))
                    + ": "+Bytes.toString(CellUtil.cloneQualifier(cell))
                    +": "+ Bytes.toString(CellUtil.cloneValue(cell)) );
        }
    }
    scanner.close();
}

public static void findSingleColumValueFilter(String tablename,String colFamily,String col) throws IOException {
    Table table = connection.getTable(TableName.valueOf(tablename));
    Scan scan = new Scan();
    System.out.println("\nthe value of math in colFamily < 100:");
    Filter filter = new SingleColumnValueFilter(Bytes.toBytes(colFamily),
            Bytes.toBytes(col),
            CompareOp.GREATER,
            Bytes.toBytes("100"));
    scan.setFilter(filter);
    ResultScanner scanner = table.getScanner(scan);
    for (Result res : scanner) {
        System.out.println("name: "+Bytes.toString(res.getRow()));
    } 
    scanner.close();
}

public static void main(String[] args) throws IOException {
    init();
    findRowFilter("scores_zqc_two","Zhanshan");
    findSingleColumValueFilter("scores_zqc_two","score","math");
    close();
}

}

```

最後

小生凡一,期待你的關注。