分散式應用開發相關的面試題收集
轉載:http://www.tuicool.com/articles/q2QjYb
1. 生產系統每天會產生一個日誌檔案F,資料量在5000W行的級別。檔案F儲存了兩列資料,一列是來源渠道,一列是來源渠道上的使用者標識。檔案F用來記錄當日各渠道上的所有訪問使用者,每訪問一次,記錄一條。 請問如何快速計算出各渠道上新增的使用者?
2. 有50臺前端伺服器分佈在各個節點上,每臺前端下都分別有一個本地的資料庫,前端伺服器每秒接受10萬次請求,並且需要把獲取到的內容插入至本地資料庫。如果某臺後端伺服器需要從這50臺前端伺服器的本地資料庫裡去請求一些資料,用什麼方式效果最好。
3. 請介紹一下分散式兩階段提交協議?
階段一:開始向事務涉及到的全部資源傳送提交前資訊。此時,事務涉及到的資源還有最後一次機會來異常結束事務。如果任意一個資源決定異常結束事務,則整個事務取消,不會進行資源的更新。否則,事務將正常執行,除非發生災難性的失敗。為了防止會發生災難性的失敗,所有資源的更新都會寫入到日誌中。這些日誌是永久性的,因此,這些日誌會倖免遇難並且在失敗之後可以重新對所有資源進行更新。 * 階段二:只在階段一沒有異常結束的時候才會發生。此時,所有能被定位和單獨控制的資源管理器都將開始執行真正的資料更新。 在分散式事務兩階段提交協議中,有一個主事務管理器負責充當分散式事務協調器的角色。事務協調器負責整個事務並使之與網路中的其他事務管理器協同工作。 為了實現分散式事務,必須使用一種協議在分散式事務的各個參與者之間傳遞事務上下文資訊,IIOP便是這種協議。這就要求不同開發商開發的事務參與者必須支援一種標準協議,才能實現分散式的事務。
4. 一個很大的2D矩陣,如果某點的值,由它周圍某些點的值決定,例如下一時刻(i,j) 的值取當前時刻它的8鄰點的平均,那麼怎麼用MapReduce來實現。
參考答案及分析:
首先,讓我們以WordCount為例來解釋MapReduce是怎麼工作的。
原始狀態下,輸入–Map — Shuffle — Reduce — 輸出
假設有如下的兩個文字檔案來執行WorkCount程式:
Hello World Bye World
Hello Hadoop GoodBye Hadoop
map資料輸入
Hadoop針對文字檔案預設使用LineRecordReader類來實現讀取,一行一個key/value對,key取偏移量,value為行內容。
如下是map1的輸入資料:
Key1 Value1
0 Hello World Bye World
如下是map2的輸入資料:
Key1 Value1
0 Hello Hadoop GoodBye Hadoop
map輸出/combine輸入
如下是map1的輸出結果
Key2 Value2
Hello 1
World 1
Bye 1
World 1
如下是map2的輸出結果
Key2 Value2
Hello 1
Hadoop 1
GoodBye 1
Hadoop 1
combine輸出
Combiner類實現將相同key的值合併起來,它也是一個Reducer的實現。
如下是combine1的輸出
Key2 Value2
Hello 1
World 2
Bye 1
如下是combine2的輸出
Key2 Value2
Hello 1
Hadoop 2
GoodBye 1
combiner視業務情況來用,減少MAP->REDUCE的資料傳輸,提高shuffle速度,就是在map中再做一次reduce操作。combiner使用的合適,可以在滿足業務的情況下提升job的速度,如果不合適,則將導致輸出的結果不正確。
對於wordcount來說,value就是一個疊加的數字,所以map一結束就可以進行reduce的value疊加,而不必要等到所有的map結束再去進行reduce的value疊加。
reduce輸出
Reducer類實現將相同key的值合併起來。
如下是reduce的輸出
Key2 Value2
Hello 2
World 2
Bye 1
Hadoop 2
GoodBye 1
即實現了WordCount的處理。
官方的流程圖:
用MapReduce來解決上述問題,以下標對作為map的key,遇到(i,j),生成(i-1,j-1),(i-1,j),etc,然後在reduce時merge相同的key,並計算value。