在火花程序中,我首先初始化了2个RDD,然后在while循环中使用第二个RDD,如下所示:
var nodes = sc.parallelize(ArrayBuffer(1, 2, 3, 4, 5))
var node_GroupIDs = nodes.map(x=>(x, UUID.randomUUID()))
var i = 0
while (i < 10) {
node_GroupIDs.foreach(println)
i += 1
}
我在不同的迭代中发现某个节点ID,相应的组ID具有不同的值。似乎在每次迭代中RDD已经再次初始化。 在这种情况下,如何为节点分配固定的UUID值?
答案 0 :(得分:2)
我建议您缓存RDD以便始终获得相同的结果。实际上,正在发生的事情是每次有一个动作时重新计算RDD:即每次调用public Clock() {
initComponents();
Calendar cal = new GregorianCalendar();
int second = cal.get(Calendar.SECOND);
int minute = cal.get(Calendar.MINUTE);
int hour = cal.get(Calendar.HOUR_OF_DAY);
/////////////////////////////////////////////////////////////
if (second < 10){
time.setText(" "+hour+": "+minute+":0"+second+"");
}
else if (minute < 10){
time.setText(" "+hour+":0"+minute+": "+second+"");
}
else if (hour < 10){
time.setText("0"+hour+": "+minute+": "+second+"");
}
else if (hour < 10 & minute < 10){
time.setText("0"+hour+":0 "+minute+": "+second+"");
}
else if (minute < 10 & second < 10){
time.setText(" "+hour+":0"+minute+":0"+second+"");
}
else if (hour < 10 & minute < 10 & second < 10){
time.setText("0"+hour+":0"+minute+":0"+second+"");
}
else {
time.setText(hour + " : " + minute + " : " + second+"");
}
////////////////////////////////////////////////////////////////
}
方法时,每一步都从头开始重新计算,{{ {1}}和foreach
。
如果parallelize
之后的map
RDD,则会在第一次调用cache
操作时计算一次。然后结果保存在内存中,其他map
操作将读取缓存在内存中的结果,您将得到相同的结果。
正如@David Griffin指出的那样,如果遗嘱执行人崩溃,这将无法解决问题。为了涵盖这种情况,在缓存之后需要foreach
(请参阅https://issues.apache.org/jira/browse/SPARK-8582)。
因此,解决问题的正确方法应该是:
foreach