Spark RDD,如何生成长度为N的JavaRDD?

时间:2015-11-27 21:30:59

标签: java lambda parallel-processing apache-spark

(问题的一部分是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?由于我从不尝试将一组数组或列表压缩为单个数组或列表,我是否真的需要压扁任何内容?

1 个答案:

答案 0 :(得分:1)

  1. 第一种方法应该与DropResult一样长,并且可以序列化PipeLinkageData并且内部逻辑没有问题(例如取决于共享状态)。

  2. 当前形式的第二种方法没有意义。将在单个分区上处理单个记录。这意味着整个过程将完全顺序,如果数据不适合单个工作器内存,则可能会崩溃。越来越多的元素应该解决问题,但在第一种方法上没有改进

  3. 最后,您可以初始化一个空的RDD,然后使用mapPartititions替换FlatMapFunction几乎相同的MapPartitionsFunction,并为每个分区生成所需数量的对象。