一週一箇中介軟體-hbase

jack_zdl發表於2020-12-01

前言

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 可能無法恢復資料,沒有刷寫到硬碟的所有寫入資料都會丟失。

相關文章