我需要运行的任务是处理我的谷歌云sql中的所有数据,并将文件从blobstore复制到谷歌云存储。我正在考虑使用任务队列,但它有10分钟的时间限制,但我的任务必须比这更长。我不确定是否可以使用mapreduce,因为我不需要并行运行,而且我还没有发现任何对云sql的mapreduce支持。那么,在应用程序引擎上进行这种数据处理的建议方法是什么,尤其是对于云sql?
选项1
让每个MySQL数据行由一个单独的任务处理。这样,您就不必担心处理时间,因为每行有10分钟的时间。
如果您的表中有顺序ID,那么这应该非常简单。否则,您可以通过添加一个auto_increment列来创建它们。
你的任务可能看起来像这样(伪代码):
function enqueueTask(int rowId)
# id >= rowId to cater to deleted rows
row = query('SELECT ... WHERE id >= rowId ORDER BY rowId LIMIT 1')
# If the row exists (might have been deleted), do whatever you need with it
# and create a task for the next row
process(row)
# Use the ID of the current row to create a task for the next one
enqueueTask(row.id + 1)
enqueueTask(1)
这实际上类似于谷歌提供的mapreduce实现的工作方式,只是它没有被分片。
在处理当前行之前,最好将任务排入下一行的队列,以增加并行性,但在这种情况下,您需要适应任务在中间失败并重新启动的情况,而应用程序引擎的任务队列会自动执行这种情况。一个好的解决方案可能是在扫描表时只对处理进行排队,而不是立即进行,即enqueueProcessing(row)
而不是process(row)
。这样,您将快速为所有行创建任务,这些任务将能够并行运行。
选项2
使用B实例(以前称为后端)。您可以在B实例上将您的worker部署为一个单独的模块。对B实例的请求可以无限期运行。然而,你仍然需要迎合意想不到的停顿。你的worked应该能够保存状态,并在实例关闭的情况下从它停止的地方恢复。
选项3
将数据加载到数据存储中,然后使用提供的mapreduce实现。
这可能是一个非常缓慢和昂贵的解决方案,但你没有说你想对你的数据做什么,所以我会解释一下,以防你真正想要的是从谷歌云SQL迁移。
从MySQL,您可以将CSV格式的数据导出到您的计算机上:如何以CSV格式输出MySQL查询结果
您可以上传到数据存储:将数据上传到应用程序引擎
所有链接都指向Python文档,因为您没有说明您使用的是哪种语言。不过,这些原则仍然适用。
您可以从任何地方使用IP连接访问云SQL,包括谷歌计算引擎。这是避免应用程序引擎时间限制的最佳方法,同时仍然靠近谷歌服务器。