定期将大数据(json)导入Firebase

时间:2017-06-06 19:35:26

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

我们需要定期更新firebase中的大量数据(大约5百万个记录)。目前我们有几个json文件,大小约为1 GB。

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

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

使用新的firebase工具,如何:

  1. 长期运行云功能来进行数据获取/插入? (这有意义吗?)
  2. 将json文件放入&来自谷歌云平台内的某个地方?
  3. 首先将大数据投入google-cloud-datastore是否有意义(例如,存放在firebase中太贵了)或者可以将firebase实时数据库作为大型数据存储进行可靠处理。

1 个答案:

答案 0 :(得分:4)

我终于发布了答案,因为它与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的jsons,进行简单的json转换。

当我们正在使用node.js流时,任何JSONStream库都可以有效地转换数据(JSONStream on npm),异步处理数据就像一个带有事件流的大型数组({{3 }})。

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,以防止内存泄漏阻塞整个函数。

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

此外,您可以在nodejs app引擎中运行云功能代码。但不一定相反。