Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spark中嵌套并行化?什么';这是正确的方法吗?_Java_Parallel Processing_Apache Spark_Nested - Fatal编程技术网

Java 在Spark中嵌套并行化?什么';这是正确的方法吗?

Java 在Spark中嵌套并行化?什么';这是正确的方法吗?,java,parallel-processing,apache-spark,nested,Java,Parallel Processing,Apache Spark,Nested,嵌套并行化 假设我正在尝试在Spark中执行“嵌套for循环”的等效操作。类似于在常规语言中,假设我在内部循环中有一个例程来估计Pi 背景:我,在胡言乱语之后,我决定用一个不同的描述来发布一个新问题。我也有,但也没有骰子。提前感谢您的帮助。这甚至不可能,因为SparkContext不可序列化。如果需要嵌套for循环,那么最好的选择是使用cartesian val nestedForRDD = rdd1.cartesian(rdd2) nestedForRDD.map((rdd1TypeVal,

嵌套并行化

假设我正在尝试在Spark中执行“嵌套for循环”的等效操作。类似于在常规语言中,假设我在内部循环中有一个例程来估计Pi


背景:我,在胡言乱语之后,我决定用一个不同的描述来发布一个新问题。我也有,但也没有骰子。提前感谢您的帮助。

这甚至不可能,因为
SparkContext
不可序列化。如果需要嵌套for循环,那么最好的选择是使用
cartesian

val nestedForRDD = rdd1.cartesian(rdd2)
nestedForRDD.map((rdd1TypeVal, rdd2TypeVal) => {
  //Do your inner-nested evaluation code here
})
请记住,就像双倍
循环一样,这需要付出一定的成本。

不,你不能


SparkContext只能从spark驱动程序节点访问。内部parallelization()调用将尝试从无法访问SparkContext的工作节点执行SparkContext。

在Pi示例中,在嵌套的for循环中,通过对进程i*j次执行一个循环,并对所有这些循环求和,最后除以j,可以得到相同的答案。如果要在外部循环中应用步骤,请在循环中执行这些步骤,但通过为每个内部循环组指定特定的键来创建不同的组。如果不知道你想在外循环中做什么,这里很难给出一个例子

对于仅求平均值以提高收敛性的简单情况,它相对容易。不要执行嵌套循环,只需使用i*j元素创建rdd,然后将函数应用于每个元素

这可能看起来像(使用pySpark): (f是您想要应用的任何函数,请记住它将传递RDD中的每个元素,因此使用输入定义f,即使您在函数中不使用它)

如果您想在外部循环中执行操作,我会分配一个索引(zipWIthIndex),然后使用索引模j创建一个键。然后,每个不同的键将是一个单独的虚拟内循环,您可以使用aggregateByKey、foldByKey或reduceByKey等操作符仅对这些记录执行操作。如果不同的密钥被分配到不同的分区,那么这可能会对性能造成一定的影响

另一种方法是将rdd重新分区到j分区上,然后使用foreachPartition函数将函数应用于每个分区


第三种选择是并行运行内循环j次,将结果连接到一个分布式文件中,然后在将其读入Spark后执行外循环操作。

谢谢,我没有想到并行化是不可序列化的,非常有用!我想到了笛卡尔,但实际上我不需要建立笛卡尔集,我只需要收集每个Pi估计的结果。笛卡尔会不会有很大的开销?是的,我们的最终分析是在遗传学上,将在10^13计算的顺序上。而且,如果我有这个权利的话,我只是在学习,因为Spark RDD实际上不能包含超过MAXINT的元素,看起来2.147 x 10^9将排除笛卡尔,导致RDD包含超过MAXINT的元素。这一限制仍然很明确,但它似乎是Scala集合所能容纳的。如果我学到了不同的东西,我会更新这个。这个澄清真的很有帮助,而且可能很明显,我在任何地方都没有读到。谢谢,我没看到。我仍然在寻找一种方法来做到这一点,另一个答案是笛卡尔的,但我不需要完整的集合,只需要得到每个平均值的结果,看看它们是否收敛。关于我如何实现我想要的目标有什么想法吗?没有收到两位提供答案(这确实澄清了我的方法是错误的),但没有提供可用的替代方案的人的回复。我确实收到了当地社区某个人的回复,并发布了基于此的答案。如上所述,这是来自SLC地区的当地Spark专家。
// use accumulator to keep track of each Pi Estimate result

sparkContext.parallelize(arrayOf1000, slices).map{ Function call

     sparkContext.parallelize(arrayOf10^6, slices).map{
            // do the 10^6 thing here and update accumulator with each result
    }
}

// take average of accumulator to see if all 1000 Pi estimates converge on Pi
val nestedForRDD = rdd1.cartesian(rdd2)
nestedForRDD.map((rdd1TypeVal, rdd2TypeVal) => {
  //Do your inner-nested evaluation code here
})
x = RandomRDDs.uniformRDD(sc, i*j)
function_values = x.map(f)

from operator import add   
sum_of_values = function_values.reduce(add)
averaged_value = sum_of_values/j (if you are only averaging over the outer loop)