限制来自 Spark 执行器的并发 HTTP 请求

Raf*_*Raf 7 scala akka apache-spark

我想从 Spark 作业内部向速率受限的 API 发出一些 Http 请求。为了跟踪非分布式系统(在 Scala 中)中的并发请求数,请执行以下操作:

  • 一个节流参与者,它维护一个信号量(计数器),该信号量在请求开始时递增,在请求完成时递减。尽管是分布式的,但在分布式 Spark 上下文中Akka对其进行(反)序列化存在问题。actorSystem
  • 将并行流与 fs2 结合使用:https ://fs2.io/concurrency-primitives.html => 无法分发。
  • 我想我也可以只将collect数据帧发送到 Sparkdriver并使用上述选项之一来处理限制,但我想保持分布式。

此类事情通常如何处理?

sha*_*y__ 7

您不应该尝试跨 Spark 执行器/分区同步请求。这完全违背了Spark并发模型。

相反,例如,将全局速率限制 R 除以执行程序 * 核心数,并用于mapPatitions在其 R/(e*c) 速率限制内从每个分区发送请求。