【问题标题】:Batched API call inside apache spark?apache spark内的批处理API调用?
【发布时间】:2017-05-05 22:22:09
【问题描述】:

我是 Apache Spark 的初学者,我确实有以下任务:

我正在从数据源读取记录 - 在 spark 转换中 - 需要通过调用外部 Web 服务的数据来增强这些记录,然后才能对其进行进一步处理。

webservice在一定程度上会接受并行调用,但一次只允许发送几百条记录。此外,它很慢,因此尽可能多地进行批处理和并行请求肯定会有所帮助。

有没有办法以合理的方式用火花做到这一点?

我想到了读取记录,将它们预处理到另一个数据源,然后一次读取“API-Queue”数据源 500 条记录(如果可能有多个进程)并将记录写入下一个数据源,并使用这个结果数据源做最后的转换。

需要遵守这些奇怪限制的唯一地方是在 API 调用中(这就是为什么我认为一些中间数据格式/数据源是合适的)。

你有什么想法或方向吗?

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

    您可以使用 mapPartition 执行此操作,请参阅此问题:

    Whats the Efficient way to call http request and read inputstream in spark MapTask

    mapPartition 每个分区运行一次,因此您可以让 setup/teardown 代码运行一次。在 mapPartition 之前进行合并,以将分区数量减少到 Web 服务可以轻松支持的并发级别。

    您可能希望首先对 RDD 进行排序以避免针对给定键多次调用 web 服务,对 mapPartition 进行适当的编码以避免重复点击同一个键。

    【讨论】:

      【解决方案2】:

      如果您在 RDD 处理中调用外部 API,则每个 Spark 执行器都会并行进行调用。如果您考虑一下,这就是您想要快速处理数据的原因。

      如果你想在你这边弥补 API 的迟钝,你可以在你这边安装一个缓存服务器来处理重复的请求,比如 memcache,例如: http://memcached.org/

      【讨论】:

      • 好的,我会在执行器内部捕获任何“超出请求限制”的错误,并使用退避机制进行重试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2017-09-20
      相关资源
      最近更新 更多