一週一箇中間件-hbase

前言

hbase是大數據的生態的一部分,是高可靠性、高性能、列存儲、可伸縮、實時讀寫的數據庫系統。介於nosql和RDBMS之間。主要存儲非結構化和半結構化的鬆散數據。java

海量數據存儲
快速隨機訪問
大量寫操做的應用linux

背景

咱們公司如今須要一套監控系統,而且須要存儲一系列的用戶訪問數據,這些數據很鬆散,如今看起來可有可無的數據可是確實潛在的用戶行爲數據。以後會幫助咱們分心用戶行爲,爲咱們提供個性化數據做爲依據。
在綜合如今主流的監控系統,cat,pinpoint,zikpin,SkyWalking等監控系統。咱們選擇了pinpoint這個基於字節碼注入的調用鏈分析。所消耗的性能低,無代碼侵入性。可是搭建pinpoint時,須要使用hbase做爲存儲數據的數據庫。sql

知識準備

  • region

RegionServer.理解爲數據節點,存儲數據的
region服務器的內存主要服務於內部數據結構。你須要64位操做系統和使用大於4G的內存空間。shell

  • 架構圖
    數據庫

  • HMaterapache

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 可能沒法恢復數據,沒有刷寫到硬盤的全部寫入數據都會丟失。

相關文章
相關標籤/搜索