apache spark里面的批量API调用?

时间:2016-02-03 05:41:45

标签: apache-spark

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

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

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

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

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

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

您想要指出的任何想法或方向?

2 个答案:

答案 0 :(得分:3)

如果在RDD处理中调用外部API,则每个Spark执行程序将并行调用。如果您考虑它,那么您需要快速处理数据。

如果您希望弥补API的缓慢,您可以安装一个缓存服务器来处理重复请求,例如memcache,例如: http://memcached.org/

答案 1 :(得分:3)

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

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

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

您可能希望首先对RDD进行排序,以避免为给定密钥多次调用Web服务,对mapPartition进行适当编码以避免重复敲击相同的密钥。