【问题标题】:Import large data (json) into Firebase periodically定期将大数据 (json) 导入 Firebase
【发布时间】:2017-11-07 23:14:22
【问题描述】:

我们必须定期更新 firebase 中的大量数据(约 5 条 Mio 记录)。目前我们有一些大小约为 1 GB 的 json 文件。

由于现有的第三方解决方案(herehere)存在一些可靠性问题(每个对象导入对象;或需要开放连接),并且与谷歌云平台生态系统完全脱节。我想知道现在是否有一种“官方”方式使用即新的谷歌云功能?或与 app engine / google cloud storage / google cloud datastore 结合使用。

我真的很喜欢不处理身份验证——云功能似乎处理得很好,但我认为该功能会超时 (?)

使用新的 firebase 工具,如何:

  1. 是否有长时间运行的云功能来进行数据提取/插入? (有意义吗?)
  2. 将 json 文件导入和从谷歌云平台内部的某处获取?
  3. 首先将大数据放入 google-cloud-datastore 是否有意义(即太贵而无法存储在 firebase 中),还是可以将 firebase 实时数据库可靠地用作大数据存储。

【问题讨论】:

  • 我还没有处理过导入大型 JSON 文件,但我可以谈谈使用 Cloud Functions 处理数百万条数据库记录。我递归处理,抓取100条记录。处理它们,将最后一个键保存在数据库中。从该键启动下一个 Cloud Function,然后重复直到处理完所有 1,000,000 条记录。这允许我将我的云功能限制为更短的执行时间。
  • @sketch我假设你有一个额外的“worker db”来跟踪正在发生的事情(?)。你介意分享一下云函数在这种方法中迭代超过 1 个 mio 记录需要多长时间,关于操作是什么以及你的记录有多大/深度?这对我估计我的架构很有帮助。
  • 看看我的要点; gist.github.com/sketchthat/9f2329864cec4d79faa4e66c6bcc375d 很难说需要多长时间,因为这取决于您的对象有多深以及您对每个项目进行了什么样的处理。您可以使用 100 条记录并使其更大/更小以优化您的请求时间。

标签: firebase architecture firebase-realtime-database google-cloud-datastore google-cloud-functions


【解决方案1】:

我终于发布了答案,因为它与 2017 年的新 Google Cloud Platform 工具保持一致。

新推出的 Google Cloud Functions 的运行时间有限,约为 9 分钟 (540 seconds)。但是,云函数能够像这样从云存储创建 node.js 读取流 (@googlecloud/storage on npm)

var gcs = require('@google-cloud/storage')({
// You don't need extra authentication when running the function
// online in the same project
  projectId: 'grape-spaceship-123',
  keyFilename: '/path/to/keyfile.json'
});

// Reference an existing bucket. 
var bucket = gcs.bucket('json-upload-bucket');

var remoteReadStream = bucket.file('superlarge.json').createReadStream();

即使是远程流,它也非常高效。在测试中,我能够在 4 分钟内解析大于 3 GB 的 json,进行简单的 json 转换。

由于我们现在使用的是 node.js 流,任何 JSONStream 库都可以有效地动态转换数据 (JSONStream on npm),像处理带有事件流的大型数组 (event-stream on npm) 一样异步处理数据。

es = require('event-stream')

remoteReadStream.pipe(JSONStream.parse('objects.*'))
  .pipe(es.map(function (data, callback(err, data)) {
    console.error(data)
    // Insert Data into Firebase.
    callback(null, data) // ! Return data if you want to make further transformations.
  }))

在管道末尾的回调中仅返回 null 以防止内存泄漏阻塞整个函数。

如果您进行需要较长运行时间的较重的转换,请在 firebase 中使用“job db”来跟踪您所在的位置,并且只进行 100.000 次转换并再次调用该函数,或者设置一个额外的函数来监听on 插入“forimport db”,最终将原始 jsons 对象记录异步转换为目标格式和生产系统。拆分导入和计算。

此外,您可以在 nodejs 应用引擎中运行云函数代码。但不一定反过来。

【讨论】:

  • n00b 问题...我要做的就是将整个大型 json 对象从文件中读取到内存中的 javascript 对象中...不需要任何特殊的过滤、解析或事件流.. . 我该怎么做?
  • 即使我的 json 文件只有 82 MB,我的读取流也需要 eons 才能完成。这怎么可能?
  • 我正在尝试读取 512 MB GCS 文件的流并将流插入 Bigquery,但它让我遇到了堆内存不足的问题。您能解释一下您处理 3gb 文件的方法吗?
  • 听起来您的代码中存在内存泄漏。 IE。 3GB 大文件是一个 .json(主要是地理数据)。正如答案中所写,我使用了一个流库,该流库与该大文件块的 json 一起工作。所以整个文件从来没有上过函数进程。我认为您的崩溃是因为您尝试将 512MB 加载到函数 mode.js 进程中 - 或者以阻碍 js garbe 收集器释放内存(内存泄漏)的方式处理它。您需要确保只使用流。
  • 所以流程非常简单,我有大约 512 mb xml(70k 记录),将其转换为对象,在 bigquery 中流插入 100 - 200 行。您认为整个工作可以在 Google Cloud 函数中执行吗?
猜你喜欢
  • 2021-04-18
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 2022-09-23
  • 2018-04-14
  • 1970-01-01
相关资源
最近更新 更多