如何在Spark中的JavaRDD分区之间共享数据?

时间:2016-07-13 11:27:53

标签: java serialization apache-spark

我有一些对象在apache spark中的分区之间共享。下面是我正面临的代码片段和问题。

private static void processDataWithResult() throws IOException {

        JavaRDD<Long> idRDD = createIdRDDUsingDb();
        final MeasureReportingData measureReporingData = getMeasureReportingData(jobConfiguration);

        resultRDD = idRDD.mapPartitions(new FlatMapFunction<Iterator<Long>, Boolean>() {
            @Override
            public Iterable<Boolean> call(Iterator<Long> idIterator) throws Exception {

                MeasureReportingData mrd = measureReporingData; 

                final List<Boolean> dummyList = new ArrayList<>();

                long minId = idIterator.next();

                engine.processInBatch(minId, minId + BATCH_SIZE - 1);
                return (Iterable<Boolean>) dummyList;
            }
        });

        resultRDD.count();

    }

我想将measureReportingData对象分发给所有分区吗?

我收到序列化错误,因为MeasureReportingData包含不是Serializable的实例成员。此问题中指定了问题的模拟:How to serialize a Predicate<T> from Nashorn engine in java 8

是否有另一种方法可以在分区之间共享measureReportingData?

1 个答案:

答案 0 :(得分:1)

为了在机器之间共享数据,数据必须在源处序列化,通过网络传输,并在目标处进行反序列化。因此,您无法传输不可序列化的对象。

如果MeasureReportingData不可序列化,则必须将其转换为可序列化对象,共享该对象,然后将其转换回函数内的MeasureReportingData