目前,当我想在Spark中生成数据时,我会这样做:
//generates an array list of integers 0...999
final List<Integer> range = range(1000);
JavaRDD<Data> rdd = sc
.parallelize(range)
.mapPartitionsWithIndex(generateData(), false);
对于足够大的范围,我的内存耗尽(例如5亿)。
如何解决这个问题?
答案 0 :(得分:4)
内存不足的主要原因是您从驱动程序计算机生成随机数据并将其并行化到其他计算机。
final List<Integer> range = range(1000);
此行生成随机的整数列表,该列表在单个计算机的内存中保留。 (请注意,这是Java代码,您没有运行spark API来生成随机数据) 这是不可取的,因为可能你想要的是生成超过单机内存量的数据。
所以你需要做的就是告诉spark的每个worker(slave)节点自己生成随机数据。
如果您只想测试随机数据, Spark mllib具有很好的功能,你可以使用。 (下面的代码是从mllib documentation复制的)
import org.apache.spark.SparkContext;
import org.apache.spark.api.JavaDoubleRDD;
import static org.apache.spark.mllib.random.RandomRDDs.*;
JavaSparkContext jsc = ...
JavaDoubleRDD u = normalJavaRDD(jsc, 1000000L, 10);
输出RDD现在包含100万个使用标准正态分布生成的Double值,这些值分布到10个parititons
答案 1 :(得分:0)
对不起,如果答案已经过时,也许对其他人有帮助。
sc.parallelize(0 to 1000000)
它返回RDD [Int]