什么是Bitmap

a) Bitmap如何做到多維交叉計(jì)算的?

Bit即比特味榛,是目前計(jì)算機(jī)系統(tǒng)里邊數(shù)據(jù)的最小單位椭坚,8個(gè)bit即為一個(gè)Byte。一個(gè)bit的值搏色,或者是0善茎,或者是1;也就是說一個(gè)bit能存儲(chǔ)的最多信息是2频轿。
Bitmap可以理解為通過一個(gè)bit數(shù)組來存儲(chǔ)特定數(shù)據(jù)的一種數(shù)據(jù)結(jié)構(gòu)垂涯;由于bit是數(shù)據(jù)的最小單位,所以這種數(shù)據(jù)結(jié)構(gòu)往往是非常節(jié)省存儲(chǔ)空間航邢。比如一個(gè)公司有8個(gè)員工耕赘,現(xiàn)在需要記錄公司的考勤記錄,傳統(tǒng)的方案是記錄下每天正成乓螅考勤的員工的ID列表操骡,比如2012-01-01:[1,2,3,4,5,6,7,8]。假如員工ID采用byte數(shù)據(jù)類型赚窃,則保存每天的考勤記錄需要N個(gè)byte册招,其中N是當(dāng)天考勤的總?cè)藬?shù)。另一種方案則是構(gòu)造一個(gè)8bit(01110011)的數(shù)組勒极,將這8個(gè)員工跟員工號(hào)分別映射到這8個(gè)位置是掰,如果當(dāng)天正常考勤了辱匿,則將對應(yīng)的這個(gè)位置置為1键痛,否則置為0;這樣可以每天采用恒定的1個(gè)byte即可保存當(dāng)天的考勤記錄匾七。
綜上所述絮短,Bitmap節(jié)省大量的存儲(chǔ)空間,因此可以被一次性加載到內(nèi)存中昨忆。再看其結(jié)構(gòu)的另一個(gè)更重要的特點(diǎn)戚丸,它也顯現(xiàn)出巨大威力:就是很方便通過位的運(yùn)算(AND/OR/XOR/NOT),高效的對多個(gè)Bitmap數(shù)據(jù)進(jìn)行處理,這點(diǎn)很重要限府,它直接的支持了多維交叉計(jì)算能力夺颤。比如上邊的考勤的例子里,如果想知道哪個(gè)員工最近兩天都沒來胁勺,只要將昨天的Bitmap和今天的Bitmap做一個(gè)按位的“OR”計(jì)算世澜,然后檢查那些位置是0,就可以得到最近兩天都沒來的員工的數(shù)據(jù)了署穗,比如:


再比如寥裂,我們想知道哪些男員工沒來?我們可以在此結(jié)果上再“And”上一個(gè)Bitmap就能得到結(jié)果案疲。
b) Bitmap如何做到高速運(yùn)算的封恰?
回憶一下前面,浪費(fèi)的有兩個(gè)部分:其一是存儲(chǔ)空間的浪費(fèi)褐啡,Bitmap比文件強(qiáng)多了诺舔,但是仍然有浪費(fèi)的嫌疑。它需要保存到外部存儲(chǔ)(數(shù)據(jù)庫或者文件)备畦,計(jì)算時(shí)需要從外部存儲(chǔ)加載到內(nèi)存低飒,因此存儲(chǔ)的Bitmap越大,需要的外部存儲(chǔ)空間就越大懂盐;并且計(jì)算時(shí)I/O的消耗會(huì)更大褥赊,加載Bitmap的時(shí)間也越長。其二是計(jì)算資源的浪費(fèi)莉恼,計(jì)算時(shí)要加載到內(nèi)存拌喉,越大的Bitmap消耗的內(nèi)存越多;位數(shù)越多俐银,計(jì)算時(shí)消耗的cpu時(shí)間也越多司光。
對于第一種浪費(fèi),最直覺的方案就是可以引入一些文件壓縮技術(shù)悉患,比如gzip/lzo之類的,對存儲(chǔ)的Bitmap文件進(jìn)行壓縮榆俺,在加載Bitmap的時(shí)候再進(jìn)行解壓售躁,這樣可以很好的解決存儲(chǔ)空間的浪費(fèi),以及加載時(shí)I/O的消耗茴晋;代價(jià)則是壓縮/解壓縮都需要消耗更多的CPU/內(nèi)存資源陪捷;并且文件壓縮技術(shù)對第二種浪費(fèi)也無能為力。因此只有系統(tǒng)有足夠多空閑的CPU資源而I/O成為瓶頸的情況下诺擅,可以考慮引入文件壓縮技術(shù)市袖。
那么有沒有一些技術(shù)可以同時(shí)解決這兩種浪費(fèi)呢?好消息是有,那就是Bitmap壓縮技術(shù)苍碟;而常見的壓縮技術(shù)都是基于RLE(Run Length Encoding酒觅,詳見http://en.wikipedia.org/wiki/Run-length_encoding)。
RLE編碼很簡單微峰,比較適合有很多連續(xù)字符的數(shù)據(jù),比如以下邊的Bitmap為例:

可以編碼為0,8,2,11,1,2,3,11
其意思是:第一位為0颜凯,連續(xù)有8個(gè)仗扬,接下來是2個(gè)1症概,11個(gè)0早芭,1個(gè)1,2個(gè)0逼友,3個(gè)1精肃,最后是11個(gè)0(當(dāng)然此處只是對RLE的基本原理解釋帜乞,實(shí)際應(yīng)用中的編碼并不完全是這樣的)黎烈。
可以預(yù)見照棋,對于一個(gè)很大的Bitmap,如果里邊的數(shù)據(jù)分布很稀疏(說明有很多大片連續(xù)的0)溶锭,采用RLE編碼后符隙,占用的空間會(huì)比原始的Bitmap小很多霹疫。
同時(shí)引入一些對齊的技術(shù)丽蝎,可以讓采用RLE編碼的Bitmap不需要進(jìn)行解壓縮,就可以直接進(jìn)行AND/OR/XOR等各類計(jì)算红省;因此采用這類壓縮技術(shù)的Bitmap类腮,加載到內(nèi)存后還是以壓縮的方式存在蚜枢,從而可以保證計(jì)算時(shí)候的低內(nèi)存消耗;而采用word(計(jì)算機(jī)的字長需频,64位系統(tǒng)就是64bit)對齊等技術(shù)又保證了對CPU資源的高效利用昭殉。因此采用這類壓縮技術(shù)的Bitmap藐守,保持了Bitmap數(shù)據(jù)結(jié)構(gòu)最重要的一個(gè)特性卢厂,就是高效的針對每個(gè)bit的邏輯運(yùn)算。
常見的壓縮技術(shù)包括BBC(有專利保護(hù)),
WAH(http://code.google.com/p/compressedbitset/
和EWAH(http://code.google.com/p/javaewah/)任内。在Apache Hive里邊使用了EWAH死嗦。
c) Bitmap在大數(shù)據(jù)計(jì)算上的能力越除?
我們用一個(gè)TalkingData Analytics中用戶留存的例子來看Bitmap如何做到用戶回訪的統(tǒng)計(jì)外盯。比如想知道某個(gè)應(yīng)用门怪,昨天新增的用戶中锅纺,有多少人今天又開啟了應(yīng)用(次日留存)。使用過Hive的工程師护锤,不難理解下面語句的含義:

同時(shí)烙懦,我們使用Bitmap技術(shù)后氯析,同樣實(shí)現(xiàn)上述的計(jì)算莺褒,對比測試顯示出效率的差異是巨大的:

d) 引入Bitmap技術(shù)后你辣,分析系統(tǒng)可能的處理流程大體是什么樣的陨舱?
數(shù)據(jù)收集系統(tǒng)收集設(shè)備上傳數(shù)據(jù),然后分發(fā)給實(shí)時(shí)處理系統(tǒng)和批量處理系統(tǒng)表悬;
實(shí)時(shí)系統(tǒng)采用自有計(jì)數(shù)器程序签孔,或者基于Storm之類中間件的計(jì)數(shù)器程序饥追,計(jì)算各類簡單計(jì)數(shù)器但绕,然后批量(比如30s或者1min)更新到Redis或者HBase之類的存儲(chǔ)惶看;前端供應(yīng)計(jì)數(shù)器類數(shù)據(jù)的服務(wù)通過訪問后臺(tái)計(jì)算器程序或者是計(jì)數(shù)器存儲(chǔ)來給報(bào)表系統(tǒng)提供服務(wù)纬黎;
批量系統(tǒng)對該批的數(shù)據(jù)按用戶進(jìn)行去重生成/修改某天/某個(gè)應(yīng)用的活躍用戶Bitmap本今,同時(shí)可以根據(jù)需要,將機(jī)型孕索、地域躏碳、操作系統(tǒng)等等各種數(shù)據(jù)提煉成屬性Bitmap菇绵,備用脸甘。
報(bào)表中針對分析需要丹诀,提取各種Bitmap(用戶铆遭、屬性……Bitmap),高效的利用CPU/內(nèi)存碗脊,通過組合And/Or/Not等基礎(chǔ)計(jì)算衙伶,最終完成多維交叉計(jì)算功能矢劲,反饋客戶結(jié)果芬沉。

資料來源:http://www.infoq.com/cn/articles/the-secret-of-bitmap

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丸逸,一起剝皮案震驚了整個(gè)濱河市黄刚,隨后出現(xiàn)的幾起案子憔维,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異虱肄,居然都是意外死亡咏窿,警方通過查閱死者的電腦和手機(jī)素征,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門根欧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤粗,“玉大人嫌拣,你說我怎么就攤上這事呆躲〖呋啵” “怎么了燥筷?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵肆氓,是天一觀的道長谢揪。 經(jīng)常有香客問我,道長茁肠,這世上最難降的妖魔是什么垦梆? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任托猩,我火速辦了婚禮京腥,結(jié)果婚禮上公浪,老公的妹妹穿的比我還像新娘船侧。我一直安慰自己勺爱,他們只是感情好琐鲁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布顾翼。 她就那樣靜靜地躺著适贸,像睡著了一般拜姿。 火紅的嫁衣襯著肌膚如雪冯遂。 梳的紋絲不亂的頭發(fā)上蛤肌,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天展东,我揣著相機(jī)與錄音,去河邊找鬼卦停。 笑死,一個(gè)胖子當(dāng)著我的面吹牛处硬,可吹牛的內(nèi)容都是我干的荷辕。 我是一名探鬼主播疮方,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼骡显,長吁一口氣:“原來是場噩夢啊……” “哼惫谤!你這毒婦竟也來了溜歪?” 一聲冷哼從身側(cè)響起许蓖,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤自阱,失蹤者是張志新(化名)和其女友劉穎动壤,沒想到半個(gè)月后琼懊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檬输。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丧慈。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逃默,死狀恐怖完域,靈堂內(nèi)的尸體忽然破棺而出瘩将,到底是詐尸還是另有隱情姿现,我是刑警寧澤建钥,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布泽艘,位于F島的核電站镐依,受9級特大地震影響槐壳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜带兜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一刚照、第九天 我趴在偏房一處隱蔽的房頂上張望无畔。 院中可真熱鬧浑彰,春花似錦郭变、人聲如沸薄风。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽困肩。三九已至锌畸,卻和暖如春潭枣,著一層夾襖步出監(jiān)牢的瞬間幻捏,已是汗流浹背篡九。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工伊佃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人例证。 一個(gè)月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像笙蒙,于是被迫代替她去往敵國和親捅位。 傳聞我的和親對象是個(gè)殘疾皇子搂抒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容