我想更改当前的 Java 项目以通过 Apache Spark 分发工作。 我正在构建一个运动结果模拟器 - 目前该项目看起来有点像这样:
Controller 类 模拟器类 游戏状态类
Controller 类负责处理所有用户输入并编辑 GameState。 每当 GameState 发生变化并计算出新结果时,就会调用模拟器的 run 方法。 我已经进行了分析和优化,并将模拟器类并行化到 CPU 上的所有线程上,但在进行许多模拟时它仍然太慢 - 因此需要扩展 CPU 核心。
我正在尝试学习 MapReduce 和 Spark 的基础知识,并且我了解基本的字数统计示例。是否有一组稍微复杂的示例可供我使用?我想我需要找到一种将 GameState 广播到每个节点、运行模拟然后返返回告的方法。
但是我可以将 GameState 类的实例包装为 RDD 吗?我可以将模拟器的运行方法包装为某种映射函数吗?我不确定 Spark 在这些情况下能发挥什么作用..
最佳答案
Spark 和 MapReduce 的强大之处在于能够将函数应用于具有相同结构的大量数据行来转换或减少它们。例如,读取温度读数并查找每个城市的最高温度。这些技术的可扩展性来自于这样一个事实:您根本不在并行进程之间共享状态。例如,如果您有一个所有工作人员都需要的查找表,但您无法更新一个工作人员的状态并使其对另一个工作人员可见,您可以在一开始就提供相同的支持数据。
模拟并不自然适合 Spark/MR,因为它们通常需要您正在更新的某种全局状态。话虽这么说,这取决于您在模拟更新步骤中需要进行哪些计算。如果有很多独立的计算,那么你也许能够让它工作。
另一条评论是,在 Spark 中运行阶段是有成本的。在实际运行之前需要一些时间来设置舞台。这意味着 Spark 通常不太适合需要大量快速背靠背计算的情况。如果您可以为其提供大量需要一些时间来消化的数据,那就更好了。
你可以看看其他技术。例如,Akka 是一个非常可靠的并行处理库,可让您轻松地跨多台机器创建线程/进程并与之通信。 Spark 在内部使用它来管理其分布式进程。
如果不了解更多关于模拟问题和设计的信息,就很难给出更具体的建议。
关于java - 使用 Apache Spark 运行运动模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49897035/