是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?

Posted

技术标签:

【中文标题】是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?【英文标题】:Is it possible to query log data stored Cloud Storage without Cleaning it using BigQuery? 【发布时间】:2019-09-04 13:07:41 【问题描述】:

我有大量从 StackDriver 导出到 Google Cloud Storage 的日志数据。我正在尝试使用 BigQuery 运行查询。

但是,在 BigQuery 数据集中创建表时,我得到了

Invalid field name "k8s-app". 
Fields must contain only letters, numbers, and underscores, start with a letter or underscore, and be at most 128 characters long. 
Table: bq_table

大量日志数据从 StackDriver sinks 导出,其中包含大量唯一列名。根据 BigQuery 表,其中一些名称无效。

解决办法是什么?有没有办法在不清理的情况下查询日志数据?使用temporary tables 或其他什么?

注意:我不想将我的数据加载(放入)到 BigQuery Storage,只是为了查询 Google Cloud Storage 中存在的数据。

* 编辑 *

请参考这个documentation了解清楚

【问题讨论】:

我假设 Stackdriver Logging 中的搜索工具 |日志查看器不做您需要做的事情,这就是您导出数据并寻找不同方式来查询数据的原因?只是想在我尝试提供答案之前确定一下。谢谢。 是的,它们不允许修改日志类型或任何日志数据。日志只能删除 【参考方案1】:

我认为您可以根据您的应用程序选择以下两条路线中的任何

A. 忽略标题

如果有问题的字段位于日志的标题行中,您可以通过在导入命令中添加 --skip_leading_rows=1 参数来选择忽略标题行。比如:

  bq location=US load --source_format=YOURFORMAT --skip_leading_rows=1 mydataset.rawlogstable gs://mybucket/path/* 'colA:STRING,colB:STRING,..'

B. 加载原始数据

如果上述内容不适用,则只需将非结构化原始格式的数据加载到 BigQuery 中即可。一旦你的数据在那里,你就可以开始做各种各样的事情了。

所以,首先创建一个单列的表:

bq mk --table mydataset.rawlogstable 'data:STRING'

现在将您的数据集加载到提供适当位置的表中:

bq --location=US load --replace --source_format=YOURFORMAT mydataset.rawlogstable gs://mybucket/path/* 'data:STRING'

加载数据后,现在您可以使用 SQL 查询对其进行处理,并根据您的分隔符将其拆分并跳过您不喜欢的内容。

C. 创建外部表

如果您不想将数据加载到 BigQuery 但仍想查询,可以选择在 BigQuery 中创建外部表:

bq --location=US mk --external_table_definition=data:STRING@CSV=gs://mybucket/path/* mydataset.rawlogstable

查询数据

如果您选择选项 A 并且它适合您,您可以简单地选择以您已经在做的方式查询您的数据。

如果您选择 B 或 C,您的表现在将数据集中的行作为单列行。您现在可以选择根据您的分隔符要求将这些单列行拆分为多个列行。

假设您的行应该有 3 列,分别命名为 a、b 和 c:

 a1,b1,c1
 a2,b2,c2

现在它全部采用名为data 的单列形式,您可以用分隔符, 分隔:

 select 
    splitted[safe_offset(0)] as a, 
    splitted[safe_offset(1)] as b,
    splitted[safe_offset(2)] as c
 from (select split(data, ',') as splitted from `mydataset.rawlogstable`)

希望对你有帮助。

【讨论】:

我不想将数据加载到 BigQuery 表中。只是在寻找一种查询 Google Cloud Storage 存储桶中存在的日志数据的方法。我认为documentation 中解释了类似的内容 好的。然后,在这种情况下,您可能需要考虑使用 BigQuery 创建外部表(这样您就可以在不加载到 BigQuery 的情况下查询数据)。 您能否更具体一些并使用相关命令/信息编辑您的答案,以便可以按照它完成任务并作为答案接受? 如果有帮助,请告诉我。 :-)【参考方案2】:

扩展@khan 的回答:

如果文件是 JSON,那么您将无法使用第一种方法(跳过标头)。

但是您可以将每个 JSON 行原始加载到 BigQuery - 就像它是 CSV 一样 - 然后在 BigQuery 中解析

在以下位置找到加载原始行的完整示例:

https://medium.com/google-cloud/bigquery-lazy-data-loading-ddl-dml-partitions-and-half-a-trillion-wikipedia-pageviews-cd3eacd657b6

然后您可以使用JSON_EXTRACT_SCALAR 在 BigQuery 中解析 JSON - 并将现有字段名称转换为 BigQuery 兼容的名称。

【讨论】:

我是否应该使用 Cloud Dataflow 将数据加载到 BigQuery 并在其间添加转换步骤?这是一种好方法还是您在文章中描述的方法? 我更喜欢在 BigQuery 中进行清理。如果架构发生变化,没有丢失数据的风险 在 BigQuery 中清理数据是什么意思?就像你在文章中解释的那样?【参考方案3】:

很遗憾没有!

作为日志分析的一部分,在将文件提交到 BigQuery 等持久接收器之前,通常会重塑日志数据并运行少量 ETL。

如果日志分析只需要性能监控,并且没有理由为 ETL 创建额外代码,则所有指标都可以从堆栈驱动程序监控的 REST API 端点派生。

【讨论】:

【参考方案4】:

如果您不需要包含- 的字段,您可以设置忽略ignore_unknown_values。您必须提供您想要的架构并使用ignore_unknown_values 任何与架构不匹配的字段都将被忽略。

【讨论】:

我需要这些字段。由于 Stackdriver 日志中生成的许多字段在 BigQuery 中被视为无效,

以上是关于是否可以在不使用 BigQuery 清理的情况下查询存储在云存储中的日志数据?的主要内容,如果未能解决你的问题,请参考以下文章

在不通过网络浏览器进行清理的情况下查看访问日志是不是危险?

在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据

是否可以在不使用malloc的情况下进行内存泄漏?

BigQuery - 如何在不使用列名作为值的情况下导入 CSV?

如何在不创建架构的情况下将 CSV 文件加载到 BigQuery

如何清理 BigQuery 视图