【问题标题】:How to schedule importing data files from SFTP server located on compute engine instance into BigQuery?如何安排将数据文件从位于计算引擎实例上的 SFTP 服务器导入 BigQuery?
【发布时间】:2021-04-15 15:45:54
【问题描述】:

我想要达到的目标:

将每小时传入的数据文件从几个不同的源传输到位于计算引擎 VM 上的 SFTP 文件服务器上,并以经济高效的方式进行实时更新。

上下文:

  1. 我尝试从中导入数据的软件是旧版软件,不支持直接导出到云。因此,从软件直接连接到云不是一种选择。

  2. 但它确实支持将数据导出到 SFTP 服务器。不能直接通过任何 GCP 工具获得。

  3. 因此,我在具有可扩展存储的计算引擎 VM 实例上使用 vsftpd 设置了手动 SFTP 服务器,然后为其提供静态 IP 并将该 IP 硬连线到我的软件中。数据现在每隔一小时无缝地到达计算引擎实例。

  4. 文件按小时生成。因此每个小时都有一个不同的文件。但是它们可能包含一些重复。即前一小时文件的一些结束记录可能与当前小时文件的开头重叠。

  5. 文件来自不同的源提要,我在文件名中有提要名称,因此我的计算引擎 VM 实例上不断增长的数据如下所示:

    feed1_210301_0500.csv
    feed2_210301_0500.csv
    feed3_210301_0500.csv
    feed1_210301_0600.csv
    feed2_210301_0600.csv
    feed3_210301_0600.csv
    feed1_210301_0700.csv
    feed2_210301_0700.csv
    feed3_210301_0700.csv
    ...
    

我尝试过的:

  1. 我已在 VM 实例中设置 Bigquery 访问权限和云存储权限,以便将数据从 VM 实例访问到 BigQuery:

  1. 我尝试将数据直接导入 BigQuery 以及在谷歌云存储上从那里导入数据,但没有选项可以直接将数据从 VM 实例导入 BigQuery,我也无法以某种方式将数据从 VM 导入 GCS,然后再导入加载到 BigQuery 中,但没有选择,文档也没有提及计划传输的问题。

  2. 有一些外部数据传输服务,例如 Fivetran 和 HevoData,但它们相对昂贵,而且似乎有点矫枉过正,因为我的源或目标都在 GCP 上,与拥有第三个服务没有太大区别虚拟机并为导入安排一些脚本。 (顺便说一句,我目前的解决方法是:D 即使用 python 脚本将数据流式传输到 BigQuery 中,如 here 所述)

  3. 目前我正在探索DataFusion,它每个月只有 120 小时免费,基础Dataprep 管道需要额外费用,并且不确定它是否正确。此外,我目前正在探索Cloud Scheduler 和Cloud Composer 之类的工具,看看是否有适合我的数据需求的工具,但目前还没有找到可行的解决方案。

我很高兴学习任何新的工具和技术,任何改善这种情况的建议也值得赞赏。

【问题讨论】:

    标签: google-cloud-platform google-bigquery scheduled-tasks sftp


    【解决方案1】:

    我刚刚尝试直接从 GCE 虚拟机上传,它运行完美。我在 Cloud API 访问范围中启用了 BigQuery,使用一些随机数据创建了文件 (test_data.csv),它满足我在 BigQuery 表数据集 (test_dataset) 中的表 (test_table) 的架构并运行:

    bq load test_dataset.test_table test_data.csv
    

    【讨论】:

    • 是的,这对我来说也适用于一次性解决方案。但我想安排传输以每小时加载数据
    • crontab -e 然后0 * * * * /usr/bin/bq load test_dataset.test_table /home/myuser/test_data.csv
    • 不,正如我在问题中提到的那样,没有一个文件正在更新。文件正在传入,我想在新文件附带重复数据删除后立即上传(我也可以在 BQ 端进行管理)
    • 如您所见:cloud.google.com/bigquery/docs/batch-loading-data#bq。不能通过这种方法做批处理文件
    • 如何不为每个文件运行一个 bq 命令,而是运行一个脚本,首先将所有现有文件连接起来,然后将它们一起上传到具有 bq 负载的 BQ 表中?我想你的一件事是你怎么知道传输是否完成,这样你就不会尝试处理仍在传输中的文件。
    【解决方案2】:

    你可以使用GCS on-premise transfer(你可以安排它)=>然后安排一个GCS transfer to BigQuery。

    如果这也不适合您,外部数据传输服务也不适合您,那么我相信您最好的选择是创建一个脚本来安排batch load of the data from your VM to BigQuery。

    也许这个answer 也可以帮助你。

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 2016-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2016-08-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      相关资源
      最近更新 更多