最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

解釋一下布隆過濾器原理

2023-04-10 21:56 作者:zjlala96  | 我要投稿

鎖屏面試題百日百刷,每個(gè)工作日?qǐng)?jiān)持更新面試題。請(qǐng)看到最后就能獲取你想要的,接下來的是今日的面試題:



1.解釋一下布隆過濾器原理

在日常生活中,包括在設(shè)計(jì)計(jì)算機(jī)軟件時(shí),我們經(jīng)常要判斷一個(gè)元素是否在一個(gè)集合中。比如在字處理軟件中,需要檢查一個(gè)英語(yǔ)單詞是否拼寫正確(也就是要判斷它是否在已知的字典中);在?FBI,一個(gè)嫌疑人的名字是否已經(jīng)在嫌疑名單上;在網(wǎng)絡(luò)爬蟲里,一個(gè)網(wǎng)址是否被訪問過等等。最直接的方法就是將集合中全部的元素存在計(jì)算機(jī)中,遇到一個(gè)新元素時(shí),將它和集合中的元素直接比較即可。一般來講,計(jì)算機(jī)中的集合是用哈希表(hash table)來存儲(chǔ)的。它的好處是快速準(zhǔn)確,缺點(diǎn)是費(fèi)存儲(chǔ)空間。當(dāng)集合比較小時(shí),這個(gè)問題不顯著,但是當(dāng)集合巨大時(shí),哈希表存儲(chǔ)效率低的問題就顯現(xiàn)出來了。比如說,一個(gè)象?Yahoo,Hotmail?和?Gmai?那樣的公眾電子郵件(email)提供商,總是需要過濾來自發(fā)送垃圾郵件的人(spamer)的垃圾郵件。一個(gè)辦法就是記錄下那些發(fā)垃圾郵件的?email地址。由于那些發(fā)送者不停地在注冊(cè)新的地址,全世界少說也有幾十億個(gè)發(fā)垃圾郵件的地址,將他們都存起來則需要大量的網(wǎng)絡(luò)服務(wù)器。如果用哈希表,每存儲(chǔ)一億個(gè)?email?地址, 就需要?1.6GB?的內(nèi)存(用哈希表實(shí)現(xiàn)的具體辦法是將每一個(gè)?email?地址對(duì)應(yīng)成一個(gè)八字節(jié)的信息指紋googlechinablog.com/2006/08/blog-post.html,然后將這些信息指紋存入哈希表,由于哈希表的存儲(chǔ)效率一般只有?50%,因此一個(gè)?email?地址需要占用十六個(gè)字節(jié)。

一億個(gè)地址大約要?1.6GB, 即十六億字節(jié)的內(nèi)存)。因此存貯幾十億個(gè)郵件地址可能需要上百?GB?的內(nèi)存。除非是超級(jí)計(jì)算機(jī),一般服務(wù)器是無(wú)法存儲(chǔ)的。

布隆過濾器只需要哈希表?1/8?到?1/4?的大小就能解決同樣的問題。

Bloom Filter是一種空間效率很高的隨機(jī)數(shù)據(jù)結(jié)構(gòu),它利用位數(shù)組很簡(jiǎn)潔地表示一個(gè)集合,并能判斷一個(gè)元素是否屬于這個(gè)集合。Bloom Filter的這種高效是有一定代價(jià)的:在判斷一個(gè)元素是否屬于某個(gè)集合時(shí),有可能會(huì)把不屬于這個(gè)集合的元素誤認(rèn)為屬于這個(gè)集合(false positive)。因此,Bloom Filter不適合那些“零錯(cuò)誤”的應(yīng)用場(chǎng)合。

而在能容忍低錯(cuò)誤率的應(yīng)用場(chǎng)合下,Bloom Filter通過極少的錯(cuò)誤換取了存儲(chǔ)空間的極大節(jié)省。

下面我們具體來看Bloom Filter是如何用位數(shù)組表示集合的。初始狀態(tài)時(shí),Bloom Filter是一個(gè)包含m位的位數(shù)組,每一位都置為0。

為了表達(dá)S={x1, x2,…,xn}這樣一個(gè)n個(gè)元素的集合,Bloom Filter使用k個(gè)相互獨(dú)立的哈希函數(shù)(Hash Function),?它們分別將集合中的每個(gè)元素映射到{1,…,m}的范圍中。對(duì)任意一個(gè)元素x,第i個(gè)哈希函數(shù)映射的位置hi(x)就會(huì)被置 為1(1≤i≤k)。注意,如果一個(gè)位置多次被置為1,那么只有第一次會(huì)起作用,后面幾次將沒有任何效果。在下圖中, k=3,且有兩個(gè)哈希函數(shù)選中同一個(gè)位置(從左邊數(shù)第五位)。

在判斷y是否屬于這個(gè)集合時(shí),我們對(duì)y應(yīng)用k次哈希函數(shù),如果所有hi(y)的位置都是1(1≤i≤k),那么我們就認(rèn)為y是集合中的元素,否則就認(rèn)為y不是集合中的元素。下圖中y1就不是集合中的元素。y2或者屬于這個(gè)集合,或者剛好是一個(gè)false positive。

·?為了add一個(gè)元素,用k個(gè)hash function將它hash得到bloom filter中k個(gè)bit位,將這k個(gè)bit位置1。

·?為了query一個(gè)元素,即判斷它是否在集合中,用k個(gè)hash function將它hash得到k個(gè)bit位。若這k bits全為1,則此元素在集合中;若其中任一位不為1,則此元素比不在集合中(因?yàn)槿绻?,則在add時(shí)已經(jīng)把對(duì)應(yīng)的k個(gè)bits位置為1)。

·?不允許remove元素,因?yàn)槟菢拥脑挄?huì)把相應(yīng)的k個(gè)bits位置為0,而其中很有可能有其他元素對(duì)應(yīng)的位。因此remove會(huì)引入false negative,這是絕對(duì)不被允許的。

布隆過濾器決不會(huì)漏掉任何一個(gè)在黑名單中的可疑地址。但是,它有一條不足之處,也就是它有極小的可能將一個(gè)不在黑名單中的電子郵件地址判定為在黑名單中,因?yàn)橛锌赡苣硞€(gè)好的郵件地址正巧對(duì)應(yīng)個(gè)八個(gè)都被設(shè)置成一的二進(jìn)制位。好在這種可能性很小,我們把它稱為誤識(shí)概率。

布隆過濾器的好處在于快速,省空間,但是有一定的誤識(shí)別率,常見的補(bǔ)救辦法是在建立一個(gè)小的白名單,存儲(chǔ)那些可能別誤判的郵件地址。

2.如何實(shí)現(xiàn)HBase的二級(jí)索引?

方案一:?通常情況下,較原生方式,我們可以采用ES或者Solr來實(shí)現(xiàn)hbase的二級(jí)索引的操作,?當(dāng)用戶要寫入數(shù)據(jù)時(shí)候,?基于hbase的observer協(xié)處理器攔截下來,?使用es或者Solr來構(gòu)建hbase的索引數(shù)據(jù),?這樣當(dāng)查詢hbase中數(shù)據(jù)時(shí)候,?可以先去ES中查詢到對(duì)應(yīng)的數(shù)據(jù),?然后根據(jù)結(jié)果,?在從hbase中獲取最終的完整的結(jié)果

方案二:?基于Phoenix實(shí)現(xiàn), Phoenix是一款基于hbase的SQL客戶端,?可以使用SQL的方式來操作hbase,?同時(shí)為了提升整體的查詢性能, Phoenix中提供了各種索引(全局索引,?本地索引,?覆蓋索引以及函數(shù)索引),?這些索引都是基于Hbase的協(xié)處理器(主要是ObServer協(xié)處理器)而實(shí)現(xiàn)的,?二基于索引的查詢方案,?也是Phoenix實(shí)現(xiàn)hbase二級(jí)索引的方式

3.Hbase的storeFile(compact)合并機(jī)制是什么?

compact合并機(jī)制:

指的memStore中不斷進(jìn)行flush刷新操作,?就會(huì)產(chǎn)生多個(gè)storeFile的文件,?當(dāng)storeFile的文

件達(dá)到一定閾值后,?就會(huì)觸發(fā)compact的合并機(jī)制,?將多個(gè)storeFile合并為一個(gè)大的HFile文件

閾值:?達(dá)到3個(gè)及以上

整個(gè)合并過程分為兩大階段:

minor :

作用:?將多個(gè)小的storeFile合并為一個(gè)較大的Hfile操作

閾值:?達(dá)到3個(gè)及以上

注意:?此合并過程,?僅僅將多個(gè)合并為一個(gè),?對(duì)數(shù)據(jù)進(jìn)行排序操作,?如果此時(shí)數(shù)據(jù)有過期,?或者有標(biāo)記為刪除數(shù)據(jù),?此時(shí)不做任何的處理?(類似于 內(nèi)存合并中基礎(chǔ)型)

所以說,?此合并操作,?效率比較高

major:

作用:?將較大的HFile?和 之前的大的Hfile進(jìn)行合并形成一個(gè)更大的Hfile文件?(全局合并)

閾值:?默認(rèn)?7天

注意:?此合并過程,?會(huì)將那些過期的數(shù)據(jù),?或者已經(jīng)標(biāo)記刪除的數(shù)據(jù),?在這次合并中,?全部

都清除掉,由于這是一種全局合并操作,?對(duì)性能影響比較大,?在實(shí)際生產(chǎn)中,?建議 關(guān)閉掉自動(dòng)合并,?采用手動(dòng)觸發(fā)的方案

4.Hbase的flush刷新機(jī)制?

flush刷新機(jī)制(溢寫合并機(jī)制):

流程:?客戶端不斷將數(shù)據(jù)寫入到memStore內(nèi)存中,?當(dāng)內(nèi)存中數(shù)據(jù)達(dá)到一定閾值后,?需要

將數(shù)據(jù)溢寫刷新的HDFS中 形成一個(gè)storeFile文件

閾值: 128M?或者?1小時(shí) 滿足了那個(gè)都會(huì)觸發(fā)flush機(jī)制

內(nèi)部詳細(xì)流程: hbase 2.0架構(gòu) 以上流程

1)?客戶端不斷向memStore中寫入數(shù)據(jù),?當(dāng)memStore只數(shù)據(jù)達(dá)到閾值后,?就會(huì)啟動(dòng)flush操作

2)?首先hbase會(huì)先關(guān)閉掉當(dāng)前這個(gè)已經(jīng)達(dá)到閾值的內(nèi)存空間,?然后開啟一個(gè)新的memStore的空間,用于繼續(xù)寫入工作

3)?將這個(gè)達(dá)到閾值的內(nèi)存空間數(shù)據(jù)放入到 內(nèi)存隊(duì)列中,?此隊(duì)列的特性是只讀,?在hbase 2.0架構(gòu)中,?可以設(shè)置此隊(duì)列的數(shù)據(jù)盡可能晚的刷新到HDFS中,?當(dāng)這個(gè)隊(duì)列中數(shù)據(jù)達(dá)到某個(gè)閾值后(內(nèi)存不足),?這個(gè)時(shí)候觸發(fā)flush刷新操作?(隊(duì)列中可能存儲(chǔ)了多個(gè)memStore的數(shù)據(jù))

4) flush線程會(huì)將隊(duì)列中所有的數(shù)據(jù)全部讀取出來,?然后對(duì)數(shù)據(jù)進(jìn)行排序合并操作,?將合并后數(shù)據(jù)存儲(chǔ)到HDFS中,?形成一個(gè)storeFile的文件

注意:?在?hbase2.0以下的架構(gòu)中,?不存在推遲刷新功能,?同樣也不存在 合并數(shù)據(jù)的

操作當(dāng)memStore數(shù)據(jù)達(dá)到閾值后,?放入到隊(duì)列中,?專門有一個(gè)flush刷新監(jiān)控隊(duì)列,?一旦有數(shù)據(jù)直接刷新到HDFS上

注意說明:

hbase 2.0?只是提供了基于內(nèi)存的合并功能,?但是默認(rèn)情況下 不開啟的,?所以 在默認(rèn)情況

下?整個(gè)flush機(jī)制基本和2.0以下的版本是一致的,?但是一旦開啟了,?就是剛剛描述流程

合并方案:?三種基礎(chǔ)型(basic):?直接將多個(gè)memStore數(shù)據(jù)合并在一起直接刷新到HDFS上,如果數(shù)據(jù)存在過期的數(shù)據(jù),?或者是已經(jīng)標(biāo)記為刪除的數(shù)據(jù),?基礎(chǔ)型不做任何處理

饑渴型(eager):?在將多個(gè)memStore合并的過程中,?積極判斷數(shù)據(jù)是否存在過期,?或者是否已經(jīng)標(biāo)記刪除,?如果有,?直接過濾掉這些標(biāo)記刪除和過期的數(shù)據(jù)即可

適應(yīng)性(adaptive):?檢查數(shù)據(jù)是否有過期數(shù)據(jù),?如果過期數(shù)據(jù)量達(dá)到一定閾值后,?就會(huì)自動(dòng)使

用饑渴型,?否則就使用基礎(chǔ)型

5.如何解決hbase中數(shù)據(jù)熱點(diǎn)問題?

所謂數(shù)據(jù)熱點(diǎn),?指的是大量的數(shù)據(jù)寫到hbase的某一個(gè)或者某幾個(gè)region中,?導(dǎo)致其余的region沒有數(shù)據(jù),?其他region對(duì)應(yīng)regionServer的節(jié)點(diǎn)承受了大量的并發(fā)請(qǐng)求,?此時(shí)就出現(xiàn)了熱點(diǎn)問題

解決方案:?通過預(yù)分區(qū)和設(shè)計(jì)良好的rowkey來解決

1)加鹽處理(加隨機(jī)數(shù)) :?可以在rowkey前面動(dòng)態(tài)添加一些隨機(jī)數(shù),?從而保證數(shù)據(jù)可以均勻落在不同region中

n 基本保證數(shù)據(jù)落在不同region

n 將相關(guān)性比較強(qiáng)的數(shù)據(jù)分散在不同的額region中,?導(dǎo)致查詢的效率有一定降低

2)hash處理:?根據(jù)rowkey計(jì)算其hash值,?在rowkey前面hash計(jì)算值即可?(MD5 HASH)

n 讓相關(guān)性比較強(qiáng)的數(shù)據(jù)可以被放置到同一個(gè)region中

n 如果相關(guān)數(shù)據(jù)比較多,?依然會(huì)導(dǎo)致熱點(diǎn)問題

3)反轉(zhuǎn)策略:?比如說手機(jī)號(hào)反轉(zhuǎn) 或者 時(shí)間戳的反轉(zhuǎn)

n 好處:?基本保證數(shù)據(jù)落在不同region

n 弊端:?將相關(guān)性比較強(qiáng)的數(shù)據(jù)分散在不同的region中,?導(dǎo)致查詢的效率有一定降低



全部?jī)?nèi)容在[git](https://gitee.com/zjlalaforgit/interview)上,了解更多請(qǐng)點(diǎn)我頭像或到我的主頁(yè)去獲得,謝謝


解釋一下布隆過濾器原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
潍坊市| 通许县| 河北省| 武冈市| 新蔡县| 健康| 栖霞市| 嘉定区| 彭泽县| 新津县| 汶川县| 巴马| 吉木乃县| 舞钢市| 运城市| 澄迈县| 肥西县| 舟曲县| 桓仁| 潞西市| 台州市| 永靖县| 洪江市| 扎赉特旗| 广德县| 巴东县| 和龙市| 朝阳区| 皮山县| 丰都县| 高碑店市| 顺义区| 大冶市| 高陵县| 湖口县| 泽库县| 靖边县| 吉木乃县| 泸定县| 固原市| 南溪县|