java - 使用 Spark 集群通过不可靠的 Java 应用程序有效地运行排队处理
问题描述
我有以下设置:
- “要计算的东西”的网络源/队列(其中“东西”只是指向需要处理的实际数据的指针)
- Java/Kotlin 应用程序为“事物”读取数据,为单个“要计算的事物”进行计算,并将数据写入相同的网络源,全部在内部进行。通过写入结果,“要计算的东西”被认为由网络源完成并从队列中删除。
- 具有免费资源的 Apache Spark 集群(v2.4.6,2 个工作人员)。
注意事项:
- (2) 使用外部 api,因此有时会失败
- (2) 的执行时间在几秒到几分钟的范围内
- “要计算的东西”包含 group_id 属性。禁止计算具有相同 group_id 的两件事。
- 计算应尽快完成
- 应尽量减少使用的火花资源,因为其他火花作业在同一集群上运行
我当前的解决方案有效,但使用资源的效率非常低(工作人员的资源通常被锁定但没有被积极使用),以至于在单台机器上运行会更好。
火花作业的当前实现:
while(true) {
val rdd = ctx.parallelize(networkGrabFirstThingToDoForEachGroup(limit = 100))
rdd.foreachPartition { things =>
things.foreach { thing =>
informNetworkSourceOfProcessingAttempt(thing) // increments attemptsCount for the thing,
// which determines if and when the thing will reappear in the queue for another try
tryProcessingCatchingAndLoggingAnyErrors(thing)
}
}
解决方案
推荐阅读
- docker - 为什么 docker 容器不支持 sudo 或 systemd?
- css - 不希望 Textarea 过渡适用于调整大小
- r - 使用 dplyr 按行计算百分位数时出错
- r - dyn.load 中的“RCurl”加载失败:无法加载共享对象 - Rstudio - openSuse
- php - .htaccess (?) 子文件夹后缺少斜杠的问题
- xquery - 是否有可能每次使用 xdmp:random() 或 Marklogic 中的其他方式生成一个 6 位唯一随机数
- tally - Tally 使用哪种算法来验证输入的 GST 编号是否正确?
- c - 通过网络发送不同大小数据的最佳实践
- javascript - 无法使用 Sequelize 在数据库 SQLite-Database 中找到匹配项
- html - 固定位置干扰现场滚动