如何覆盖spark map函数中的setup和cleanup方法

时间:2016-10-09 19:29:47

标签: scala apache-spark scalding

假设有以下地图缩减作业

映射

setup()初始化一些状态

map()将数据添加到状态,无输出

cleanup()输出状态到上下文

减速机

将所有州聚合成一个输出

如何在火花中实施这样的工作?

补充问题:如何在烫伤中实施此类工作? 我正在寻找以某种方式使方法超载的例子......

2 个答案:

答案 0 :(得分:2)

Spark map未提供等效的Hadoop setupcleanup。它假设每个呼叫都是独立的,并且没有副作用。

您可以获得的最接近的等价物是将所需的逻辑放在mapPartitionsmapPartitionsWithIndex内,并使用简化的模板:

rdd.mapPartitions { iter => {
   ... // initalize state
   val result = ??? // compute result for iter
   ... // perform cleanup
   ... // return results as an Iterator[U]
}}

答案 1 :(得分:1)

在scala中设置的标准方法是使用lazy val:

public class BarfException : GrossException
{
    public BarfException() : base() { }

    protected BarfException(SerializationInfo info, StreamingContext context) : base(info, context) { }

    public override string Message { get { return "BARF!!"; } }

    public override void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        base.GetObjectData(info, context);
        info.AddValue("OverriddenMessage", Message);
    }
}

只要lazy val someSetupState = { .... } data.map { x => useState(someSetupState, x) ... 可以在任务上实例化(即它不使用提交节点的某个本地磁盘),上述工作就可以了。这不涉及清理。对于清理,烫伤有一个方法:

someSetupState

最后在每个任务上运行。与映射示例类似,您可以执行关闭:

    TypedPipe[T]#onComplete(fn: () => Unit): TypedPipe[T]

我不知道火花的等价物。