我有一个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();
}
有人之前遇到过这个问题吗?或者知道如何解决它?
答案 0 :(得分:0)
在转换后立即调用rdd.cache()
解决了该问题。发生问题的原因是,转换是以惰性方式执行的,并且当将动作应用于RDD时,实际上是在将动作应用于RDD时执行了转换。因此,mapPartitions不会等待调用方法完成并将相同的记录分配给另一个执行程序。