1

长话短说,我有一个 Java 进程,可以从进程读取数据和向进程写入数据。我有一个 C++ 程序,它获取数据,对其进行处理,然后需要将其传递回 Java,以便 Java 可以将其写入数据库。

Java 程序从 Hadoop 中提取数据,因此一旦 Hadoop 进程启动,它就会被数据淹没,但实际处理(由 C++ 程序完成)无法一次处理所有数据。所以我也需要一种控制流量的方法。同样为了使问题复杂化(但简化我的工作),我做 Java 的东西,我的朋友做 C++ 的东西,并试图让我们的程序尽可能独立。

那就是问题所在。我发现Google协议缓冲区,在程序之间传递数据似乎很酷,但我不确定Java程序保存数据如何触发c++程序处理,然后当c++程序保存结果时,Java程序将如何被触发保存结果(这是针对一条或几条记录,但我们计划处理数十亿条记录)。

解决这个问题的最佳方法是什么?有没有一种简单的方法可以做到这一点?

4

2 回答 2

3

最简单的方法可能是使用 TCP Socket 连接。Java 程序会在您想要完成时发送,C++ 程序会发回结果。

于 2012-10-15T17:39:45.767 回答
1

由于您要扩展此解决方案,我建议使用 ZMQ。

让您的 Java 应用程序仍然从 Hadoop 中提取数据。

然后它将依次使用 PUSH 套接字将数据推出。

在这里,您将拥有尽可能多的 c++ 工作人员,他们将处理这些数据,接受作为 PULL 套接字的连接。这可以扩展到您需要的尽可能多的不同处理器/内核/等。

当每个工作人员完成后,它将通过 PUSH 套接字将结果推送到“存储”Java 程序,该程序正在接受 PULL 套接字上的信息。

它看起来像这个例子(标准的分而治之方法)

当没有任何可用的工作人员时,此过程可扩展到尽可能多的工作人员,因为您的第一个 java 程序将阻塞(但仍在处理)。只要你结束的 java 程序很快,你就会看到这个规模真的很好。

The emitting and saving program can be in the same program just use a zmq_poll device :)

于 2012-10-15T18:26:07.347 回答