【问题标题】:Suggested way to process google cloud sql处理谷歌云sql的建议方式
【发布时间】:2014-02-23 00:53:58
【问题描述】:

我需要运行的任务是处理我的谷歌云 sql 中的所有数据并将文件从 blobstore 复制到谷歌云存储。 我正在考虑使用任务队列,但它有 10 分钟的时间限制,但我的任务必须比这更长。 我不确定是否可以使用 mapreduce,因为我不需要并行运行,而且我还没有找到任何对云 sql 的 mapreduce 支持。 那么在应用引擎上进行这种数据处理的建议方法是什么,尤其是对于云 sql?

【问题讨论】:

  • Blobstore 和 Google Cloud Storage 在这里的作用是什么?

标签: google-app-engine google-cloud-sql


【解决方案1】:

选项 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)

这实际上类似于 Google 提供的 mapreduce 实现的工作方式,只是它没有分片。

最好在处理当前行之前将任务排入队列以增加并行性,但在这种情况下,您需要解决任务在中间失败并重新启动的情况,App Engine 的任务队列自动执行。一个好的解决方案可能是仅在扫描表时排队处理,而不是立即执行,即enqueueProcessing(row) 而不是process(row)。这样,您将快速为所有行创建任务,这些任务将能够并行运行。

选项 2

使用 B 实例(以前称为 backends)。您可以将您的工作人员部署为 B 实例上的单独 module。对 B 实例的请求可以无限期地运行。但是,您仍然需要应对意外停机。如果实例获得shut down,您的工作应该能够保存状态并从中断处继续。

选项 3

将您的数据加载到数据存储中,然后使用提供的 mapreduce 实现。

这可能是一个非常缓慢且成本高昂的解决方案,但您没有说明您想对您的数据做什么,所以我会解释一下,以防您确实需要从 Google Cloud SQL 迁移。

您可以从 MySQL 将数据以 CSV 格式导出到您的计算机上:How to output MySQL query results in csv format?
您可以将其上传到数据存储区:Uploading the data to App Engine

所有链接都指向 Python 文档,因为您没有说明您使用的是哪种语言。不过,这些原则将成立。

【讨论】:

    【解决方案2】:

    您可以使用 IP 连接从任何位置(包括 Google Compute Engine)访问 Cloud SQL。这是避免 App Engine 时间限制同时仍靠近 Google 服务器的最佳方式。

    【讨论】:

      猜你喜欢
      • 2020-09-14
      • 2020-10-03
      • 2022-12-23
      • 2019-01-29
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多