本文摘錄 - FlumeJava

來源:互聯網
上載者:User

標籤:

本文節選不保證論文的完整性和理解的準確性 


原始的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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.