使用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
与面向行的包装器一起使用可能会满足您的需要。您的问题没有完全清楚约束是什么,尤其是关于库中的状态。
我们正在评估是否将 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
与面向行的包装器一起使用可能会满足您的需要。您的问题没有完全清楚约束是什么,尤其是关于库中的状态。