重溫大資料---Hbase細節剖析
這一節我能說多少說多少吧,資訊量太大。Hbase的官方文件我感覺寫的挺亂糟的,反正用起來沒有Hadoop的舒服。最終還是一個原則不會再查!
Hbase架構
Hbase Region定位
Hbase表建立
help ‘create’ 引號‘’是必須的
- namespace 名稱空間類似與資料庫的概念。ns1:t1指定ns1名稱空間下的t1表
如何建立一個名稱空間?
- create_namespace ‘ns1’
- list_namespace ‘ns1’
如何建立一張表?
{}裡寫的是列蔟的名字
- create ‘ns1:t1’, ‘cf’ = create ‘ns1:t1’, {NAME => ‘f1’}
- create ‘ns1:t2’, {NAME => ‘cf1’}, {NAME => ‘cf2’}, {NAME => ‘cf3’} = create ‘ns1:t3’, ‘cf1’, ‘cf2’, ‘cf3’
檢視某名稱空間下的表
- list_namespace_tables ‘ns1’
- describe ‘ns1:t3’
Hbase表設計
能不能再建表的時候多建幾個Region?你知道為什麼要多建幾個Region嗎?HBase 表的預分割槽?
首先我們都知道,當我們建立一張表的時候,Hbase會自動為表分配一個Region(不知道的看我前面的文章),那麼此時問題就來了,當我們需要向這張表匯入大量的資料(file/datas -> hfile -> bulk load into hbase table)的時候,RegionServer會管理Region進行split,這時候RegionServer的負載是很大的,效率變低的同時可靠性也會出現問題,所以給出如下解決方案:
解決方案:
建立表時,多建立一些Region(依據表的資料rowkey進行設計,結合業務)
五個Region
被多個RegionServer進行管理
要點:
在插入資料時,會向五個Region中分別插入對應的資料,均衡了
這也就是對Hbase表的預分割槽處理。---->Region劃分,依賴於rowkey,所謂的預分割槽就是預先預估一些rowkey。
預分割槽方法
- 方式一: create ‘bflogs’, ‘info’, SPLITS => [‘20151001000000000’, ‘20151011000000000’, ‘20151021000000000’]
- 方式一:create ‘bflogs2’, ‘info’, SPLITS_FILE => ‘/opt/datas/bflogs-split.txt’
- 方式三:create ‘t11’, ‘f11’, {NUMREGIONS => 2, SPLITALGO => ‘HexStringSplit’}
- create ‘t12’, ‘f12’, {NUMREGIONS => 4, SPLITALGO => ‘UniformSplit’}
NUMREGIONS region數量,SPLITALGO自定義的類,rowkey他給你生成不太實用。
Hbase表屬性介紹
調幾個大頭的說一說,其他的就百度去吧,反正我不懂,哈哈。
當我們 desc ‘user’ 檢視到一個表有以下屬性:
‘user’,
{
NAME => ‘info’,
DATA_BLOCK_ENCODING => ‘NONE’,
BLOOM FILTER => ‘ROW’,
REPLICATION_SCOPE => ‘0’,
VERSIONS => ‘1’,
COMPRESSION => ‘NONE’,
MIN_VERSIONS => ‘0’,
TTL => ‘FOREVER’,
KEEP_DELETED_CELLS => ‘false’,
BLOCKSIZE => ‘65536’,
IN_MEMORY => ‘false’,
BLOCKCACHE => 'true’
}
- VERSIONS —>資料版本號(多版本你懂的)
- COMPRESSION—>Hbase在hdfs上儲存的檔案壓縮格式
- IN_MEMORY BLOCKCACHE ---->快取
這也就又得說Snappy的壓縮配置了,其實我沒有去配過,所以建議大家還是看看官方文件怎麼說的吧
- hadoop checknative
檢視hadoop檔案壓縮格式
- 配置HBase
hadoop-snappy jar -> 放入到Hbase的lib目錄
-
需要將本地庫 native 放到Hbase lib下
- Hbaselib目錄下建立一個 native
- 設定軟連線 ln -s /opt/moudles/hadoop/lib/native ./Linux-amd-64
-
重啟Hbase叢集
-
設定hbase-site.xml
內容不詳細,見諒!
使用Snnapy壓縮
create ‘test2’,{NAME=>‘CF2’,COMPRESS=>‘SNAPPY’}
BLOCKCHACHE
讀->memstore->查不到->blockcache->查不到->磁碟(並且把結果放入BlockCache)blockcache採用的是LRU演算法,達到上限後回淘汰老的一批資料。
RegionServer - 12G
>> MemStore 40%
write
>> BlockCache資料快取 40%
read
>> other 20%
讀的時候會讀到快取裡面,下一次讀更快。
當用戶去讀取資料
>> MemStore
>> BlockCache -> 每個RegionServer只有一個BlockCache
>> hfile
>> meger
返回資料集
IN_MEMORY
儲存meta表元資料,如果將資料量很大的使用者表設定為inmemory的話,可能會導致meta表快取失敗,進而對整個叢集效能產生影響。
Hbase表管理
Hbase寫入資料
Hbase讀取資料
Hbase整合Hive使用
把Hbase裡面的資料拿出來給Hive分析。
兩種方式
>> 管理表
建立hive表的時候,指定資料儲存在hbase表中。
CREATE TABLE hbase_table_1(key int, value string)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:val")
TBLPROPERTIES ("hbase.table.name" = "xyz");
>> 外部表
現在已經存在一個HBase表,需要對錶中資料進行分析。
CREATE EXTERNAL TABLE hbase_user(id int, name string,age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age")
TBLPROPERTIES ("hbase.table.name" = "user");
本質:
Hive就是HBase客戶端。
是不是需要一些配置,jar包
export HBASE_HOME=/opt/modules/hbase-0.98.6-hadoop2
export HIVE_HOME=/opt/modules/hive-0.13.1/lib
ln -s $HBASE_HOME/lib/hbase-server-0.98.6-hadoop2.jar $HIVE_HOME/hbase-server-0.98.6-hadoop2.jar
ln -s $HBASE_HOME/lib/hbase-client-0.98.6-hadoop2.jar $HIVE_HOME/hbase-client-0.98.6-hadoop2.jar
ln -s $HBASE_HOME/lib/hbase-protocol-0.98.6-hadoop2.jar $HIVE_HOME/hbase-protocol-0.98.6-hadoop2.jar
ln -s $HBASE_HOME/lib/hbase-it-0.98.6-hadoop2.jar $HIVE_HOME/hbase-it-0.98.6-hadoop2.jar
ln -s $HBASE_HOME/lib/htrace-core-2.04.jar $HIVE_HOME/htrace-core-2.04.jar
ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-0.98.6-hadoop2.jar $HIVE_HOME/lib/hbase-hadoop2-compat-0.98.6-hadoop2.jar
ln -s $HBASE_HOME/lib/hbase-hadoop-compat-0.98.6-hadoop2.jar $HIVE_HOME/lib/hbase-hadoop-compat-0.98.6-hadoop2.jar
ln -s /opt/modules/hbase-0.98.6-hadoop2/lib/high-scale-lib-1.1.1.jar /opt/modules/hive-0.13.1/lib/high-scale-lib-1.1.1.jar
hive-site.xml
Hbase繼承Sqoop
示例模板
sqoop import \
--connect jdbc:mysql://master:3306/testdb\
--username root -P \
--tale customercontactinfo \
--columns "customernum,contactinfo" \
--hbase-table customercontactindo \
--column-family ContactInfo \
--hbase-row-key customernum -m 1
附錄:
部分圖文來至<<Hadoop 海量資料處理>>。
總結
總是學不會 ,再聰明一點,記得自我保護, 必要時候講些官方文件!