Мы оцениваем, использовать ли Spark для расчета сетки, и у нас возникли проблемы с конкретным вариантом использования. Интересно, есть ли у сообщества хорошие идеи?
У нас есть обширная библиотека функций C ++ в dll, которую нам нужно использовать по всей сетке. База кода C ++ большая, не особо стабильная (часто падает) и содержит состояние (поток небезопасен). По этой причине DLL должен жить вне процесса.
Чтобы справиться с этим, мы создали тонкую оболочку с нулевым mq вокруг dll и тонкий клиент с нулевым mq для scala для обработки запросов к dll. Мы можем распределить dll, завернутый в zeromq, по всем узлам сетки.
Мой вопрос: возможно ли использовать Spark для решения этой ситуации? Как я могу делать звонки клиенту zeromq scala внутри RDD.map()
вызов? Как это может быть обработано на сетке? Нужно ли сериализовать клиент zeromq?
Любые идеи высоко ценится 🙂
Вы, вероятно, хотите запустить экземпляр своего пользовательского сервера на каждом узле. Затем вы можете создать нового клиента для каждого раздела. Вместо RDD.map
вы бы использовали RDD.mapPartitions
, что-то вроде этого:
rdd.mapPartitions { it =>
val client = new MyClient("localhost:2345")
it.map(x => client.calculate(x))
}
С помощью RDD.pipe
с линейно-ориентированной оболочкой может удовлетворить ваши потребности. В вашем вопросе не совсем ясно, какие существуют ограничения, особенно в отношении состояния в библиотеке.