前言
hbase是大數據的生態的一部分,是高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統。介於nosql和RDBMS之間。主要存儲非結構化和半結構化的松散數據。
海量數據存儲
快速隨機訪問
大量寫操作的應用
背景
我們公司現在需要一套監控系統,並且需要存儲一系列的用戶訪問數據,這些數據很松散,現在看起來無關緊要的數據但是確實潛在的用戶行為數據。之后會幫助我們分心用戶行為,為我們提供個性化數據作為依據。
在綜合現在主流的監控系統,cat,pinpoint,zikpin,SkyWalking等監控系統。我們選擇了pinpoint這個基於字節碼注入的調用鏈分析。所消耗的性能低,無代碼侵入性。但是搭建pinpoint時,需要使用hbase作為存儲數據的數據庫。
知識准備
- region
RegionServer.理解為數據節點,存儲數據的
region服務器的內存主要服務於內部數據結構。你需要64位操作系統和使用大於4G的內存空間。
-
架構圖
-
HMater
HMaster是Master Server的實現,負責監控集群中的RegionServer實例,同時是所有metadata改變的接口,在集群中,通常運行在NameNode上面。master機器不需要大存儲空間,不需要掛載過多的磁盤。由於master的重要性大於slalve。可以通過冗余提升硬件可用率。
master機器要運行NameNode,SecondaryNameNode,JobTRacker和HBase Master.800TB數據推薦24G內存。
- slave
HBase的RegionServer.slave機器要使用DataNode,TaskTracker和HBase RegionServer.800TB數據推薦24G內存以上配置。
- hbase使用的文件系統
本地模式: hbase可以不使用HDFS或者其他集群。使用FileSystem類連接到文件系統實現。Hadoop客戶端加載並使用hadoop提供ChecksumFileSystem類直接操作本地磁盤路徑來存儲所有的路徑。
參數 file:///
HDFS模式: 是默認的文件系統,Hbase選擇HDFS作為文件系統。
hdfs://😕
- hbase集群
單機模式
分布式模式
hbase的主從架構,hmaster作為主節點,hregionServer作為從節點。
宕機分為 HMaster 宕機和 HRegisoner 宕機,如果是HRegisoner 宕機, HMaster 會將其所管理的 region 重新分布到其他活動的
RegionServer 上.
由於數據和日志都持久在 HDFS中,該操作不會導致數據丟失。所以數據的一致性和安全性是有保障的。
如果是 HMaster 宕機, HMaster 沒有單點問題.
HBase 中可以啟動多個 HMaster,通過Zookeeper 的 Master Election 機制保證總有一個 Master 運行。
即 ZooKeeper 會保證總會有一個 HMaster 在對外提供服務
參考文獻
HBase權威指南(中文版) 提取碼: nisk
HBase安裝包 hbase-2.2.1-bin.tar提取碼:utts
安裝
單機安裝和分布式安裝。
在linux服務器中指定位置 wget http://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.2.1/hbase-2.2.1-src.tar.gz 。
編輯conf/hbase-env.sh文件指定運行HBase的java環境。
export JAVA_HOME=/usr/bin/java
export HBASE_MANAGES_ZK=true 將zookeeper設置true(true使用hbase自帶的zk,false使用自己安裝的zk)
修改配置hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:////root/hbase-2.2.1-Data/HbaseData</value>
</property>
<!-- hbase zookeeper數據存儲地址 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/root/hbase-2.2.1-Data/zkData</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- zookeeper集群的地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>47.105.153.163</value>
</property>
<!-- zookeeper集群的端口 -->
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2183</value>
</property>
</configuration>
執行命令行 ./start-hbase.sh > console.out &
單機下這就已經就可以啟動了。
- 問題1
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately
using -XX:ParallelGCThreads=N
可能因為服務器內存不足。
下面是介紹集群環境下的hbase的環境的安裝。
conf/hbase-site.xml指定使用HDFS的/hbase目錄作為根目錄。HDFS的端口9000,數據只保留一個副本。
hbase shell是hbase的命令行腳本
hbase原理
- hbase實時查詢
可以認為是從內存中查詢的,HBase的機制就是將數據先寫入內存中,當數據量到達一定的量(128m),在寫入磁盤。,在內存中,是不進行數據的更新或者合並操作,只增加數據,使得用戶寫操作進入內存就可以立即返回。保證hbase的I/O的高性能。
- hbase合並文件
Compact操作。當hbase中每當memstore數據flush到硬盤,形成storefile,當storefile的數量達到一定程度后,需要將storefile文件compact操作。
compact操作:1 合並文件 2清除過期,多版本的數據 3 提高讀寫數據的效率
二種方式 minor操作。和major操作。
Minor 操作只用來做部分文件的合並操作以及包括 minVersion=0 並且設置 ttl 的過期版本清理,不做任何刪除數據、多版本數據的清理工作。
Major 操作是對 Region 下的 HStore 下的所有 StoreFile 執行合並操作,最終的結果是整理合並出一個文件。簡述 Hbase filter 的實現原理是什么?結合實際項目經驗,寫出幾個使用 filter 的場景HBase 為篩選數據提供了一組過濾器,通過這個過濾器可以在 HBase 中的數據的多個維度(行,列,數據版本)上進行對數據的篩選操作,也就是說過濾器最終能夠篩選的數據能夠細化到具體的一個存儲單元格上(由行鍵,列名,時間戳定位)。 RowFilter、 PrefixFilter。。。hbase的filter是通過scan設置的,所以是基於scan的查詢結果進行過濾.過濾器的類型很多,但是可以分為兩大類——比較過濾器,專用過濾器過濾器的作用是在服務端判斷數據是否滿足條件,然后只將滿足條件的數據返回給客戶端;如在進行訂單開發的時候,我們使用rowkeyfilter過濾出某個用戶的所有訂單
- hbase機制
在 HBase 中無論是增加新行還是修改已有行,其內部流程都是相同的。 HBase 接到命令后存下變化信息,或者寫入失敗拋出異常。默認情況下,執行寫入時會寫到兩個地方:預寫式日志(write-ahead log,也稱 HLog)和 MemStore。 HBase 的默認方式是把寫入動作記錄在這兩個地方,以保證數據持久化。只有當這兩個地方的變化信息都寫入並確認后,才認為寫動作完成。MemStore 是內存里的寫入緩沖區, HBase 中數據在永久寫入硬盤之前在這里累積。當MemStore 填滿后,其中的數據會刷寫到硬盤,生成一個 HFile。 HFile 是 HBase 使用的底層存儲格式。 HFile 對應於列族,一個列族可以有多個 HFile,但一個 HFile 不能存儲多個列族的數據。在集群的每個節點上,每個列族有一個 MemStore。大型分布式系統中硬件故障很常見, HBase 也不例外。設想一下,如果 MemStore 還沒有刷寫,服務器就崩潰了,內存中沒有寫入硬盤的數據就會丟失。 HBase 的應對辦法是在寫動作完成之前先寫入 WAL。 HBase 集群中每台服務器維護一個 WAL 來記錄發生的變化。WAL 是底層文件系統上的一個文件。直到 WAL 新記錄成功寫入后,寫動作才被認為成功完成。這可以保證 HBase 和支撐它的文件系統滿足持久性。大多數情況下, HBase 使用Hadoop 分布式文件系統(HDFS)來作為底層文件系統。如果 HBase 服務器宕機,沒有從 MemStore 里刷寫到 HFile 的數據將可以通過回放WAL 來恢復。你不需要手工執行。 Hbase 的內部機制中有恢復流程部分來處理。每台HBase 服務器有一個 WAL,這台服務器上的所有表(和它們的列族)共享這個 WAL。你可能想到,寫入時跳過 WAL 應該會提升寫性能。但我們不建議禁用 WAL,除非你願意在出問題時丟失數據。如果你想測試一下,如下代碼可以禁用 WAL: 注意:不寫入 WAL 會在 RegionServer 故障時增加丟失數據的風險。關閉 WAL,出現故障時 HBase 可能無法恢復數據,沒有刷寫到硬盤的所有寫入數據都會丟失。