日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hadoop之企业案例分析

發(fā)布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop之企业案例分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Hadoop之企業(yè)案例分析

目錄

  • 海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個IP
  • 有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100 個詞
  • 有 10 個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復(fù)。要求你按照query的頻度排序。
  • 給定 a、b 兩個文件,各存放 50 億個 url,每個 url 各占 64 字節(jié),內(nèi)存限制是 4G,讓你找出 a、b 文件共同的 url?
  • 在 2.5 億個整數(shù)中找出不重復(fù)的整數(shù),注,內(nèi)存不足以容納這 2.5 億個整數(shù)
  • 騰訊面試題:給40億個不重復(fù)的 unsigned int 的整數(shù),沒排過序的,然后再給一個數(shù),如何快速判斷這個數(shù)是否在那40億個數(shù)當(dāng)中?
  • 怎么在海量數(shù)據(jù)中找出重復(fù)次數(shù)最多的一個?
  • 上千萬或上億數(shù)據(jù)(有重復(fù)),統(tǒng)計(jì)其中出現(xiàn)次數(shù)最多的N 個數(shù)據(jù)?

  • 1. 海量日志數(shù)據(jù),提取出某日訪問百度次數(shù)最多的那個IP

    首先是這一天,并且是訪問百度的日志中的 IP 取出來,逐個寫入到一個大文件中。注意到IP 是 32 位的,最多有個 2^32 個 IP。同樣可以采用映射的方法, 比如模 1000,把整個大文件映射為 1000 個小文件,再找出每個小文中出現(xiàn)頻率最大的 IP(可以采用 hash_map進(jìn)行頻率統(tǒng)計(jì),然后再找出頻率最大 的幾個)及相應(yīng)的頻率。然后再在這 1000 個最大的IP 中,找出那個頻率最大的 IP,即為所求。
    或者如下闡述:
    算法思想:分而治之+Hash

  • IP 地址最多有2^32=4G種取值情況,所以不能完全加載到內(nèi)存中處理;
  • 可以考慮采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分別存儲到1024個小文件中。這樣,每個小文件最多包含4MB個IP地址;
  • 對于每一個小文件,可以構(gòu)建一個IP為 key,出現(xiàn)次數(shù)為value的Hash map,同時記錄當(dāng)前出現(xiàn)次數(shù)最多的那個IP地址;
  • 可以得到1024個小文件中的出現(xiàn)次數(shù)最多的IP,再依據(jù)常規(guī)的排序算法得到總體上出現(xiàn)次數(shù)最多的IP;

  • 2. 有一個1G大小的一個文件,里面每一行是一個詞,詞的大小不超過16字節(jié),內(nèi)存限制大小是1M。返回頻數(shù)最高的100 個詞

    方案:

  • 順序讀文件中,對于每個詞 x,取 hash(x)%5000,然后按照該值存到 5000 個小文件(記為 x0,x1,…x4999)中。這樣每個文件大概是 200k 左右。
  • 如果其中的有的文件超過了1M 大小,還可以按照類似的方法繼續(xù)往下分,直到分解得到的小文件的大小都不超過 1M。
    對每個小文件,統(tǒng)計(jì)每個文件中出現(xiàn)的詞以及相應(yīng)的頻率(可以采用 trie 樹/hash_map 等),并取出出現(xiàn)頻率最大的100個詞(可以用含100個結(jié)點(diǎn)的最小堆),并把100個詞及相應(yīng)的頻率存入文件,這樣又得到了5000個文件。下一步就是把這5000個文件進(jìn)行歸并(類似與歸并排序)的過程了。

  • 3. 有 10 個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復(fù)。要求你按照query的頻度排序。

    還是典型的 TOP K 算法,解決方案如下:
    方案 1:

  • 順序讀取10個文件,按照hash(query)%10 的結(jié)果將query寫入到另外10個文件中。這樣新生成的文件每個的大小大約也1G(假設(shè)hash函數(shù)是隨機(jī)的)。找一臺內(nèi)存在2G左右的機(jī)器,依次對用 hash_map(query, query_count)來統(tǒng)計(jì)每個query出現(xiàn)的次數(shù)。利用快速/堆/歸并排序按照出現(xiàn)次數(shù)進(jìn)行排序。將排序好的query和對應(yīng)的query_cout輸出到文件中。這樣得到了10個排好序的文件。對這10個文件進(jìn)行歸并排序(內(nèi)排序與外排序相結(jié)合)。
  • 方案 2:

  • 一般query的總量是有限的,只是重復(fù)的次數(shù)比較多而已,可能對于所有的query,一次性就可以加入到內(nèi)存了。這樣,我們就可以采用trie樹/hash_map等直接來統(tǒng)計(jì)每個query出現(xiàn)的次數(shù),然后按出現(xiàn)次數(shù)做快速/堆/歸并排序就可以了。
  • 方案 3:

  • 與方案 1 類似,但在做完 hash,分成多個文件后,可以交給多個文件來處理,采用分布式的架構(gòu)來處理(比如 MapReduce),最后再進(jìn)行合并。

  • 4. 給定 a、b 兩個文件,各存放 50 億個 url,每個 url 各占 64 字節(jié),內(nèi)存限制是 4G,讓你找出 a、b 文件共同的 url?

    方案 1:可以估計(jì)每個文件的大小為 5G×64=320G,遠(yuǎn)遠(yuǎn)大于內(nèi)存限制的 4G。所以不可能將其完全加載到內(nèi)存中處理。考慮采取分而治之的方法。

  • 遍歷文件a,對每個url求取 hash(url)%1000,然后根據(jù)所取得的值將url分別存儲到 1000個小文件(記為 a0,a1,…,a999)中。這樣每個小文件的大約為300M。遍歷文件b,采取和a相同的方式將url分別存儲到1000小文件(記為b0,b1,…,b999)。
  • 這樣處理后,所有可能相同的url都在對應(yīng)的小文件(a0vsb0,a1vsb1,…,a999vsb999)中,不對應(yīng)的小文件不可能有相同的url。然后我們只要求出 1000 對小文件中相同的 url即可。
  • 求每對小文件中相同的url時,可以把其中一個小文件的url存儲到hash_set中。然后遍歷另一個小文件的每個url,看其是否在剛才構(gòu)建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。
  • 方案2:如果允許有一定的錯誤率,可以使用Bloom filter,4G內(nèi)存大概可以表示340億bit。將其中一個文件中的url使用Bloom filter映射為這340億 bit,然后挨個讀取另外一個文件的url,檢查是否與 Bloom filter,如果是,那么該 url 應(yīng)該是共同的 url(注意會有一定的錯誤率)。
    Bloom filter 日后會在BLOG 內(nèi)詳細(xì)闡述。


    5. 在 2.5 億個整數(shù)中找出不重復(fù)的整數(shù),注,內(nèi)存不足以容納這 2.5 億個整數(shù)

    方案 1:采用2-Bitmap(每個數(shù)分配 2bit,00 表示不存在,01 表示出現(xiàn)一次,10 表示多次,11 無意義)進(jìn)行,共需內(nèi)存 2^32 * 2 bit=1 GB 內(nèi)存,還可以接受。然后掃描這2.5億個整數(shù),查看Bitmap中相對應(yīng)位,如果是00變01,01變10,10保持不變。掃描完事后,查看bitmap,把對應(yīng)位是01的整數(shù)輸出即可。

    方案 2:也可采用與第 1 題類似的方法,進(jìn)行劃分小文件的方法。然后在小文件中找出不重復(fù)的整數(shù),并排序。然后再進(jìn)行歸并,注意去除重復(fù)的元素。


    6. 騰訊面試題:給40億個不重復(fù)的 unsigned int 的整數(shù),沒排過序的,然后再給一個數(shù),如何快速判斷這個數(shù)是否在那40億個數(shù)當(dāng)中?

    方案 1:oo,申請 512M 的內(nèi)存,一個 bit 位代表一個 unsigned int 值。讀入 40 億個數(shù),設(shè)置相應(yīng)的 bit 位,讀入要查詢的數(shù),查看相應(yīng) bit 位是否為 1,為 1 表示存在,為 0 表示不存在。


    7. 怎么在海量數(shù)據(jù)中找出重復(fù)次數(shù)最多的一個?

    方案 1:先做hash,然后求模映射為小文件,求出每個小文件中重復(fù)次數(shù)最多的一個,并記錄重復(fù)次數(shù)。然后找出上一步求出的數(shù)據(jù)中重復(fù)次數(shù)最多的一個就是所求(具體參考前面的題)。


    8. 上千萬或上億數(shù)據(jù)(有重復(fù)),統(tǒng)計(jì)其中出現(xiàn)次數(shù)最多的N 個數(shù)據(jù)?

    方案 1:上千萬或上億的數(shù)據(jù),現(xiàn)在的機(jī)器的內(nèi)存應(yīng)該能存下。所以考慮采用hash_map/搜索二叉樹/紅黑樹等來進(jìn)行統(tǒng)計(jì)次數(shù)。然后就是取出前N個出現(xiàn)次數(shù)最多的數(shù)據(jù)了

    總結(jié)

    以上是生活随笔為你收集整理的Hadoop之企业案例分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。