我是Apache Spark的初学者,确实有以下任务:
我正在从数据源读取记录,在Spark转换中,需要通过调用外部Web服务来增强数据,然后才能对其进行进一步处理。
该Web服务将在一定程度上接受并行调用,但一次只允许发送几百条记录。而且,它非常慢,因此尽可能多地进行批处理和并行请求无疑在这里有所帮助。
有没有办法以合理的方式做到这一点?
我想到了读取记录,将它们预处理到另一个数据源,然后一次读取“ API-Queue”数据源500条记录(如果可能的话,可以使用多个进程),然后将记录写入下一个数据源,并使用此结果数据源做最后的转变。
在API调用中,唯一需要遵守这些怪异限制的地方(这就是为什么我认为某些中间数据格式/数据源将是合适的)。
您有什么要向我指出的想法或方向吗?
小智 7
您可以使用 mapPartition 执行此操作,请参阅此问题:
在 Spark MapTask 中调用 http 请求和读取输入流的有效方法是什么
mapPartition 每个分区运行一次,因此您可以运行一次安装/拆卸代码。在 mapPartition 之前进行合并以将分区数量减少到 Web 服务可以轻松支持的并发级别。
您可能希望首先对 RDD 进行排序以避免为给定的键多次调用 web 服务,适当地对 mapPartition 进行编码以避免重复点击相同的键。
如果您在 RDD 处理中调用外部 API,则每个 Spark 执行器都会并行执行该调用。如果您考虑一下,这就是您想要快速处理数据的方式。
如果你想补偿你这边API的迟钝,你可以在你这边安装一个缓存服务器来处理重复的请求,比如memcache,例如:http : //memcached.org/
| 归档时间: |
|
| 查看次数: |
6156 次 |
| 最近记录: |