我在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上不会写表。发生这种情况时不容易调试...
这里的关键是粘贴代码的这一部分:
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秒的循环。当任务出现异常时,会自动重试,您可以调整该行为。
您可以使用异常中的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去掉,去实现你自己的错误捕获处理)