1. 程式人生 > >資料倉庫元件:HBase叢集環境搭建和應用案例

資料倉庫元件:HBase叢集環境搭建和應用案例

本文原始碼:[GitHub](https://github.com/cicadasmile/big-data-parent) || [GitEE](https://gitee.com/cicadasmile/big-data-parent) # 一、Hbase簡介 **1、基礎描述** Hadoop原生的特點是解決大規模資料的離線批量處理場景,HDFS具備強大儲存能力,但是並沒有提供很強的資料查詢機制。HBase元件則是基於HDFS檔案系統之上提供類似於BigTable服務。 HBase是一種分散式、可擴充套件、支援海量結構化資料儲存的NoSQL資料庫。HBase在Hadoop之上提供了類似於Bigtable的能力,基於列儲存模式的而不是基於行的模式。儲存資料特點:非結構化或者鬆散的半結構化資料,儲存大表自然是需要具備水平擴充套件的能力,基於服務叢集處理海量龐大資料。 **2、資料模型** 基於Hbase的資料結構的基本描述; - 表-Table:由行和列組成,列劃分為若干個列族; - 行-Row:行鍵(Key)作標識,行代表資料物件; - 列族:列族支援動態擴充套件,以字串形式儲存; - 列標識:列族中的資料通過列識別符號來定位; - 單元格:行鍵,列族,列識別符號共同確定一個單元; - 單元資料:儲存在單元裡的資料稱為單元資料; - 時間戳:預設基於時間戳來進行版本標識; HBase的資料模型同關係型資料庫很類似,資料儲存在一張表中,有行有列。但從HBase的底層物理儲存結構看更像是Map(K-V)集合。 - 資料管理是基於列儲存的特點; - 簡單的資料模型,內容儲存為字串; - 沒有複雜的表關係,簡單的增刪查操作; 從整體上看資料模型,HBase是一個稀疏、多維度、排序的對映表,這張表的索引是行鍵、列族、列限定符和時間戳每個值是一個未經解釋的字串。 # 二、搭建叢集環境 **1、解壓檔案** ``` tar -zxvf hbase-1.3.1-bin.tar.gz ``` **2、配置環境變數** ``` vim /etc/profile export HBASE_HOME=/opt/hbase-1.3.1 export PATH=$PATH:$HBASE_HOME/bin source /etc/profile ``` **3、配置:hbase-env** ``` vim /opt/hbase-1.3.1/conf/hbase-env.sh export JAVA_HOME=/opt/jdk1.8 export HBASE_MANAGES_ZK=false ``` **4、配置:hbase-site** ```xml vim /opt/hbase-1.3.1/conf/hbase-site.xml ``` **5、配置:regionservers** ``` vim /opt/hbase-1.3.1/conf/regionservers hop01 hop02 hop03 ``` **6、配置:軟連線** 軟連線hadoop配置檔案到HBase ``` ln -s /opt/hadoop2.7/etc/hadoop/core-site.xml /opt/hbase-1.3.1/conf/core-site.xml ln -s /opt/hadoop2.7/etc/hadoop/hdfs-site.xml /opt/hbase-1.3.1/conf/hdfs-site.xml ``` **7、同步叢集服務環境** 也可以手動配置叢集,或者使用同步命令。 ``` xsync hbase/ ``` **8、啟動叢集** 在hop01節點啟動即可。 ``` /opt/hbase-1.3.1/bin/start-hbase.sh ``` 啟動日誌: ``` hop03: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop03.out hop02: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop02.out hop01: starting regionserver, logging to /opt/hbase-1.3.1/bin/../logs/hbase-root-regionserver-hop01.out ``` **9、檢視狀態** ``` jps HMaster:主節點 HRegionServer:分割槽節點 ``` **10、停止叢集** 在hop01節點停止即可。 ``` /opt/hbase-1.3.1/bin/stop-hbase.sh ``` **11、檢視介面** ``` http://hop01:16010 ``` ![](https://img2020.cnblogs.com/blog/1691717/202101/1691717-20210110223421815-888147579.png) # 三、基礎Shell命令 **1、切入客戶端** ``` /opt/hbase-1.3.1/bin/hbase shell ``` **2、查看錶** ``` hbase(main):002:0> list ``` **3、建立表** ``` hbase(main):003:0> create 'user','info' 0 row(s) in 2.7910 seconds => Hbase::Table - user ``` **4、查看錶結構** ``` hbase(main):010:0> describe 'user' ``` **5、新增資料** ``` put 'user','id01','info:name','tom' put 'user','id01','info:age','18' put 'user','id01','info:sex','male' put 'user','id02','info:name','jack' put 'user','id02','info:age','20' put 'user','id02','info:sex','female' ``` **6、查看錶資料** ``` hbase(main):010:0> scan 'user' ROW COLUMN+CELL id01 column=info:age, timestamp=1594448524308, value=18 id01 column=info:name, timestamp=1594448513534, value=tom id01 column=info:sex, timestamp=1594448530817, value=male id02 column=info:age, timestamp=1594448542631, value=20 id02 column=info:name, timestamp=1594448536520, value=jack id02 column=info:sex, timestamp=1594448548005, value=female ``` 這些表結構和資料會在叢集之間自動同步。 **7、查詢指定列** ``` hbase(main):012:0> get 'user','id01' COLUMN CELL info:age timestamp=1594448524308, value=18 info:name timestamp=1594448513534, value=tom info:sex timestamp=1594448530817, value=male ``` **8、統計行數** ``` hbase(main):013:0> count 'user' ``` **9、刪除行資料** ``` hbase(main):014:0> deleteall 'user','id02' ``` **10、清空表資料** ``` hbase(main):016:0> truncate 'user' ``` **11、刪除表** ``` hbase(main):018:0> disable 'user' hbase(main):019:0> drop 'user' ``` # 四、JDBC基礎查詢 **1、核心依賴** ```xml ``` **2、基礎配置** 這裡連線zookeeper叢集地址即可。 ``` zookeeper: address: 叢集地址Url,逗號分隔 ``` 編寫HBase配置和常用工具方法。 ```java @Component public class HBaseConfig { private static String address; private static final Object lock=new Object(); public static Configuration configuration = null; public static ExecutorService executor = null; public static Connection connection = null; /** * 獲取連線 */ public static Connection getConnection(){ if(null == connection){ synchronized (lock) { if(null == connection){ configuration = new Configuration(); configuration.set("hbase.zookeeper.quorum", address); try { executor = Executors.newFixedThreadPool(10); connection = ConnectionFactory.createConnection(configuration, executor); } catch (Exception e) { e.printStackTrace(); } } } } return connection; } /** * 獲取 HBaseAdmin */ public static HBaseAdmin getHBaseAdmin(){ HBaseAdmin admin = null; try{ admin = (HBaseAdmin)getConnection().getAdmin(); }catch(Exception e){ e.printStackTrace(); } return admin; } /** * 獲取 Table */ public static Table getTable(TableName tableName) { Table table = null ; try{ table = getConnection().getTable(tableName); }catch(Exception e){ e.printStackTrace(); } return table ; } /** * 關閉資源 */ public static void close(HBaseAdmin admin,Table table){ try { if(admin!=null) { admin.close(); } if(table!=null) { table.close(); } } catch (IOException e) { e.printStackTrace(); } } @Value("${zookeeper.address}") public void setAddress (String address) { HBaseConfig.address = address; } } ``` **3、查詢案例** 查詢資料參考上述全表掃描結果: ```java @RestController public class HBaseController { /** * 掃描全表 */ @GetMapping("/scanTable") public String scanTable () throws Exception { Table table = HBaseConfig.getTable(TableName.valueOf("user")); try { ResultScanner resultScanner = table.getScanner(new Scan()); for (Result result : resultScanner) { printResult(result); } } finally { HBaseConfig.close(null, table); } return "success"; } /** * 根據RowKey掃描 */ @GetMapping("/scanRowKey") public void scanRowKey() throws Exception { String rowKey = "id02"; Table table = HBaseConfig.getTable(TableName.valueOf("user")); try { Result result = table.get(new Get(rowKey.getBytes())); printResult(result); } finally { HBaseConfig.close(null, table); } } /** * 輸出 Result */ private void printResult (Result result){ Navi