1. 程式人生 > >重溫大資料---Hbase細節剖析

重溫大資料---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 海量資料處理>>。

總結

總是學不會 ,再聰明一點,記得自我保護, 必要時候講些官方文件!