没有webservice的大查询cron作业

时间:2017-10-13 22:08:58

标签: python google-app-engine cron google-bigquery

是否可以在不运行google app engine webservice的情况下运行处理用户数据的脚本?

使用较小的脚本可以很好地工作但是当我的脚本持续大约40分钟时,我收到错误:MAP_FIXED

我的临时修复是在Windows VM上使用Windows调度程序,在python脚本中使用命令行

编辑:已添加代码

DeadlineExceededError

2 个答案:

答案 0 :(得分:2)

默认情况下,App Engine服务使用automatic scaling,其对HTTP请求的限制为60秒,对任务队列请求的限制为10分钟。如果您将服务更改为使用基本或手动扩展,那么您的任务队列请求最多可以运行24小时。

听起来您可能只需要一个实例来完成这项工作,因此除了默认服务之外,还可以创建第二个service。在子文件夹中,使用以下bqservice设置创建app.yaml文件夹,该设置使用最多一个实例的基本缩放:

# bqsservice/app.yaml
# Possibly use a separate service for your BQ code than
# the rest of your app:
service: bqservice
runtime: python27
api_version: 1
# Keep low memory/cost B1 class?
instance_class: B1
# Limit max services to 1 to keep costs down. There is an
# 8 instance hour limit to the free tier. This option still
# scales to 0 when not in use.
basic_scaling:
  max_instances: 1

# Handlers:
handlers:
- url: /.*
  script: main.app

然后在同一服务中创建cron.yaml以安排脚本运行。使用上面的示例配置,您可以将BigQuery逻辑放入main.py文件中,并在其中定义WSGI应用程序:

# bqservice/main.py
import webapp2

class CronHandler(webapp2.RequestHandler):

    def post(self):
       # Handle your cron work
       # ....

app = webapp2.WSGIApplication([
    #('/', MainPage),  # If you needed other handlers
    ('/mycron', CronHandler),
], debug=True)

如果您不打算将App Engine应用程序用于其他任何事情,则可以将此全部用于默认服务。如果除了默认服务之外还执行此操作,则首先需要将某些内容部署到默认服务,即使它只是一个带有静态文件的简单app.yaml

答案 1 :(得分:0)

大多数BigQuery操作都可以异步运行。你能告诉我们你的代码吗?

例如,来自Python BigQuery文档:

begin()

这是一个异步作业,代码选择等待查询完成。而不是等待,在if之后获取作业ID。您可以使用Task Queue将任务排入队列,以检查该作业的结果。