使用Apache Spark运行运动模拟

时间:2018-04-18 10:11:39

标签: java class apache-spark distributed-computing simulator

我想更改当前的Java项目以通过Apache Spark分发工作。 我正在为体育成果建立一个模拟器 - 目前该项目看起来有点像这样:

控制器类 模拟器类 GameState类

控制器类负责所有用户输入并编辑GameState。 每当GameState改变并计算出新的结果时,就会调用模拟器的run方法。 我已经对模拟器类进行了分析和优化,并将其并行化到我CPU上的所有线程上,但在进行多次模拟时仍然太慢 - 因此需要扩展CPU内核。

我正在尝试学习Map Reduce和Spark的基础知识,并且我理解基本的单词计数示例。我可以使用一些稍微复杂的例子吗?我想我需要找到一种方法将GameState广播到每个节点,运行模拟,然后报告回来。

但是我可以将GameState类的实例包装为RDD吗?我可以将模拟器的run方法包装为某种映射函数吗?我不确定在这些情况下能有什么火花..

1 个答案:

答案 0 :(得分:1)

Spark和Map Reduce的强大之处在于能够将函数应用于具有相同结构的大量数据行来转换或减少它们。例如,读取温度读数并找到每个城市的最高温度。这些技术的可扩展性来自于您根本不在并行进程之间共享状态这一事实。例如,如果您有一个所有工作人员都需要的查找表,但您无法在一个工作程序中更新状态并使其对另一个工作人员可见,则可以在开始时提供相同的支持数据。

模拟不适合Spark / MR,因为它们通常需要某种您正在更新的全局状态。这就是说,它取决于您在模拟更新步骤中需要执行的计算。如果有很多独立的计算,那么你可以使它工作。

另外一条评论,Spark的运行阶段需要付出代价。在实际运行之前,需要一点时间设置阶段。这意味着Spark通常不适合需要大量快速背靠背计算的情况。如果你能给它一大块数据需要一些时间来咀嚼,那就更好了。

你可以看看其他技术。例如,Akka是一个非常可靠的并行处理库,可让您轻松地创建多个计算机上的线程/进程并与之通信。 Spark在内部使用它来管理它的分布式进程。

在不了解您的模拟问题和设计的情况下,很难提供更具体的建议。