7.HBase_應用_表設計
阿新 • • 發佈:2018-11-06
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,所以我們查資料(從快取查)如此的快。