(问题的一部分是docs that say "undocumented" on parallelize留给我阅读书籍以寻找不总是属于的例子)
我试图通过执行我们拥有的Java类的N个操作来创建RDD长度N = 10 ^ 6,我可以让该类实现Serializable或任何函数(如果需要)。我预先没有固定长度的数据集,我正在尝试创建一个。试图弄清楚是否要创建一个长度为N的虚拟数组来并行化,或者传递一个运行N次的函数。
不确定哪种方法有效/更好,我在Spark中看到如果我开始使用文档中的单词定义良好的数据集,这些单词的长度/数量已经定义,我只是并行化了一些地图或过滤以对该数据执行某些操作。
就我而言,我认为它有所不同,试图将创建并行化为包含10 ^ 6个元素的RDD ......
描述:
在使用Spark 1.5.1的Java 8中,我们有一个Java方法doDrop(),它接受PipeLinkageData并返回一个DropResult。
我在想我可以使用map()或flatMap()来调用一对多函数,我试图做这样的事情in another question that never quite worked:
JavaRDD<DropResult> simCountRDD = spark.parallelize(makeRange(1,getSimCount())).map(new Function<Integer, DropResult>()
{
public DropResult call(Integer i) {
return pld.doDrop();
}
});
这样的思考是更正确的方法吗?
// pld is of type PipeLinkageData, it's already initialized
// parallelize wants a collection passed into first param
List<PipeLinkageData> pldListofOne = new ArrayList();
// make an ArrayList of one
pldListofOne.add(pld);
int howMany = 1000000;
JavaRDD<DropResult> nSizedRDD = spark.parallelize(pldListofOne).flatMap(new FlatMapFunction<PipeLinkageData, DropResult>()
{
public Iterable<DropResult> call(PipeLinkageData pld) {
List<DropResult> returnList = new ArrayList();
// is Spark good at spreading a for loop like this?
for ( int i = 0; i < howMany ; i++ ){
returnList.add(pld.doDrop());
}
// EDIT changed from returnRDD to returnList
return returnList;
}
});
另一个问题:JavaRDD在这里是否正确?我可以看到需要调用FlatMapFunction,但我不需要FlatMappedRDD?由于我从不尝试将一组数组或列表压缩为单个数组或列表,我是否真的需要压扁任何内容?
答案 0 :(得分:1)
第一种方法应该与DropResult
一样长,并且可以序列化PipeLinkageData
并且内部逻辑没有问题(例如取决于共享状态)。
当前形式的第二种方法没有意义。将在单个分区上处理单个记录。这意味着整个过程将完全顺序,如果数据不适合单个工作器内存,则可能会崩溃。越来越多的元素应该解决问题,但在第一种方法上没有改进
最后,您可以初始化一个空的RDD,然后使用mapPartititions
替换FlatMapFunction
几乎相同的MapPartitionsFunction
,并为每个分区生成所需数量的对象。