使用Spark调用进程外dll函数

Using Spark to call out-of-process dll functions

我们正在评估是否将 Spark 用于 运行 我们的网格计算,我们在处理特定用例时遇到了一些问题。想知道社区有没有什么好的想法。

我们在一个 dll 中有一个广泛的 C++ 函数库,我们需要在整个网格中使用它。 C++ 代码库很大,不是特别稳定(经常崩溃)并且保持状态(线程不安全)。因此,dll 需要脱离进程。

为了处理这个问题,我们围绕 dll 构建了一个精简的零 mq 包装器和一个精简的 scala 零 mq 客户端来处理对 dll 的请求。我们可以将 zeromq 包装的 dll 分发到网格中的所有节点。

我的问题是:这种情况可以用Spark来处理吗?如何在 RDD.map() 调用中调用 zeromq scala 客户端?如何在网格上处理这个问题?我们需要序列化 ​​zeromq 客户端吗?

非常感谢任何想法:)

您可能想要 运行 每个节点上的自定义服务器实例。然后您可以为每个分区创建一个新的客户端。你可以使用 RDD.mapPartitions 而不是 RDD.map,像这样:

rdd.mapPartitions { it =>
  val client = new MyClient("localhost:2345")
  it.map(x => client.calculate(x))
}

RDD.pipe 与面向行的包装器一起使用可能会满足您的需要。您的问题没有完全清楚约束是什么,尤其是关于库中的状态。