繁体   English   中英

Google云端存储<-> Google App Engine-> Google BigQuery

[英]Google Cloud Storage <-> Google App Engine -> Google BigQuery

我们正在开发用于处理日志数据的项目。 这个想法是

  • 将日志数据从本地Logstash更新到Google Cloud Storage
  • 编写python脚本以插入作业以将日志数据从Google云端存储导入Google BigQuery
  • 编写python脚本来处理BigQuery本身中的数据

注意。 对于python脚本,我们正在考虑是在Google App Engine还是在Google Computing Engine上运行。

问题是

  • 这是可行的解决方案吗?
  • 日志数据的结构更改经常会在插入BigQuery时导致错误。我们如何在python脚本中处理它?
  • 以防万一,我们必须在特定时期重新运行日志数据。 我们该怎么做?需要编写python脚本吗?

谢谢

有一个新的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM