我是Apache Spark的初学者,我确实有以下任务:
我正在读取数据源中的记录 - 在spark变换中 - 需要通过调用外部Web服务的数据来增强,然后才能进一步处理它们。
webservice将在一定程度上接受并行调用,但只允许一次发送几百条记录。此外,它非常慢,所以尽可能多地进行批处理并且并行请求肯定会对此有所帮助。
是否有办法以合理的方式用火花做到这一点?
我想过读取记录,将它们预处理到另一个数据源,然后一次读取“API-Queue”数据源500条记录(如果可能的话,使用多个进程)并将记录写入下一个数据源,并使用这个结果数据源做了最后的转换。
唯一需要遵守这些奇怪限制的地方是API调用(这就是为什么我认为某些中间数据格式/数据源是合适的)。
您想要指出的任何想法或方向?
答案 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进行适当编码以避免重复敲击相同的密钥。