Spark mapPartitions迭代器返回重复记录

时间:2018-06-13 08:50:08

标签: java apache-spark distributed-computing

我有一个FlatMapFunction>>,String>的实现类。为每个分区初始化一些不可序列化的连接。但是当我在迭代器上调用next()时,它为多个分区提供相同的记录。以下是代码:

@Override
    public Iterator < String > call(Iterator < Tuple2 < String, Iterable < String >>> tuple2Iterator)
    throws Exception {
        BitLambdaService lambda = buildClient();
        List <String> resultList = new ArrayList < > ();
        while (tuple2Iterator.hasNext()) {
            Tuple2 < String, Iterable < String >> tpl = tuple2Iterator.next();
            // do something
        }
        return resultList.iterator();
    }

有人之前遇到过这个问题吗?或者知道如何解决它?

1 个答案:

答案 0 :(得分:0)

在转换后立即调用rdd.cache()解决了该问题。发生问题的原因是,转换是以惰性方式执行的,并且当将动作应用于RDD时,实际上是在将动作应用于RDD时执行了转换。因此,mapPartitions不会等待调用方法完成并将相同的记录分配给另一个执行程序。