1. 程式人生 > >7.HBase_應用_表設計

7.HBase_應用_表設計

HBase的namespace中存放tables。預設情況下:

  • default:未指定名稱空間建立的表,都在此名稱空間下存放。
  • hbase:系統的命令空間,主要存放:meta表、名稱空間。

1.多個列族和設定屬性

# 建立名稱空間
create_namespace 'ns1'
# 檢視名稱空間
list_namespace
# 建立表
# create 'ns1:t1',{NAME => 'CF',VERSIONS => 2}
create 'ns1:t1','cf1' # 等價於 create 'ns1:t1',{NAME => 'cf1'}
# 建立表(多個列族)
create 'ns1:t1','cf1','cf2' # 等價於 create 'ns1:t1',{NAME => 'cf1'},{NAME => 'cf2'}
# 查看錶資訊
describe 'ns1:t1' # 可查看錶的資訊,包括很多屬性

2.建立表預分割槽

生成環境中,最方便匯入大量資料的方式是:data file -> hfile -> bulk load。但是,我們剛建立表的時候預設只有一個Region。往表中匯入大量資料,必然需要切分成兩個Region。這時候,就出現了"瞬間大量寫入",對於RegionServer來說,壓力巨大(有可能會掛掉)。
解決方案:建立表時,多給表一些Region(結合實際業務,依據表資料的ROWKEY進行設計)。

(1) 建立表(指定預估RowKey,以日期為例:年月日時分秒毫秒)

#生成四個Region
create 'ns1:logs','info',SPLITS => ['20181001000000000','20181011000000000','20181021000000000']

(2) 建立表(指定RowKey檔案)

create 'ns1:logs','info',SPLITS_FILE => '/opt/apps/logs.txt' #local file
vim /opt/apps/logs.txt
    20181001000000000
    20181011000000000
    20181021000000000

(3) 建立表(指定類對RowKey分割槽)

create 'ns1:logs','info',{NUMREGIONS => 5,SPLITALGO => 'HexStringSplit'}
create 'ns1:logs','info',{NUMREGIONS => 5,SPLITALGO => 'UniformSplit'}

3.話單例項 : 儲存RowKey設計

需求 : 本人某段時間通話記錄
查詢條件 : (本人號碼)telphone + (starttime - endtime)
資料樣式 : time    area    active	phone	talktime	mode	price
核心 : rowkey查詢快、rowkey範圍檢索、rowkey字首匹配
設計 : 
	rowkey : telphone + time	#18801773332_20181025000000000
	info : area    active	phone	talktime	mode	price
需求 : 本人與某好友一段時間通話記錄
說明 : 相對於上面那個表,這個表的設計稱為索引表或輔助表
查詢條件 : phone + (starttime - endtime)
資料樣式 : time    area    active	phone	talktime	mode	price
核心 : rowkey查詢快、rowkey範圍檢索、rowkey字首匹配
設計 : 
	rowkey : phone + time	#18801773332_20181025000000000
	info : area    active	phone	talktime	mode	price
解釋 : 因為在主表中根據rowkey(主叫號碼_呼叫時間)檢索,某個好友的通話記錄會在這個時間段內分散,查詢慢。
      我們建立索引表,它的rowkey(被叫號碼_呼叫時間)會把某個被叫號碼某段時間的通話記錄排序連續放在一起,檢索非常快。
出現的問題 : 主表資料和索引表資料如何同步?
        方案 : phoenix 或 solr作為索引表使用cloudera search同步

4.表屬性

先配置Hadoop和HBase的Snappy壓縮:

# 1.檢視hadopp是否支援壓縮
hadoop checknative
Native library checking:
hadoop:	false
zlib:	false
snappy:	false
# 2.檢查當前HBase是否支援壓縮
hbase org.apache.hadoop.util.NativeLibraryChecker
Native library checking:
hadoop:	false
zlib:	false
snappy:	false
# 3.下載
https://github.com/google/snappy
# 4.(上傳到hadoop安裝目錄)解壓
tar -zxf 
# 5.編譯安裝
make & make install
# 6.宣告環境變數
export HBASE_HOME=/usr/hdp/2.5.3.0-37/hbase
export HADOOP_HOME=/usr/hdp/2.5.3.0-37/hadoop
export HADOOP_SNAPPY_HOME=/usr/hdp/2.5.3.0-37/hadoop/hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar
# 7.將snappy裡的jar拷貝到hbase的lib下
cp `${HADOOP_SNAPPY_HOME}/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar` `${HBASE_HOME}/lib`
# 8.在hbase的lib下建立native資料夾
mkdir lib/native
# 9.設定軟連線
ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64
# 10.再次檢視是否壓縮
hbase org.apache.hadoop.util.NativeLibraryChecker
Native library checking:
hadoop:	true
zlib:	true
snappy:	true
# 11.測試壓縮檔案
hbase org.apache.hadoop.hbase.util.CompressionTest hdfs://master:8020/test.txt snappy 

# 注意:我使用的Ambari安裝的叢集,所以不需要以上步驟去配置snappy。
#      如果是手動安裝的,按照以上步驟配置完成後,記得要重啟hadoop和hbase。

(1) 表壓縮屬性

# 建立表(有壓縮屬性)
create 'lv:t2',{NAME => 'CF1',COMPRESSION => 'SNAPPY'}

(2) 表inMemory和BlockCache屬性

  • RegionServer的記憶體分配主要是:MemStore(寫資料時儲存)、BlockCache(讀資料時儲存)、Other(其他使用)。
  • 使用者讀取資料時,從MemStore、BlockCache、HFile按順序讀取。每個RegionServer一個BlockCache。
  • BlockCache:按照Cache分為三種:inMemory、Single和Multi型別。inMemory一般存放Meta元資料資訊,不會被刷掉。
  • inMemory、Single和Multi三種Cache分配比例是1:1:2。
# 查看錶"快取"屬性
hbase(main):002:0> describe 'emp'
Table emp is ENABLED            
emp      
COLUMN FAMILIES DESCRIPTION      
{NAME => 'info', DATA_BLOCK_ENCODING => 'NONE', BLOOMFILTER => 'ROW', 
REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'NONE', 
MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'FALSE', 
BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 
1 row(s) in 0.1050 seconds

說明:因為預設BLOCKCACHE=true,所以我們查資料(從快取查)如此的快。