大資料儲存---HBase介紹(上)
本次主要介紹三部分:
- HBase簡介
- HBase整體架構
- HBase安裝和啟動
- Hbase基本操作
HBase簡介
hbase是bigtable的開源java版本,是建立在hdfs之上。 提供高可靠性、高效能、列儲存、可伸縮、實時讀寫nosql的資料庫系統。
它介於nosql和關係型資料庫之間,僅能通過主鍵(row key)和主鍵的range來檢索資料,僅支援單行事務(可通過hive支援來實現多表join等複雜操作)。 主要用來儲存結構化和半結構化的鬆散資料。
- Hbase查詢資料功能很簡單,不支援join等複雜操作,不支援複雜的事務(行級的事務)
- Bigtable 是一個稀疏的、分散式的、持久化儲存的多維度排序Map。 Map 的索引是行關鍵字、列關鍵字以及時間戳; Map 中的每個 value 都是一個未經解析的 byte 陣列。
- 與hadoop一樣,Hbase目標主要依靠橫向擴充套件,通過不斷增加廉價的商用伺服器,來增加計算和儲存能力。
便儲存資料的特點
- 大:一個表可以有上十億行,上百萬列
- 面向列:面向列(族)的儲存和許可權控制,列(族)獨立檢索。
- 稀疏:對於為空(null)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏。
與關係型資料庫的區別
- 1、行式資料庫在分析的時候,將id,name,age,sex,score;完整的資訊讀入記憶體,造成大量的記憶體和IO浪費。
- 2、列式資料庫的思維是把行式資料庫全部拆開,按照列的方式重新組合儲存,一列所有的行的資料存放在一起。帶來的好處就是,要分析男女就直接訪問所有的男女資訊,要分析銷售額,就直接訪問消費額相關的資料。
HBase的表資料結構
- 表(table):用於儲存管理資料,具有稀疏的、面向列的特點。HBase中的每一張表,就是所謂的大表(Bigtable),可以有上億行,上百萬列。對於為值為空的列,並不佔用儲存空間,因此表可以設計的非常稀疏。
- 行鍵(RowKey):類似於MySQL中的主鍵,HBase根據行鍵來快速檢索資料,一個行鍵對應一條記錄。與MySQL主鍵不同的是,HBase的行鍵是天然固有的,每一行資料都存在行鍵。
- 列族(ColumnFamily):是列的集合。列族在表定義時需要指定,而列在插入資料時動態指定。列中的資料都是以二進位制形式存在,沒有資料型別。在物理儲存結構上,每個表中的每個列族單獨以一個檔案儲存。一個表可以有多個列簇。
- 時間戳(TimeStamp):是列的一個屬性,是一個64位整數。由行鍵和列確定的單元格,可以儲存多個數據,每個資料含有時間戳屬性,資料具有版本特性。可根據版本(VERSIONS)或時間戳來指定查詢歷史版本資料,如果都不指定,則預設返回最新版本的資料。
- 區域(Region):HBase自動把表水平劃分成的多個區域,劃分的區域隨著資料的增大而增多。
HBase整體架構
-
Client
- ①使用HBase RPC機制與HMaster和HRegionServer進行通訊;
- ②Client與HMaster進行通訊進行管理類操作;
- ③Client與HRegionServer進行資料讀寫類操作。
-
Zookeeper
- ①保證任何時候,叢集中只有一個running master,避免單點問題;
- ②存貯所有Region的定址入口,包括-ROOT-表地址、HMaster地址;
- ③實時監控Region Server的狀態,將Region server的上線和下線資訊,實時通知給Master;
- ④儲存Hbase的schema,包括有哪些table,每個table有哪些column family。
-
HMaster 可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master執行。 角色功能:
- ①為Region server分配region;
- ②負責region server的負載均衡;
- ③發現失效的region serve並重新分配其上的region;
- ④GFS上的垃圾檔案回收;
- ⑤處理使用者對標的增刪改查操作。
-
HRegionServer HBase中最核心的模組,主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料。作用:
- ①維護Master分配給它的region,處理對這些region的IO請求;
- ②負責切分在執行過程中變得過大的region。
- 此外,HRegionServer管理一些列HRegion物件,每個HRegion對應Table中一個Region,HRegion由多個HStore組成,每個HStore對應Table中一個Column Family的儲存,Column Family就是一個集中的儲存單元,故將具有相同IO特性的Column放在一個Column Family會更高效。
-
HStore HBase儲存的核心,由MemStore和StoreFile組成。 使用者寫入資料的流程為:client寫入 -> 存入MemStore,一直到MemStore滿 -> Flush成一個StoreFile,直至增長到一定閾值 -> 觸發Compact合併操作 -> 多個StoreFile合併成一個StoreFile,同時進行版本合併和資料刪除 -> 當StoreFiles Compact後,逐步形成越來越大的StoreFile -> 單個StoreFile大小超過一定閾值後,觸發Split操作,把當前Region Split成2個Region,Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上,如圖所示。 HRegion 一個表最開始儲存的時候,是一個region。 一個Region中會有個多個store,每個store用來儲存一個列簇。如果只有一個column family,就只有一個store。 region會隨著插入的資料越來越多,會進行拆分。預設大小是10G一個。
-
HLog
- 在分散式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的記憶體資料就會丟失,引入HLog就是防止這種情況。
- 工作機制: 每個HRegionServer中都會有一個HLog物件,HLog是一個實現Write Ahead Log的類,每次使用者操作寫入Memstore的同時,也會寫一份資料到HLog檔案,HLog檔案定期會滾動出新,並刪除舊的檔案(已持久化到StoreFile中的資料)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog檔案,將不同region的log資料拆分,分別放到相應region目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的資料到MemStore中,然後flush到StoreFiles,完成資料恢復。
查詢路由
HBase中存有兩張特殊的表,-ROOT-和.META.。
- .META.:記錄了使用者表的Region資訊,.META.可以有多個regoin。
- -ROOT-:記錄了.META.表的Region資訊,-ROOT-只有一個region。Zookeeper中記錄了-ROOT-表的location。
Client訪問使用者資料之前需要首先訪問zookeeper,然後訪問-ROOT-表,接著訪問.META.表,最後才能找到使用者資料的位置去訪問。
HBase的安裝和基本操作
HBase的安裝
- 下載安裝
wget http://mirrors.hust.edu.cn/apache/hbase/1.3.1/hbase-1.3.1-bin.tar.gz
tar -zxvf hbase-1.3.1-bin.tar.gz -C /export/servers/
cd ../servers/
mv hbase-1.3.1 hbase
vi /etc/profile
-
export HBASE_HOME=/export/servers/hbase
export PATH=${HBASE_HOME}/bin:$PATH
-
source /etc/profile
- 修改配置檔案
- 進入配置檔案所在的目錄 cd /export/servers/hbase/conf/
- 修改第一個配置檔案 regionservers
vi regionservers
-
node02
node03
- 修改第二個配置檔案 hbase-site.xml
注意:以下配置整合的是hadoop ha叢集。
如果您的叢集沒有配置ha,hbase.rootdir 配置專案需要修改:hdfs://master:9000/hbase
vi hbase-site.xml
-
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://ns1/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/export/data/zk/</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01,node02,node03</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
</configuration>
HBASE_MANAGES_ZK=false 表示,hbase和大傢伙公用一個zookeeper叢集,而不是自己管理叢集。
vi hbase-env.sh
-
export JAVA_HOME=/export/servers/jdk
export HBASE_MANAGES_ZK=false
分發其他節點並啟動
分發配置檔案
scp -r /export/servers/hbase/ node02:/export/servers/
scp -r /export/servers/hbase/ node03:/export/servers/
啟動叢集
startzk.sh
start-dfs.sh
start-hbase.sh
HBase的基本操作
命令檔案如下 可以通過HbaseUi介面查看錶的資訊
埠60010打不開的情況,是因為hbase 1.0 以後的版本,需要自己手動配置,在檔案 hbase-site
<property>
<name>hbase.master.info.port</name>
<value>60010</value>
</property>
連線叢集
hbase shell
建立表
create 'user','base_info'
插入資料
put 'user','rowkey_10','base_info:username','張三'
put 'user','rowkey_10','base_info:birthday','2014-07-10'
put 'user','rowkey_10','base_info:sex','1'
put 'user','rowkey_10','base_info:address','北京市'
put 'user','rowkey_16','base_info:username','張小明'
put 'user','rowkey_16','base_info:birthday','2014-07-10'
put 'user','rowkey_16','base_info:sex','1'
put 'user','rowkey_16','base_info:address','北京'
put 'user','rowkey_22','base_info:username','陳小明'
put 'user','rowkey_22','base_info:birthday','2014-07-10'
put 'user','rowkey_22','base_info:sex','1'
put 'user','rowkey_22','base_info:address','上海'
put 'user','rowkey_24','base_info:username','張三丰'
put 'user','rowkey_24','base_info:birthday','2014-07-10'
put 'user','rowkey_24','base_info:sex','1'
put 'user','rowkey_24','base_info:address','河南'
put 'user','rowkey_25','base_info:username','陳大明'
put 'user','rowkey_25','base_info:birthday','2014-07-10'
put 'user','rowkey_25','base_info:sex','1'
put 'user','rowkey_25','base_info:address','西安'
查詢資料
//查詢所有資料
scan 'user'
//查詢某個列簇的資料
get 'user','rowkey_16','base_info'
get 'user','rowkey_16','base_info:username'
get 'user', 'rowkey_16', {COLUMN => ['base_info:username','base_info:sex']}
刪除表中的資料
delete 'user', 'rowkey_16', 'base_info:username'
清空資料
truncate 'user'
操作列簇
alter 'user', NAME => 'f2'
alter 'user', 'delete' => 'f2'
刪除表
disable 'user'
drop 'user'