一、基礎描述git
Hadoop原生的特色是解決大規模數據的離線批量處理場景,HDFS具有強大存儲能力,可是並無提供很強的數據查詢機制。HBase組件則是基於HDFS文件系統之上提供相似於BigTable服務。github
HBase是一種分佈式、可擴展、支持海量結構化數據存儲的NoSQL數據庫。HBase在Hadoop之上提供了相似於Bigtable的能力,基於列存儲模式的而不是基於行的模式。存儲數據特色:非結構化或者鬆散的半結構化數據,存儲大表天然是須要具有水平擴展的能力,基於服務集羣處理海量龐大數據。算法
二、數據模型spring
基於Hbase的數據結構的基本描述;shell
HBase的數據模型同關係型數據庫很相似,數據存儲在一張表中,有行有列。但從HBase的底層物理存儲結構看更像是Map(K-V)集合。數據庫
從總體上看數據模型,HBase是一個稀疏、多維度、排序的映射表,這張表的索引是行鍵、列族、列限定符和時間戳每一個值是一個未經解釋的字符串。apache
一、解壓文件編程
tar -zxvf hbase-1.3.1-bin.tar.gz
二、配置環境變量vim
vim /etc/profile export HBASE_HOME=/opt/hbase-1.3.1 export PATH=$PATH:$HBASE_HOME/bin source /etc/profile
三、配置:hbase-env
vim /opt/hbase-1.3.1/conf/hbase-env.sh export JAVA_HOME=/opt/jdk1.8 export HBASE_MANAGES_ZK=false
四、配置:hbase-site
vim /opt/hbase-1.3.1/conf/hbase-site.xml <configuration> <!--HDFS存儲--> <property> <name>hbase.rootdir</name> <value>hdfs://hop01:9000/HBase</value> </property> <!--開啓集羣--> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 端口 --> <property> <name>hbase.master.port</name> <value>16000</value> </property> <!--ZK集羣--> <property> <name>hbase.zookeeper.quorum</name> <value>hop01,hop02,hop03</value> </property> <!--ZK數據--> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/data/zookeeper/data/</value> </property> </configuration>
五、配置:regionservers
vim /opt/hbase-1.3.1/conf/regionservers hop01 hop02 hop03
六、配置:軟鏈接
軟鏈接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
七、同步集羣服務環境
也能夠手動配置集羣,或者使用同步命令。
xsync hbase/
八、啓動集羣
在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
九、查看狀態
jps HMaster:主節點 HRegionServer:分區節點
十、中止集羣
在hop01節點中止便可。
/opt/hbase-1.3.1/bin/stop-hbase.sh
十一、查看界面
http://hop01:16010
一、切入客戶端
/opt/hbase-1.3.1/bin/hbase shell
二、查看錶
hbase(main):002:0> list
三、建立表
hbase(main):003:0> create 'user','info' 0 row(s) in 2.7910 seconds => Hbase::Table - user
四、查看錶結構
hbase(main):010:0> describe 'user'
五、添加數據
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'
六、查看錶數據
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
這些表結構和數據會在集羣之間自動同步。
七、查詢指定列
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
八、統計行數
hbase(main):013:0> count 'user'
九、刪除行數據
hbase(main):014:0> deleteall 'user','id02'
十、清空表數據
hbase(main):016:0> truncate 'user'
十一、刪除表
hbase(main):018:0> disable 'user' hbase(main):019:0> drop 'user'
一、核心依賴
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>1.3.1</version> </dependency>
二、基礎配置
這裏鏈接zookeeper集羣地址便可。
zookeeper: address: 集羣地址Url,逗號分隔
編寫HBase配置和經常使用工具方法。
@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; } }
三、查詢案例
查詢數據參考上述全表掃描結果:
@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){ NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap(); Set<Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>>> set = map.entrySet(); for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry : set) { Set<Map.Entry<byte[], NavigableMap<Long, byte[]>>> entrySet = entry.getValue().entrySet(); for (Map.Entry<byte[], NavigableMap<Long, byte[]>> entry2 : entrySet) { System.out.print(new String(result.getRow())); System.out.print("\t"); System.out.print(new String(entry.getKey())); System.out.print(":"); System.out.print(new String(entry2.getKey())); System.out.print(" value = "); System.out.println(new String(entry2.getValue().firstEntry().getValue())); } } } }
GitHub·地址 https://github.com/cicadasmile/big-data-parent GitEE·地址 https://gitee.com/cicadasmile/big-data-parent
推薦閱讀:編程體系整理
序號 | 項目名稱 | GitHub地址 | GitEE地址 | 推薦指數 |
---|---|---|---|---|
01 | Java描述設計模式,算法,數據結構 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
02 | Java基礎、併發、面向對象、Web開發 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆ |
03 | SpringCloud微服務基礎組件案例詳解 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆ |
04 | SpringCloud微服務架構實戰綜合案例 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
05 | SpringBoot框架基礎應用入門到進階 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆ |
06 | SpringBoot框架整合開發經常使用中間件 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
07 | 數據管理、分佈式、架構設計基礎案例 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |
08 | 大數據系列、存儲、組件、計算等框架 | GitHub·點這裏 | GitEE·點這裏 | ☆☆☆☆☆ |