是否可以使用Google Cloud Datastore批量插入

时间:2015-08-31 16:47:39

标签: python mysql google-cloud-datastore

我们正在从生产数据库迁移一些数据,并希望将大部分数据存档在Cloud Datastore中。

最终我们会将所有数据移到那里,但最初将重点放在存档数据上作为测试。

我们选择的语言是Python,并且能够逐行地将数据从mysql传输到数据存储区。

我们有大约1.2亿行要传输,一次一行的方法需要很长时间。

有没有人找到一些关于如何使用python将数据批量插入云数据存储区的文档或示例?

任何评论,建议表示赞赏,谢谢。高级。

3 个答案:

答案 0 :(得分:7)

我今天所知道的云数据存储没有“批量加载”功能,所以如果您期望“上传包含所有数据的文件并且它将出现在数据存储中”,我就不会以为你会找到任何东西。

您总是可以使用并行化工作的本地队列编写快速脚本。

基本要点是:

  • 排队脚本将数据从MySQL实例中拉出并将其放入队列中。
  • (很多)工作人员从这个队列中拉出来,并尝试将该项目写入数据存储区。
  • 如果失败,请将项目推回队列。

数据存储是可大规模并行化的,因此如果您可以编写一个每秒发送数千个写入的脚本,它应该可以正常工作。此外,这里的大瓶颈将是网络IO(在发送请求之后,您必须等待一段时间才能获得响应),因此许多线程应该获得相当不错的整体写入速率。但是,您应该确保在这些线程之间适当地分配工作。

现在,您应该调查Cloud Datastore是否适合您的数据和持久性/可用性需求。如果您正在占用120万行并将其加载到Cloud Datastore中以进行键值样式查询(也就是说,您有key和未编入索引的value属性,这只是JSON数据),那么这可能会使感觉,但在这种情况下加载你的数据将花费你〜$ 70(120m * $ 0.06 / 100k)。

如果您拥有属性(默认情况下将被编入索引),则此成本会大幅上升。

操作成本为每100k 0.06美元,但单个“写入”可能包含多个“操作”。例如,假设您在一个包含5列的表中有120米的行(相当于一个具有5个属性的类)。

单个“新实体写入”相当于:

  • + 2(每个新实体1 x 2写操作固定成本)
  • + 10(每个索引属性5 x 2写操作)
  • 每个实体
  • = 12“操作”

因此加载此数据的实际成本为:

120m实体* 12 ops / entity *($ 0.06 / 100k ops)= $ 864.00

答案 1 :(得分:0)

我相信你要找的是put_multi()方法。

docs,您可以使用put_multi()批量处理多个放置操作。这将导致批处理的单个RPC而不是每个实体的一个RPC。

示例:

# a list of many entities
user_entities = [ UserEntity(name='user %s' % i) for i in xrange(10000)]
users_keys = ndb.put_multi(user_entities) # keys are in same order as user_entities

另外需要注意的是,docs是:

  

注意:ndb库会自动批量调用大多数Cloud Datoreore,因此在大多数情况下,您不需要使用下面显示的显式批处理操作。

尽管如此,您仍然可以使用任务队列(我更喜欢deferred库),以便在后台批量处理大量数据。

答案 2 :(得分:0)

作为@JJ Geewax答案的更新,截至2016年7月1日 读写操作的费用已更改,如下所示:https://cloud.google.com/blog/products/gcp/google-cloud-datastore-simplifies-pricing-cuts-cost-dramatically-for-most-use-cases

因此,对于上述情况,写作本应便宜一些,

写一个实体,无论索引如何,只需花费1次写操作,现在每100,000个花费$ 0.18