001大數據之分治思想

 

說說大數據

大數據從字面上講就是大,而大又是一個相對概念,相對的是誰呢?相對的是之前IT處理數據的大小(之前硬件的內存、硬盤、cpu等限制以及業務數據量小)、相對的是單機能處理的數據大小(一定時間內)即在規定時間內,一臺機器無法滿足用戶的要求,把這種一臺機器無法解決的矛盾,讓需要處理的數據背鍋,起其名爲大數據。

分治思想

就是把原來由一臺機器處理的大數據按照某種規則/算法拆分爲小數據,然後小數據交給N個機器去處理即分治。

本質上還是因爲單機IO、cpu、內存等硬件的限制,纔想出使用多臺設備進行計算。

例子講解

問題1

問題描述

面試一家公司,被問到有一個2T的文本文件,其中有2行是一樣的,如何快速找出該行?

問題分析

如果把2T的文件讀取到內存,然後在內存做對比,內存無法承受(16G)。怎麼辦呢?

解決辦法

使用分治思想之方法總結:先外部排序,後內部比較(排序)

  1. 使用atop規則,找出內存最大值,算出空閒內存大小,比如8G。2T=2000(約,舉例而已) 2000/8=250
  2. 使用hash取模算法(readLine().hashCode %2000)把可能相等的行放在一個文件種,把2T文件拆分250份小文件,部署250臺機器上,然後由250臺機器分別處理,找出重複行結束
  3. 然後250臺機器分別計算,找出重複行

 

網上解說:

傳統做法是將第一行與其他行比較,第二行與其他行比較,這樣的話需要遍歷最多N*N次

我們現在花費30min將該文件進行拆分操作,讓可能相等行放在疫情

 

假設Io速度是500MB每秒 2T文件讀取一遍需要約60分鐘 循環遍歷需要N次Io時間 分治思想可以使時間爲2次io

此方法存在問題

如何hashCode散列的不均勻,導致2T文件80%都散列到一個文件是不是又掛了啊

優化方法2

外無序,內有序,然後再比較即先定義固定區塊取出來,然後內部排序,然後再進行定義指針,進行外部排序。

我們還使用10000臺機器,2000G/10000=200M

  1. 把2T文件直接拆分10000份,每份200M(還是按行讀取到1000份小文件中)
  2. 然後10000臺機器分別讀取自己的小文件並按順序存入隊列中(數字按大小,字符串按hash之)
  3. 然後分別從10000個隊列取出數據進行排序比較並保留此比較中最小值或最大值並判斷是否有相等,有結束
  4. 找到最小或最大值的隊列再此彈出一行數據進行比較(進入第3步驟)

問題2

問題描述

分佈式計算一定比單機快嗎?

問題分析

不一定(有單機先找到概率),內存尋址要比IO10萬倍

單機方案

 

單機面對的問題:大文件拆分爲小文件、對每個小文件串行或小併發處理(避免內存耗盡)

 

大數據方案1(外有序、內無序)散列均勻

按邏輯拆分(readLine().hashCode%2000)+ 上傳各臺服務器 +一臺服務器處理時間

 

大數據方案2 (外無序,內有序) 散列均勻

 

split -b 400M logdata + 上傳各服務器 + 各服務把1個小文件再拆分2000個小文件然後合併hashCode%2000相同的文件 +計算時間

 

注意hashCode散列是否均勻避免大文件產生,以上都是散列均勻

如果散列不均勻:

大數據方法3(外無序,內有序) 散列不均勻

split -b 400M logdata + 上傳各臺服務器 + 各服務把1個小文件直接排序存入隊列,第1次從每個隊列取出1個數據,進行排序,比較,找出是否有相同,有相同結束程序。

不同找出最小值並記錄其所屬隊列,移除該變量並從其隊列再取出一個值並保留和最小值hashCode相等所有值然後繼續進行比較

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章