【问题标题】:YAML files to Google BigQuery. What should my architecture on Google Cloud Platform be?YAML 文件到 Google BigQuery。我在 Google Cloud Platform 上的架构应该是什么?
【发布时间】:2019-05-13 21:40:30
【问题描述】:

这个问题与我的特定用例在 Google Cloud Platform 上的合适架构有关。

我有一堆 .yaml 文件,我想在使用 Google Cloud Platform 的产品时运行 SQL 查询。这些文件的总大小不会超过 30MB,每个文件平均约为 50KB。新文件也不会很频繁地添加 - 大约每年 2-3 次。

我在想我可以设计一个架构,将所有这些文件都保存在 Cloud Storage 上,我运行 Dataflow 管道/Cloud Functions 将这些 .yaml 文件转换为 .json,然后将它们导入 BigQuery 以运行 SQL 查询.

什么似乎是合适的方法?完全使用 Dataflow 或 Cloud Functions 进行预处理或其他什么?

我对 Python 也很满意,所以我会寻找一种包含它的解决方案。例如,Dataflow 有一个 Python SDK。

【问题讨论】:

  • 为什么投反对票?
  • 必须是 SQL,还是可以在 Node 或 Python 中进行简单的文本搜索?

标签: google-cloud-platform google-bigquery google-cloud-functions google-cloud-dataflow


【解决方案1】:

BigQuery 可能不是解决此问题的正确工具。此外,使用虚拟机需要一些工作,而且成本也会很高。您还需要维护该虚拟机。

这是一种使用 Cloud Functions 的方法。我将假设您没有使用 SQL,并且可以简单地将文件内容加载到内存中并简单地进行基本的字符串搜索。代码有点粗糙,是从 SO 上的其他答案拼凑而成的,但它应该足以让你继续前进。

  • 创建一个云函数(示例使用 Node,但也可以是 Python)来监听您的存储桶并将内存设置为适当的大小,例如 256MB。那是因为我们会将内容读入内存。此外,将最大执行时间从默认的 60 秒提高。

  • 部署它。

  • 将 YAML 文件上传到 GCS 存储桶,它将触发 Cloud Function 执行,然后将文件内容读入内存。

  • 检查已执行函数的日志,您可以看到它将 YAML 文件的内容读入内存。

代码如下:

index.js:

const storage = require('@google-cloud/storage')();

exports.searchYAML = function searchYAML(event) {
    return new Promise(function(resolve, reject) {
        const file = event.data;
        (storage
            .bucket(file.bucket)
            .file(file.name)
            .download()
            .then(function(data) {
                if (data)
                    return data.toString('utf-8');
            })
            .then(function(data) {
                if (data) {
                    console.log("New file " + file.name);
                    console.log(data);
                    //Do some searching/logic with the file contents here
                    resolve(data);
                }
            })
            .catch(function(e) {
                reject(e);
            })
        );
    });
};

package.js:

{
  "main": "index.js",
  "dependencies": {
    "@google-cloud/storage": "^1.2.1"
  }
}

【讨论】:

    【解决方案2】:

    您提出的任何想法都不适合。

    启动 Cloud Dataflow 需要比实际处理时间更长的时间(启动 10 分钟,处理 1 秒)。您正在尝试使用 Mac 卡车运送牙签。

    30 MB 的 YAML 文件很小。在您编写 Dataflow python 脚本时,您已经将 YAML 文件转换为 Json。

    YAML 转换为 Json 不是 BigQuery 的好用处。 BigQuery 是基于列的结构化数据。转换和展平 Json 可能会出现问题。这是一个简单的内存中 NoSQL 查询引擎的任务。

    这是一项非常小的任务,很容易适应运行 Python 脚本的最小 Compute Engine 虚拟机实例。 App Engine 将是另一个不错的选择。

    【讨论】:

    • 如您所说,BigQuery 肯定不会在 30MB 的数据上大放异彩。另一方面,BigQuery 是永久存储结构化数据的好地方,因此如果 OP 需要一个永久、安全地存储文件并能够随意查询它们的地方 - 它会比任何易失性 VM 方法更好。
    • @FelipeHoffa - 云存储是一个更好的地方。 YAML 不能很好地展平。对于 BigQuery,YAML 不是一种好的数据类型(糟糕的数据)。你最终得到的是一个巨大的 Json 列,然后你下载并在内存中搜索。只需使用 Cloud Storage,将文件加载到内存中(总共只有 30 MB)并查询。
    • 数据流出来了。云函数呢?是的@FelipeHoffa 是正确的。 BigQuery 为我提供了一个存储和查询数据的好地方。那我可以使用什么托管数据库?我不想设置虚拟机的麻烦。
    • @JohnHanley 我不太清楚如何查询云存储中的文件。能详细点吗?
    • @JashShah - 在这种情况下,文件的总大小为 30 MB。将文件存储在 Cloud Storage 中,以便长期安全存储。将文件从 Cloud Storage 下载到您的计算机内存中,并使用 Python 或当时的语言在内存中搜索/查询。
    猜你喜欢
    • 1970-01-01
    • 2019-02-26
    • 2021-09-18
    • 2018-01-14
    • 2019-05-19
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    相关资源
    最近更新 更多