[英]Google Cloud Storage <-> Google App Engine -> Google BigQuery
我们正在开发用于处理日志数据的项目。 这个想法是
注意。 对于python脚本,我们正在考虑是在Google App Engine还是在Google Computing Engine上运行。
问题是
谢谢
有一个新的API可将数据直接流式传输到BigQuery ,这可能更适合您的用例。
您可以选择使用tabledata()。insertAll()方法一次将数据流式传输到BigQuery中,而不是使用作业将数据加载到BigQuery中。 这种方法可以查询数据,而不会延迟运行加载作业。 选择一种方法之前,需要考虑几个重要的折衷。
如果您的数据结构发生变化,则可以让BigQuery在其表上运行并进行相应的更新。 流原始数据将为您提供最大的灵活性,但需要再次进行数据后处理的成本较高。
有人已经提到了流数据解决方案 ,但是如果您试图移动大块日志数据而不是设置连续流,则可能要改用使用异步加载作业的方法。
GCS库在Google App Engine中使用时,就像大多数python文件库一样,可以将要导入的文件存储在云存储桶中:
import cloudstorage as gcs
filePath = "/CloudStorageBucket/dir/dir/logs.json"
with gcs.open(filePath, "w") as f:
f.write(SomeLogData)
f.close()
您可以通过API创建加载作业,以指示Big Query在Cloud Storage中加载CSV或换行符分隔的JSON文件列表:(注意:您将需要使用oauth 2 )
from apiclient.discovery import build
service = build("bigquery", "v2", http = oAuthedHttp)
job = {
"configuration": {
"load": {
"sourceUris": ["gs://CloudStorageBucket/dir/dir/logs.json"],
"schema": {
"files" : [
{"name": "Column1",
"type": "STRING"},
...
]
},
"destinationTable": {
"projectId": "Example-BigQuery-ProjectId",
"datasetId": "LogsDataset",
"tableId": "LogsTable"
},
"sourceFormat" : "NEWLINE_DELIMITED_JSON"
"createDisposition": "CREATE_IF_NEEDED"
}
}
}
response = service.jobs().insert(
projectId = "Example-BigQuery-ProjectId",
body = job
).execute()
如果您要设置其他属性(如写处置或跳过CSV文件中的行),则可以阅读有关如何创建Big Query加载作业的更多信息。 您还可以看到其他有关如何加载数据的良好示例 ,包括命令行提示符。
编辑:
要回答您更具体的问题:
这是可行的解决方案吗?
是。 我们使用延迟的任务将Google App Engine日志导出到Cloud Storage,然后导入到BigQuery。 有些人使用了map reduce作业 ,但是如果您不需要改组或精简地图 ,这可能会显得过高。
日志数据的结构更改经常会在插入BigQuery时导致错误。我们如何在python脚本中处理它?
除非您在邮件到达大查询之前对其进行解析,否则这应该不是问题。 更好的设计是将消息,时间戳,级别等移植到Big Query,然后在其中进行查询来消化它。
以防万一,我们必须在特定时期重新运行日志数据。 我们该怎么做? 需要写python脚本吗?
除非您在BigQuery中自行设置数据流,否则不会为您提供备份。 使用上面概述的方法,系统会自动为您提供Google Cloud Storage的备份,这是首选。
知道BigQuery是OLAP数据库,而不是事务数据库,因此通常最好在每次添加更多日志数据时重建表,而不是尝试插入新数据。 这是违反直觉的,但是BigQuery是为此设计的,因为它一次可以导入10,000个文件/ 1TB 。 使用分页和作业写入配置,理论上您可以相当快地导入数十万条记录。 如果您不关心备份日志,则流数据将是理想的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.