简单的HBase实践
簡單的HBase實踐
文章目錄
- 簡單的HBase實踐
- 操作環境
- HBase常用shell命令
- 使用HBase的shell命令
- 命令行啟動HBase并預置數據
- 1.列出 HBase 中所有的表
- 2.打印出指定的表的所有記錄數據
- 3.向已經創建好的表添加和刪除指定的列族或列
- 4.清空指定的表的所有記錄數據
- 5.統計表的行數
- HBase常用JavaAPI
- 使用HBase的JavaAPI
- 創建工程并導入JAR包
- 編寫Java程序
- 運行程序
- 參考文章
操作環境
- 操作系統:Ubuntu 16.04
- JDK 版本:1.8
- Hadoop 版本:Hadoop 3.1.3
- HBase 版本: HBase 2.2.4
- Java IDE:Eclipse
我的 HBase安裝目錄是“/usr/local/hbase”,環境變量 HBASE_HOME也是這個目錄,啟動HBase時請記得轉換為自己的 Hbase安裝目錄。Hadoop的安裝目錄是“/usr/local/hadoop”,同理進行操作。
HBase常用shell命令
| create | create ‘表名’, ‘列族名1’, ‘列族名2’, 列族名N’ | 創建表 |
| list | list | 列出 HBase中所有的表 |
| put | 向表、行、列指定的單元格添加數據 | |
| get | 通過指定表名、行、列、時間戳等獲得相應單元格的值 | |
| scan | 通過對表的掃描獲取對應數據 | |
| count | count ‘表名’ | 統計表中的行數 |
| alter | 修改列族模式 | |
| delete | delete ‘表名’, ‘行’, ‘列族:列’ | 刪除指定單元格的數據 |
| deleteall | deleteall ‘表名’, ‘行’ | 刪除指定行的所有元素值 |
| enable/disable | enable/disable ‘表名’ | 使表有效或無效 |
| drop | drop ‘表名’ | 刪除表。在刪除某個表之前,必須先使其無效 |
| truncate | truncate ‘表名’ | 使表無效,刪除該表,然后重新建立表 |
| exists | exists ''表名 | 判斷表是否存在 |
| describe | describe ‘表名’ | 顯示表的相關信息 |
| version | version | 查看 HBase版本信息 |
| status | status | 查看 HBase集群狀態信息 |
| help | help ‘命令名’ | 顯示該命令的使用描述 |
| exit | exit | 退出 HBase Shell |
創建表時只需要指定列族名稱,不需要指定列名。以下兩種命令等價:
- 創建表 test1,3個列族為 t1、t2、t3
- create ‘test1’, {NAME=>‘t1’}, {NAME=>‘t2’}, {NAME=>‘t3’}
- create ‘test1’, ‘t1’, ‘t2’, ‘t3’
alter命令可以刪除列族或列時,以下兩種命令等價:
- alter ‘test1’, {NAME=>‘t3’, METHOD=>‘delete’}
- alter ‘test1’, ‘delete’=>‘t3’
如果忘記了某一個命令的使用方法,又不想去翻閱資料產看,千萬記得我們可以使用 help命令來查看 xxx命令的使用方法。
使用HBase的shell命令
命令行啟動HBase并預置數據
首先,我們需要通過命令行啟動 HDFS和 HBase進程
這里強調一下,一定要先啟動 HDFS,再啟動 HBase。
//啟動HDFS cd $HADOOP_HOME ./sbin/start-dfs.sh//啟動HBase cd $HBASE_HOME ./bin/start-hbase.sh兩者都啟動完成后我們可以輸入 jps指令來查看進程,如果存在以下 6個進程則證明啟動成功。
- DataNode
- NameNode
- SecondaryNamenode
- HMaster
- HRegionServer
- HQuorumPeer
輸入命令進入 shell環境
./bin/hbase shell在使用 shell命令操作之前,我們先往 HBase中預置一些數據,方便接下來的使用。我們通過 create命令創建兩張表‘test1’、“test2”,并使用 put命令插入一些數據(每次只能添加一個單元格)。
create 'test1', 'id', 'name' create 'test2', 'name', 'age'put 'test1', '100', 'id', '20200406' put 'test1', '100', 'name', 'zhangyisan' put 'test1', '101', 'id', '20200407' put 'test1', '101', 'name', 'zhangersan' put 'test1', '102', 'id', '20200408' put 'test1', '102', 'name', 'zhangsansan'put 'test2', '100', 'name', 'zhangyisan' put 'test2', '100', 'age', '20' put 'test2', '101', 'name', 'zhangersan' put 'test2', '101', 'age', '21' put 'test2', '102', 'name', 'zhangsansan' put 'test2', '102', 'age', '22'1.列出 HBase 中所有的表
我們想知道所有的表,可以使用 list命令查看所有的表。
list如果想查看某一張表的詳細信息,可以使用 describe命令
describe 'test1' describe 'test2'2.打印出指定的表的所有記錄數據
我們使用 scan命令可以查看某一張表的所有記錄數據
scan 'test1' //掃描test1表如果要查看某一張表某一列族的數據,scan命令同樣適用
scan 'test1', {COLUMN=>'id'} //查看test1表“id”列族的數據如果要查詢某個行鍵的數據,我們可以使用 get命令
get 'test1', '100' //查看test1表行鍵“100”的數據3.向已經創建好的表添加和刪除指定的列族或列
我們可以使用 alter命令直接添加列族
alter 'test1', 'address' //添加列族address同理,alter命令也可以直接刪除列族
alter 'test1', 'delete'=>'address' //刪除列族addressHBase中不需要針對列族新建一個列名,在插入數據時直接指定列名,系統會自動創建這個列
put 'test1', '100', 'id:num', '2020' //向表test1中行“100”列“id:num”對應單元格插入數據要刪除列族的某個列時,用 delete 命令刪除這個列即可,使用和 put 類似
delete 'test1', '100', 'id:num' //刪除剛才建立的新列“id:num”4.清空指定的表的所有記錄數據
要清楚表中的所有數據,我們不必去挨個刪除,直接使用 truncate命令。truncate本身的作用就相當于所有的數據清除。
我們清空 test2表的數據并使用 scan命令查看
truncate 'test2' scan 'test2'5.統計表的行數
統計表的行數非常簡單,直接使用 count命令即可
count 'test1'HBase常用JavaAPI
Shell命令和 JavaAPI得到的效果都相同的,具體是采用 Shell還是 JavaAPI,一般的選擇方法是自己使用哪個效率高就采用哪個,仁者見仁智者見智。
| org.apache.hadoop.hbase.HBaseConfiguration | 用于管理HBase的配置信息 |
| org.apache.hadoop.hbase.client.Admin | 一個接口,用于管理HBase數據庫的表信息,包括創建或刪除表、列出表項、檢查HBase運行狀態等。不可以直接用該接口實例化一個對象,而必須調用Connection.getAdmin()方法返回一個Admin的子對象,用這個Admin接口操作返回的子對象方法。 |
| org.apache.hadoop.hbase.client.Table | 一個接口,用于和HBase進行通信。不可以直接用該接口實例化一個對象,而必須調用Connection.getTable()方法返回一個Table的子對象,用這個Table接口操作返回的子對象方法。在多線程環境下,建議使用HTablePool。 |
| org.apache.hadoop.hbase.HTableDescriptor | 包含了HBase表格的詳細信息,例如該表的列族、該表是否只讀、MemStore的最大空間等 |
| org.apache.hadoop.hbase.HColumnDescriptor | 包含了列族的詳細信息,例如列族的版本號、壓縮設置等。HColumnDescriptor通常在添加列族或者創建表時使用 |
| org.apache.hadoop.hbase.client.Put | 用來對單元格執行添加數據操作 |
| org.apache.hadoop.hbase.client.Get | 用來獲取單行/單元格的信息 |
| org.apache.hadoop.hbase.client.Scan | 可以利用Scan來限定需要查找的數據,例如列族版本號、起始行號、終止行號、返回值的數量上限等 |
| org.apache.hadoop.hbase.client.Result | 用來存放Get或Scan操作后的查詢結果,并以<key,value>的形式存儲在map中 |
使用HBase的JavaAPI
我們使用 JavaAPI來完成和 shell同樣的五個任務,在使用之前記得通過命令行啟動 HDFS和 HBase。
創建工程并導入JAR包
啟動 Eclipse,在菜單欄選擇 “File”->“New”->“Java Project”,創建新的 Java項目。
工程名字我們輸入“HBase_Practice”,JRE部分選擇“Use a project specific JRE”,使用我們自己安裝的 JDK版本。然后點擊“next”,進入下一步。
接著,選中標題欄的“Libraries”,點擊“Add Externtal JARs”
我們需要向 Java工程中添加以下 JAR包:
- “/usr/local/hbase/lib”目錄下的所有 JAR包,不包括
client-facing-thirdparty、ruby、shaded-clients和zkcli這四個文件夾。 - “/usr/local/hbase/lib/client-facing-thirdparty”目錄下的所有 JAR包
所需的 JAR包全部添加完畢以后,我們點擊右下角的“Finish”,完成 Java工程的創建。
然后,我們到“/usr/local/hadoop/etc/hadoop”目錄,復制 log4j.properties文件復制到項目的 bin文件夾下,環境就配置完畢了。
編寫Java程序
新建一個 Java程序,命名為“HBaseTest”。
我們通過 Java程序向 HBase中創建一個學生表 student,用來存儲學生姓名和考試成績。假設學生姓名不重復,我們將其作為行鍵,考試成績是一個列族,分別存儲了各個科目的成績。
這個 Java程序主要實現三點功能
- 向 HBase中創建表
- 向表中添加單元格數據
- 瀏覽表中單元格數據
我們分五個步驟實現:
在操作 HBase數據庫之前,我們需要建立和 HBase的連接。這里我們采用 HDFS來存儲數據,把“hbase.rootdir”參數的值設置為“hdfs://localhost:9000/hbase”。
如果想使用本地磁盤來存儲,將參數的值設置為“file:///本地目錄/hbase”。
public static void connect() {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 createTable(String myTableName, String[] colFamily) throws IOException{TableName tableName = TableName.valueOf(myTableName);if(admin.tableExists(tableName)) {System.out.println("table is exists!");}else {TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);for(String str: colFamily) {ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();tableDescriptor.setColumnFamily(family);}admin.createTable(tableDescriptor.build());} }HBase采用“四維坐標”來定位數據,即行鍵、列族、列限定符、時間戳。時間戳可以由系統自動生成,這里我們給出行鍵、列族、列限定符和待插入的數據即可。
public static void insertData(String tableName, String rowKey, String colFamily, String col, String value) throws IOException{Table table = connection.getTable(TableName.valueOf(tableName));Put put = new Put(rowKey.getBytes());put.addColumn(colFamily.getBytes(), col.getBytes(), value.getBytes());table.put(put);table.close(); }瀏覽數據時,我們給出行鍵、列族、列限定符即可。
public static void getData(String tableName, String rowKey, String colFamily, String col) throws IOException{Table table = connection.getTable(TableName.valueOf(tableName));Get get = new Get(rowKey.getBytes());get.addColumn(colFamily.getBytes(), col.getBytes());Result result = table.get(get);System.out.println(new String(result.getValue(colFamily.getBytes(), col==null?null:col.getBytes())));table.close(); }我們對 HBase的操作結束之后,需要關閉連接
public static void close() {try {if(admin != null) {admin.close();}if(connection != null) {connection.close();}} catch (IOException e) {e.printStackTrace();} }總體代碼如下
import java.io.IOException;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.util.Bytes;public class HBaseTest {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void connect() {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(connection != null) {connection.close();}} catch (IOException e) {e.printStackTrace();}}public static void createTable(String myTableName, String[] colFamily) throws IOException{TableName tableName = TableName.valueOf(myTableName);if(admin.tableExists(tableName)) {System.out.println("table is exists!");}else {TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);for(String str: colFamily) {ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build();tableDescriptor.setColumnFamily(family);}admin.createTable(tableDescriptor.build());}}public static void insertData(String tableName, String rowKey, String colFamily, String col, String value) throws IOException{Table table = connection.getTable(TableName.valueOf(tableName));Put put = new Put(rowKey.getBytes());put.addColumn(colFamily.getBytes(), col.getBytes(), value.getBytes());table.put(put);table.close();}public static void getData(String tableName, String rowKey, String colFamily, String col) throws IOException{Table table = connection.getTable(TableName.valueOf(tableName));Get get = new Get(rowKey.getBytes());get.addColumn(colFamily.getBytes(), col.getBytes());Result result = table.get(get);System.out.println(new String(result.getValue(colFamily.getBytes(), col==null?null:col.getBytes())));table.close();}public static void main(String[] args) throws IOException{connect();createTable("student", new String[] {"score"});insertData("student", "Alice", "score", "English", "69");insertData("student", "Alice", "score", "Math", "86");insertData("student", "Alice", "score", "Computer", "92");getData("student", "Alice", "score", "Math");close();} }運行程序
我們在 Eclipse中運行這個 Java程序,可以在控制臺的輸出信息中看到 Alice的數學成績為 86。
這時,我們可以打開命令行,進入 HBase Shell環境,查看 student表是否創建成功。
list接著,查看 student表中的數據
scan 'student'輸入 exit退出 HBase Shell環境后,我們關閉 HBase。
記住,要先關閉 HBase,后關閉 HDFS。
//關閉HBase cd $HBASE_HOME ./bin/stop-hbase.sh//關閉HDFS cd $HADOOP_HOME ./sbin/stop-dfs.sh參考文章
書籍“大數據原理與應用”
HBase Shell命令大全
HBase2.2.2安裝和編程實踐指南
總結
以上是生活随笔為你收集整理的简单的HBase实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode5382. HTML 实
- 下一篇: Ubuntu16.04在线安装Mongo