阅读979 返回首页    go 阿里云 go 技术社区[云栖]


论文摘抄 - FlumeJava

本摘抄不保证论文完整性和理解准确性 敲打


原始的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操作的输出。

最后更新:2017-04-03 05:39:34

  上一篇:go 音障
  下一篇:go Ext实现滚动条一直处于底部的方法