標籤:
本文節選不保證論文的完整性和理解的準確性
原始的MapReduce。分Map,Shuffle,Reduce。
Map裡包含shards。
Shuffle理解為groupByKey的事情。Reduce裡包含Combiner,能夠定義Sharder來控制key怎麼和Reducer worker相應起來。
核心抽象和基本原語
PCollection<T>是一個不可變的bag。能夠是有序的(Sequence),也能夠是無序的(Collection)。PCollection能夠來自於記憶體裡的Java PCollection對象。也能夠讀取自檔案。
PTable<K, V>,能夠看成PCollection<Pair<K, V>>,不可變無序multi-map。
第一個原語是parallelDo()。把PCollection<T>變成新的PCollection<S>,處理方式定義在DoFn<T, S>裡。emitFn是call-back,傳給使用者的process(…),使用emitFn.emit(outElem)發射出去。parallelDo()能夠在map或reduce中使用,DoFn不應該使用閉包外全域的變數,(inline function)純操作自己的inputs。
第二個原語是groupByKey()。把PTable<K, V>轉變成PTable<K,Collection<V>>,
第三個原語是combineValues(),接收input為PTable<K,Collection<V>>和一個V的符合結合律的方法,返回PTable<K, V>。
第四個原語是flatten(),接收一個PCollection<T>的list,返回一個PCollection<T>
衍生原語(Derived Operations)
count(),接收PCollection<T>,返回PTable<T, Integer>
實現方式為parallelDo()。groupByKey()和combineValues()
join(),接收PTable<K, V1>,PTable<K, V2>。返回PTable<K,Tuple2<Collection<V1>, Collection<V2>>
實現方式為,第一步,使用parallelDo()把每一個input PTable<K, Vi>變成通用的PTable<K, TaggedUnion2<V1,V2>>。第二步使用flattern來combine tables;第三步。使用groupByKey()作用於被扁平過了tables。產生PTable<K,Collection<TaggedUnion2<V1, V2>>>
top(),接收比較函數和N,
實現方式為parallelDo(),groupByKey()和combineValues()
延遲分析(Deffered Evaluation)
PCollection對象有兩種狀態,defferred或materialized。
FlumeJava.run()真正觸發execution plan的物化/運行。
PObjects
PObject<T>用於儲存Java對象,物化過了之後能夠使用getValue()方法獲得PObject的值。有點像Future。
operate()方法
最佳化器
parallelDoFusion(融合)
Producer-Consumer and Sibling Fusion,例如以
大致是說,ABCD這幾種由同一份input產生的parallelDo。能夠融合起來在一個parallelDo,即A+B+C+D,裡處理。
一些中間結果也能夠不要。
MapShuffleCombineReduce(MSCR) Operation
FlumeJava最佳化器的核心在於把ParallelDo。GroupByKey,CombineValues和Flattern的組合轉換成一個個單個的MapReduce。
MSCR是一個中介層的操作,有M個input channels(每一個能夠進行map操作)。有R個Reduce channels(每一個能夠進行shuffle,或combine,或reduce操作)。
單個input channal m,接收PCollection<Tm>作為輸入,運行R路output輸出的ParallelDo “map”操作。產生R個PTable<Kr, Vs> outputs。每一個output channel r flatterns它的M個inputs,然後
a) 進行一次GroupByKey的“shuffle”,或CombineValues的“combine”。或Or-output的ParallelDo “reduce”,然後把結果寫出到Or-output PCollections
b) 把inputs直接寫出為outputs
前者這種output channel稱為”Grouping” channel,後者稱為”pass-through” channel。”pass-through” channel同意map的output成為一個MSCR操作的輸出。
每一個MSCR操作能夠用一個MapReduce完畢。它讓MapReduce更加通用,體如今:
? 同意多個reducers和combiners。
? 同意每一個reducer產生多個outputs;
? 消除了每一個reducer必須以同樣的key為input來產出output的約束;
? 同意pass-through形式的outputs。
所以MSCR是最佳化器裡非常好的一個中間操作目標。
MSCR Fusion
MSCR操作產生於一些相關的GroupByKey操作集合。相關的GroupByKey操作是指產生於同樣的input(如Flattern操作),或被同一個parallelDo操作製造出來的input。
這部分比較晦澀難懂啊。可是是理解核心
全域最佳化策略
最佳化要達到的效果是最後的運行計劃裡包含儘可能少的又高效的MSCR操作。
1. Sink Flatterns。把扁平操作下沉,如h(f(a)+f(b))=> h(f(a))+h(f(b)),即分配律。然後又能和parallelDo的融合特性結合起來,如(hof)(a)+(hog)(b)
2. Lift CombineValues。假設CombineValues緊跟著GroupByKey操作。
3. Insert fusion blocks。假設倆GroupByKey操作是由生產者-消費者的ParallelDo chain連起來的。ParallelDo要在GroupByKey裡做上調和下移。
4. Fuse ParallelDos。
5. Fuse MSCRs。
針對這幾個策略的實施。後面舉了個範例而且描繪了詳細的運行圖。非常協助理解
最佳化的不足和未來工作
最佳化器沒有分析使用者寫的方法,比方估算input和output資料量大小。
也沒有改動使用者的代碼來做最佳化。
須要做一些分析避免運算的反覆,及去除不必要或不合理的groupByKey。
Executor
最佳化運行結束後。
它現在支援batch該模式提交作業。
在操作。FlumeJava做到人性化發展、debug,建立自己主動刪除檔案。自己主動識別資料並行調整操作量,改變操作模式(remote)而這樣的事情。
掌聲 :)
本文摘錄 - FlumeJava