当前位置: 首页 > 知识库问答 >
问题:

如何从AppEngine管道捕获BigQuery加载错误

唐兴贤
2023-03-14

我在AppEngine上构建了一个管道,将数据从云存储加载到BigQuery。这很好用。。直到出现任何错误。如何从AppEngine代码中通过BigQuery加载异常?

管道中的代码如下所示:

#Run the job
credentials = AppAssertionCredentials(scope=SCOPE)
http = credentials.authorize(httplib2.Http())
bigquery_service = build("bigquery", "v2", http=http)
jobCollection = bigquery_service.jobs()
result = jobCollection.insert(projectId=PROJECT_ID,
                              body=build_job_data(table_name, cloud_storage_files))
#Get the status
while (not allDone and not runtime.is_shutting_down()):
    try:
        job = jobCollection.get(projectId=PROJECT_ID,
                               jobId=insertResponse).execute()
        #Do something with job.get('status')
except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    logging.error(traceback.format_exception(exc_type, exc_value, exc_traceback))
    time.sleep(30)

这会给我状态错误或主要连接错误,但我正在寻找BigQuery的功能错误,例如字段格式转换错误、模式结构问题或BigQuery在尝试将行插入表时可能遇到的其他问题。

如果BigQuery这边发生任何“功能”错误,这段代码将成功运行并正常完成,但BigQuery上不会写表。发生这种情况时不容易调试...

共有2个答案

周奇文
2023-03-14

这里的关键是粘贴代码的这一部分:

except:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    logging.error(traceback.format_exception(exc_type, exc_value, exc_traceback))
    time.sleep(30)

这个“except”捕获每个异常,记录它,并让过程继续,而不考虑重新尝试。

问题是,你想做什么?至少“做点什么”评论的意图是存在的。

建议考虑应用引擎的任务队列来检查状态,而不是等待30秒的循环。当任务出现异常时,会自动重试,您可以调整该行为。

燕成双
2023-03-14

您可以使用异常中的HTTP错误代码。BigQuery是一个REST API,因此返回的响应代码与此处的HTTP错误代码描述相匹配。

下面是一些处理可重试错误(连接、速率限制等)的代码,但当错误类型超出预期时会重新引发。

  except HttpError, err:
    # If the error is a rate limit or connection error, wait and
    # try again.
    # 403: Forbidden: Both access denied and rate limits.
    # 408: Timeout
    # 500: Internal Service Error
    # 503: Service Unavailable
    if err.resp.status in [403, 408, 500, 503]:
      print '%s: Retryable error %s, waiting' % (
          self.thread_id, err.resp.status,)
      time.sleep(5)
    else: raise

如果您想要更好的错误处理,请查看bq命令行客户端中的BigqueryError类(该类以前可以在code.google.com上找到,但随着最近切换到gCloud,它已经不存在了。但是如果您安装了gCloud,则安装中应该有bq.py和bigquery\u client.py文件)。

 类似资料:
  • 问题内容: 我在Python中构建了一个简短的url转换器引擎,并且看到大量的“管道破损”错误,并且很好奇在使用BaseHTTPServer类时如何最好地捕获它。这不是全部代码,但可以让您大致了解我目前正在做什么: 该代码本身运行良好,但是在生产中几乎立即开始引发错误: 这些错误的大部分似乎源于在调用send_header()方法时遇到的问题,其中我要写的是: 所以我很好奇在我的代码中尝试捕获此I

  • 我试图运行一个BigQuery查询从谷歌AppEngine(部署)使用Python 2.7,但我看到这个错误在StackDriver的错误报告: 没有命名为云的模块 这是我的代码(main.py): 这是我的(app.yaml): 错误消息将使我假设没有导入BigQuery的库。但是,如果此代码部署在AppEngine中,那么默认情况下库不应该已经安装在AppEngine中吗? 试图解决这个问题

  • 当用PDFBox加载PDF时,如果PDF错误,则会收到日志级警告: 例如,这可能导致控制台上的以下输出: 显然,pdf在内容流中有一些错误,但它确实加载到中。但是否有可能用PDFBOX以编程方式捕获此警告?是否存在一些属性来告诉您文档加载后的警告? 我试过PDFBox-Preflight,但这会检查PDF/A是否符合,这会导致更多的消息。

  • 我正在尝试加载一个CVS,其中包含一个数据类型为“timestamp”的字段当我尝试将该数据加载到表中时,会出现以下错误: 谷歌。应用程序编程接口。果心例外情况。BadRequest:400 CSV表遇到太多错误,放弃。行:1;错误:1。 我知道这一列是问题所在,因为当我删除这一列时,数据上传不会出错。我应该如何上传时间戳。 我正在使用bigquery API,python客户端库。 我的数据如下

  • 考虑下面的代码: 我想做的是用我应该从JSON响应中获得的错误消息捕获错误。我希望在我的第二个console.log中得到一个响应,但是不知何故,响应在第一个console.log.我如何在第一个实例中得到我想要的响应? 此外,为什么响应在第一个实例中给我“ok”,即使应用编程接口密钥不存在? 为什么我必须返回rsp.json()才能在第二个实例中获得正确的JSON,而响应应该已经是JSON格式的

  • 如何优雅地细粒度管理错误捕获? 比如我有下面这段代码 错误捕获? 一层套一层给我感觉就像是回调地狱。 以我这段代码为例(下面是我做的错误处理的方式,可以将try catch去掉,去实现你自己的错误捕获处理)