为了说清楚,我不是从像这样的数组/列表中寻找RDD
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7); // sample
JavaRDD<Integer> rdd = new JavaSparkContext().parallelize(list);
如何从 java 迭代器创建 Spark RDD 而无需完全缓冲它在记忆中吗?
Iterator<Integer> iterator = Arrays.asList(1, 2, 3, 4).iterator(); //sample iterator for illustration
JavaRDD<Integer> rdd = new JavaSparkContext().what("?", iterator); //the Question
附加问题:
是否要求源可重复读取(或能够多次读取)才能为 RDD 提供弹性?换句话说,由于迭代器基本上是一次性读取的,因此是否有可能从迭代器创建弹性分布式数据集(RDD)?
正如其他人所说,您可以使用 Spark Streaming 做一些事情,但对于纯粹的 Spark 来说,您不能,原因是您所要求的内容违背了 Spark 的模型。让我解释。
为了分配和并行化工作,spark 必须将其分成块。从 HDFS 读取时,HDFS 会为 Spark 完成“分块”,因为 HDFS 文件是按块组织的。 Spark 通常会为每个块生成一个任务。
现在,迭代器只提供对数据的顺序访问,因此 Spark 不可能将其组织成块无需将其全部读入内存.
也许可以构建一个具有单个可迭代分区的 RDD,但即便如此,也无法确定是否可以将可迭代的实现发送给工作人员。当使用 sc.parallelize() 时,spark 创建的分区实现serializable
因此每个分区都可以发送给不同的工作人员。可迭代可以通过网络连接或本地文件系统中的文件进行,因此除非它们缓冲在内存中,否则它们无法发送给工作人员。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)