前言:在系統(tǒng)中向hbase中插入數(shù)據(jù)時(shí),常常通過設(shè)置region的預(yù)分區(qū)來防止大數(shù)據(jù)量插入的熱點(diǎn)問題,提高數(shù)據(jù)插入的效率,同時(shí)可以減少當(dāng)數(shù)據(jù)猛增時(shí)由于Region split帶來的資源消耗。大量的預(yù)分區(qū)數(shù)量會(huì)導(dǎo)致hbase客戶端緩存大量的分區(qū)地址,導(dǎo)致內(nèi)存的增長,某些系統(tǒng)中一個(gè)JVM進(jìn)程中會(huì)開啟幾十個(gè)獨(dú)立的hbase客戶端對象,同時(shí)會(huì)查詢多張Hbase表,這樣JVM進(jìn)程就會(huì)緩存 (預(yù)分區(qū)數(shù) X 表數(shù) X Hbase客戶端數(shù)=條記錄)。

  有沒有這種情況?有的,在本人的storm項(xiàng)目中,采用結(jié)合spring注入的方式來結(jié)合Hbase向hbase存入數(shù)據(jù),storm中的每一個(gè)線程都會(huì)創(chuàng)建一個(gè)XmlBeanDefinitionReader對象來加載spring的配置文件,所以一個(gè)線程就有一個(gè)hbse客戶端對象了,同時(shí)Hbase表設(shè)置102預(yù)分區(qū),一個(gè)topology會(huì)操作最少8張表,一個(gè)worker會(huì)走20個(gè)task。所以一個(gè)work會(huì)緩存大約102*8*20=16320條記錄,每一條記錄的數(shù)據(jù)格式大致就是hbase.meta的一條數(shù)據(jù)格式,經(jīng)過我計(jì)算16000多條記錄一個(gè)JVM中占用內(nèi)存也就5M多,對內(nèi)存的消耗是完全可以忽略不計(jì)的。這就很尷尬了。這種優(yōu)化只是對于大規(guī)模的集群來說有效果,小規(guī)模集群考慮這種情況是過度設(shè)計(jì)了。比如那種Hbase客戶端會(huì)有緩存一整張hbase.meta表數(shù)據(jù)的系統(tǒng)又或者那種hbase表分區(qū)達(dá)到上萬的系統(tǒng),那么一個(gè)woeker中地址的緩存會(huì)達(dá)到幾百兆,這個(gè)時(shí)候從原理上就可以進(jìn)行設(shè)計(jì)了來節(jié)省資源消耗,想想可以省好多臺服務(wù)器。

原文和作者一起討論:http://www.cnblogs.com/intsmaze/p/6648834.html

微信:intsmaze

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

  說了這么多,如何來進(jìn)行系統(tǒng)資源優(yōu)化?可以結(jié)合storm的自定義分區(qū),不再使用storm提供的分組策略,我們把作用于hbase的散列算法來作為storm的分組策略,就可以得到storm的task與hbase的預(yù)分區(qū)一一對應(yīng)了。

以前的系統(tǒng):

  大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

 

  消息進(jìn)來了以后,由spout均勻的發(fā)送到各個(gè)intsmaze-bolt節(jié)點(diǎn)上,每一個(gè)bolt節(jié)點(diǎn)再使用散列算法把該消息存入對應(yīng)的hbase表分區(qū)中。

現(xiàn)在的系統(tǒng):

  大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

  消息進(jìn)來了以后,spout在進(jìn)行發(fā)送給intsmaze-bolt的時(shí)候,在分組策略中使用與hbase同樣的散列算法,然后把同一范圍內(nèi)的消息發(fā)送給對應(yīng)的intsmaze-bolt的taske,這樣就可以保證bolt的并行度與hbase的預(yù)分區(qū)一一對應(yīng),每一個(gè)taske中的hbase客戶端只會(huì)緩存對應(yīng)的幾個(gè)hbase的表預(yù)分區(qū)的地址信息。

  關(guān)于storm的自定義分組的實(shí)現(xiàn)可以百度,這里不給出代碼實(shí)現(xiàn),只給出實(shí)現(xiàn)方案。補(bǔ)充一句,散列算法設(shè)計(jì)的好,是可以保證消息在storm的bolt里的task分發(fā)中不會(huì)發(fā)生數(shù)據(jù)傾斜的。

看看Hbase1.1.2的客戶端源碼吧:

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

會(huì)先到zookeeper中拿到hbase.meta的地址信息,hbase.meta里面存儲(chǔ)著所有用戶表各個(gè)分區(qū)的地址已經(jīng)rowkey的范圍:

locations= [region=hbase:meta,,1.1588230740, hostname=centos-reall-132,16020,1490876417048, seqNum=0]

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

這里就好把表名和該表的地址等元數(shù)據(jù)緩存下來,下次就不用走網(wǎng)絡(luò)去獲取了。下面就會(huì)第一次緩存hbse.meta表的數(shù)據(jù)信息。

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

當(dāng)大量的向某個(gè)分區(qū)表插入數(shù)據(jù)后,metaCache中就有下面的數(shù)據(jù):

大數(shù)據(jù)培訓(xùn),云培訓(xùn),數(shù)據(jù)挖掘培訓(xùn),云計(jì)算培訓(xùn),高端軟件開發(fā)培訓(xùn),項(xiàng)目經(jīng)理培訓(xùn)

{hbase:meta={[B@e09300c=[region=hbase:meta,,1.1588230740, hostname=centos-reall-132,16020,1490876417048, seqNum=0]}, t_regin_demo={[B@f01dde6=[region=t_regin_demo,10|,1480171499299.e94245285fb3fbfe3dd3bb7e9c632be8., hostname=centos-reall-132,16020,1490876417048, seqNum=50], [B@438f2ebc=[region=t_regin_demo,20|,1480171499299.b9bee9aad30185f682d943172136966b., hostname=centos-reall-132,16020,1490876417048, seqNum=50], [B@6d455b4a=[region=t_regin_demo,30|,1480171499299.144c892d9a29739d46c3561c431326ac., hostname=centos-reall-132,16020,1490876417048, seqNum=53], [B@646c8f51=[region=t_regin_demo,40|,1480171499299.f5c53075ed5f26cf1001ffd7d12101d1., hostname=centos-reall-132,16020,1490876417048, seqNum=50], [B@13354259=[region=t_regin_demo,50|,1480171499299.2d3eff976bd362e338be87e6eb8b8e42., hostname=centos-reall-132,16020,1490876417048, seqNum=50], [B@d96eae9=[region=t_regin_demo,60|,1480171499299.67c0711ff634ad63a81e2d3c753cf9f6., hostname=centos-reall-132,16020,1490876417048, seqNum=50], [B@2f186df7=[region=t_regin_demo,70|,1480171499299.78c04fabbb1fb9aebc4600ff653eb3d8., hostname=centos-reall-132,16020,1490876417048, seqNum=47], [B@6cdb8b48=[region=t_regin_demo,80|,1480171499299.b7ae8e09ddea0faea2360897add9b18f., hostname=centos-reall-132,16020,1490876417048, seqNum=56], [B@41955bcd=[region=t_regin_demo,90|,1480171499299.8ac30f51ea6143b509b84e62ed62db7a., hostname=centos-reall-132,16020,1490876417048, seqNum=50]}} 

分類: storm

http://www.cnblogs.com/intsmaze/p/6648834.html