JAVA 单机分布式处理(讽刺我知道)

JAVA Distributed processing on a single machine (Ironic i know)

我正在创建一个(半)大数据分析应用程序。我正在使用 apache-mahout。我担心使用 java,我的内存限制为 4gb。这个 4gb 的限制似乎有点浪费现代计算机可以使用的内存。作为解决方案,我正在考虑使用 RMI 或某种形式的 MapReduce。 (到目前为止,我还没有任何经验)

首先:在一台机器上安装多个 JVM 运行 并让它们对话是否合理?如果是的话,我上面提到的两个想法是否朝着正确的方向前进?

此外,

为了让这个问题成为 objective 问题,我会避免问 "Which is better" 而会问:

1) 主要区别是什么(不一定是它们在内部的工作方式,而是它们将如何由我(用户)实施)

2) 哪一种有缺点或好处吗?在某些情况下会使用其中一种吗?

3) 是否有另一种选择更符合我的需求?

提前致谢

首先,关于 4GB 的限制,查看 Understanding max JVM heap size - 32bit vs 64bit。在 32 位系统上,4GB 是最大的,但在 64 位系统上,限制要高得多。

在同一台机器上安装多个 jvm 运行并进行通信是一种常见的配置。两个很好的例子是 IBM Websphere 和 Oracle 的 Weblogic 应用程序服务器。它们 运行 一个 jvm 中的管理控制台,控制三个或更多 "working" jvm 并不罕见。

这允许每个 JVM 独立失败而不影响整个系统的反应性。恢复对最终用户是透明的,因为一些 "working" jvm 仍在做他们的事情,而支持团队正在疯狂地尝试修复问题。

您提到了 RMI 和 MapReduce,但在某种程度上暗示它们填充了体系结构(通信)中的相同位置。我认为有必要指出它们填补了不同的位置——RMI 是一种通信机制,而 MapReduce 是一种工作负载管理策略。 MapReduce 环境作为一个整体通常依赖于具有(任何)通信机制,但它本身并不是一个。

对于通信层,您的一些选择是 RMI、Web 服务、裸套接字、MQ、共享文件和臭名昭著的 "sneaker net"。在很大程度上,我建议回避 RMI,因为它相对脆弱。只要没有意外发生,它就可以正常工作,但在繁忙的生产环境中,它可能会在意想不到的时候带来挑战。话虽如此,围绕 RMI 构建了许多稳定且高性能的大型系统。

本周世界跨层通信的方向是在 spring 集成或融合之类的东西之上的 SOA。 SOA 将通信机制从等式中抽象出来,让您可以(或多或少)即时连接事物。

MapReduce (MR) 是一种组织批处理工作的方式。 MR 算法本身本质上是将输入数据转换为输入上的一堆映射,然后将其减少到产生输出所需的最小数量。 MR 环境通常由工作负载管理器管理,该工作负载管理器接收作业并将作业中的工作分配到分散在网络中的 "worker bees"。通信机制可以由 MR 库定义,或者由它 运行 所在的容器定义。

这有帮助吗?