我正在尝试为我们试图解决的遗传问题建模,并逐步加以解决。我可以从Spark示例成功运行PiAverage示例。该示例将一个圆圈“掷飞镖”(在本例中为10 ^
6),并计算“落在圆圈中”的数量以估算PI
假设我要重复该过程1000次(并行),并对所有这些估计求平均值。我正在尝试寻找最好的方法,似乎会有两个调用要并行化?嵌套通话?有没有办法将地图链接或减少通话数量?我看不到
我想知道以下想法的智慧。我想到了使用累加器跟踪结果估算。jsc是我的SparkContext,单次运行的完整代码在问题末尾,谢谢您的投入!
Accumulator<Double> accum = jsc.accumulator(0.0);
// make a list 1000 long to pass to parallelize (no for loops in Spark, right?)
List<Integer> numberOfEstimates = new ArrayList<Integer>(HOW_MANY_ESTIMATES);
// pass this "dummy list" to parallelize, which then
// calls a pieceOfPI method to produce each individual estimate
// accumulating the estimates. PieceOfPI would contain a
// parallelize call too with the individual test in the code at the end
jsc.parallelize(numberOfEstimates).foreach(accum.add(pieceOfPI(jsc, numList, slices, HOW_MANY_ESTIMATES)));
// get the value of the total of PI estimates and print their average
double totalPi = accum.value();
// output the average of averages
System.out.println("The average of " + HOW_MANY_ESTIMATES + " estimates of Pi is " + totalPi / HOW_MANY_ESTIMATES);
我在SO上看到的矩阵或其他答案似乎并没有给出该特定问题的答案,我进行了几次搜索,但是如果不“并行化并行化”,我将看不到如何做到这一点。那是个坏主意吗?
(是的,我从数学上意识到我可以做更多的估算并有效地获得相同的结果:)试图建立老板想要的结构,再次感谢!
如果没有帮助,我将整个测试程序放在这里,如果没有测试过的累加器。其核心将成为PieceOfPI():
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.apache.spark.Accumulable;
import org.apache.spark.Accumulator;
import org.apache.spark.SparkContext;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.storage.StorageLevel;
import org.apache.spark.SparkConf;
import org.apache.spark.storage.StorageLevel;
public class PiAverage implements Serializable {
public static void main(String[] args) {
PiAverage pa = new PiAverage();
pa.go();
}
public void go() {
// should make a parameter like all these finals should be
// int slices = (args.length == 1) ? Integer.parseInt(args[0]) : 2;
final int SLICES = 16;
// how many "darts" are thrown at the circle to get one single Pi estimate
final int HOW_MANY_DARTS = 1000000;
// how many "dartboards" to collect to average the Pi estimate, which we hope converges on the real Pi
final int HOW_MANY_ESTIMATES = 1000;
SparkConf sparkConf = new SparkConf().setAppName("PiAverage")
.setMaster("local[4]");
JavaSparkContext jsc = new JavaSparkContext(sparkConf);
// setup "dummy" ArrayList of size HOW_MANY_DARTS -- how many darts to throw
List<Integer> throwsList = new ArrayList<Integer>(HOW_MANY_DARTS);
for (int i = 0; i < HOW_MANY_DARTS; i++) {
throwsList.add(i);
}
// setup "dummy" ArrayList of size HOW_MANY_ESTIMATES
List<Integer> numberOfEstimates = new ArrayList<Integer>(HOW_MANY_ESTIMATES);
for (int i = 0; i < HOW_MANY_ESTIMATES; i++) {
numberOfEstimates.add(i);
}
JavaRDD<Integer> dataSet = jsc.parallelize(throwsList, SLICES);
long totalPi = dataSet.filter(new Function<Integer, Boolean>() {
public Boolean call(Integer i) {
double x = Math.random();
double y = Math.random();
if (x * x + y * y < 1) {
return true;
} else
return false;
}
}).count();
System.out.println(
"The average of " + HOW_MANY_DARTS + " estimates of Pi is " + 4 * totalPi / (double)HOW_MANY_DARTS);
jsc.stop();
jsc.close();
}
}
让我从您的“背景问题”开始。变换操作喜欢map
,join
,groupBy
等分为两类;
那些需要从所有分区中输入数据进行洗牌的企业,而那些不需要。像操作groupBy
和join
需要洗牌,因为你需要把所有的RDD的相同的按键分区所有记录(想想如何SQL的JOIN
和GROUP BY
OPS工作)。在另一方面,map
,flatMap
,filter
,等不需要洗牌,因为操作的工作原理上一步的分区的输入罚款。它们一次只能处理单个记录,而不是具有匹配键的一组记录。因此,不需要改组。
要了解“额外地图”没有明显的开销,此背景是必需的。诸如map
,flatMap
等之类的一系列操作被“压缩”到一个“阶段”(当您在Spark
Web控制台中查看作业的详细信息时将显示该阶段),以便仅实现一个RDD,最后一个实现舞台。
关于您的第一个问题。我不会为此使用累加器。它们用于“边带”数据,例如计算要分析的坏行数。在此示例中,作为示例,您可能使用累加器来计算在1半径内与在1半径内的对(x,y)对。
JavaPiSpark
Spark发行版中的示例已尽善尽美。您应该研究它为什么起作用。这是大数据系统的正确数据流模型。您可以使用“聚合器”。在Javadocs中,单击“索引”的一下agg
,aggregate
和aggregateByKey
功能。但是,它们不再是可以理解的,在这里也没有必要。他们提供更大的灵活性比map
随后reduce
,所以他们是值得了解的
代码的问题在于,您实际上是在试图告诉Spark该怎么做,而不是表达您的意图并让Spark优化它为您执行的方式。
最后,我建议您购买和研究O’Reilly的“ Learning Spark”。它很好地解释了内部细节(例如暂存),并显示了许多示例代码,您也可以使用。
如果不是这样,请给我一个简单的例子。
问题内容: 这是由于尝试使我的html语义尽可能正确而导致的问题。 我有一个父按钮,它在同一页面中既起作用,又充当嵌套锚的大容器的父标签(重定向到另一个页面),而div标签又充当另一个按钮的父标签应该执行一些动作。 我尝试嵌套按钮,为它提供了一个类和ID,但我没有应用到该类的任何属性,并且对子按钮也没有执行ID,更多情况下,子按钮也完全脱离了大容器并放置在DOM就像它是一个完全独立的标记,没有其他
我想知道是否有可能把代码的这个语句变成一个三元if语句。 我试过这样格式化它--但不认为它很管用。
问题内容: 有什么方法可以轻松解决此问题,或者我真的需要重写所有旧代码吗? PHP致命错误:第30行的…中的调用时传递引用已被删除 当变量在整个代码中作为引用传递给函数时,这种情况随处可见。 问题答案: 您应该在函数定义中通过引用表示调用,而不是实际调用。由于PHP在5.3版中开始显示弃用错误,因此我想重写代码是一个好主意。 从文档中: 函数调用上没有参考符号-仅在函数定义上。 仅函数定义就足以正
我想使用spring-boot-starter,但这意味着我必须使用“spring-boot-starter-parent”pom,而不能使用公司广泛使用的root pom。
问题内容: 嗨,我有一个要导入的INFILE,但是日期的格式为: 是否有任何简单的方法可以将日期转换为“ 2012-04-03”,而无需执行诸如先使用perl脚本打开日期,转换日期然后再次将文件写回的操作? TIA! 问题答案: 这将在一个步骤中加载和转换,不需要另一张表。有关更多信息,请参见手册。