【问题标题】:Parallelization/Cluster Options For Code Execution代码执行的并行化/集群选项
【发布时间】:2011-06-15 21:31:28
【问题描述】:

我来自 java 背景,遇到了一个 CPU 绑定问题,我正在尝试并行化以提高性能。我已经分解了我的代码以模块化方式执行,以便它可以以并行方式分布和运行(希望如此)。

@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public void runMyJob(List<String> some params){
  doComplexEnoughStuffAndWriteToMysqlDB();
}

现在,我一直在考虑以下选项来并行化这个问题,我想了解人们在这方面的想法/经验。

我目前正在考虑的选项:

1) 使用 Java EE(例如 JBoss)集群和 MessageDrivenBeans。 MDB 位于集群中的从属节点上。每个 MDB 都可以选择一个启动上述工作的事件。 AFAIK Java EE MDB 由应用服务器多线程处理,因此希望它也能够利用多核。因此它应该是垂直和水平可扩展的。

2) 我可以考虑使用 Hadoop 和 Map Reduce 之类的东西。我在这里担心的是我的作业处理逻辑实际上是相当高级的,所以我不确定它对 Map Reduce 的可翻译性。另外,我是 MR 的新手。

3) 我可以看看 Scala 之类的东西,我相信它可以让并发编程变得更简单。然而,虽然这是垂直可扩展的,但它不是集群/水平可扩展的解决方案。

无论如何,希望所有这些都是有意义的,非常感谢您提供的任何帮助。

【问题讨论】:

  • Akka 为 Scala 提供了强大的远程 actor 功能,所以我不确定说 Scala 不是水平可扩展的是否公平。 (事实上​​,即使是核心 Scala 库也提供了对远程参与者的一些支持。)
  • 嗨,Rex,谢谢,这正是我想我不太了解的类型。那么,使用 scala 和 Akka 跨节点分配作业是否容易?你会推荐它而不是使用 JBoss 集群吗?
  • 恐怕也不够了解推荐;我只知道这是一种可能。

标签: scala jakarta-ee architecture mapreduce cluster-computing


【解决方案1】:

你应该看看spark。 它是一个用 Scala 编写的集群计算框架,旨在成为 Hadoop 的可行替代方案。 它有许多不错的壮举:

  • 内存计算:您可以控制缓存的程度
  • Hadoop 输入/输出互操作性:Spark 可以从所有 Hadoop 输入源(例如 HDFS、EC2 等)读取/写入数据。
  • “弹性分布式数据集”(RDD) 的概念允许您直接在集群上并行执行大多数 MR 风格的工作负载,就像您在本地执行的操作一样
  • 主要 API = Scala、可选的 Python 和 Java API
  • 它利用了 Akka :)

如果我正确理解您的问题,Spark 会结合您的选项 2) 和 3)。

【讨论】:

    【解决方案2】:

    您正在寻找的解决方案是 Akka。集群是一项正在开发的功能,通常会包含在 Akka 2.1 中

    • 优秀的 Scala 和 Java Api,非常完整
    • 纯面向消息的模式,没有共享状态
    • 抗故障且可扩展
    • 非常容易分配工作

    如果您仍然准时,请摆脱 J2EE。非常欢迎您加入 Akka 邮件列表来提出您的问题。

    【讨论】:

      猜你喜欢
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多