是否可以使用 Google Cloud Datastore 批量插入
Is it possible to Bulk Insert using Google Cloud Datastore
我们正在从我们的生产数据库中迁移一些数据,并希望将大部分数据存档在 Cloud Datastore 中。
最终我们会将所有数据移到那里,但最初将重点放在存档数据上作为测试。
我们选择的语言是 Python,并且已经能够将数据从 mysql 逐行传输到数据存储区。
我们有大约 1.2 亿行要传输,一次传输一行的方法将花费很长时间。
有没有人找到一些关于如何使用 python 将数据批量插入云数据存储的文档或示例?
如有任何意见和建议,我们将不胜感激,在此先感谢您。
据我所知,Cloud Datastore 没有 "bulk-loading" 功能,因此如果您期待 "upload a file with all your data and it'll appear in Datastore" 之类的功能,我认为您不会找到任何东西。
您始终可以使用并行化工作的本地队列快速编写脚本。
基本要点是:
- 排队脚本从您的 MySQL 实例中提取数据并将其放入队列中。
- (许多)工作人员从此队列中拉出,并尝试将项目写入数据存储。
- 失败时,将项目推回队列。
Datastore 是大规模可并行化的,因此如果您可以编写一个每秒发送数千次写入的脚本,它应该可以正常工作。此外,这里的最大瓶颈将是网络 IO(发送请求后,您必须等待一段时间才能获得响应),因此许多线程应该获得相当不错的整体写入率。但是,您需要确保在这些线程之间适当地分配工作。
也就是说,您应该调查 Cloud Datastore 是否适合您的数据和 durability/availability 需求。如果您要获取 120m 行并将其加载到 Cloud Datastore 中以进行键值样式查询(也就是,您有一个 key
和一个未编入索引的 value
属性 即 JSON 数据),那么这可能是有道理的,但在这种情况下加载数据将花费您约 70 美元(1.2 亿 * 0.06 美元/100k)。
如果您有房产(默认情况下会编入索引),则此费用会大幅增加。
操作成本为每 100k 0.06 美元,但单个 "write" 可能包含多个 "operations"。例如,假设您在具有 5 列的 table 中有 120m 行(相当于一种具有 5 个属性)。
一个"new entity write"相当于:
- + 2(每个新实体 1 x 2 次写入操作的固定成本)
- + 10(每个索引 属性 5 x 2 次写入操作)
- = 12 "operations" 每个实体。
因此您加载此数据的实际成本是:
1.2 亿个实体 * 12 ops/entity * ($0.06/100k ops) = $864.00
我相信您正在寻找的是 put_multi()
方法。
从docs开始,您可以使用put_multi()
来批处理多个放置操作。这将导致批处理使用单个 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是这样的:
Note: The ndb library automatically batches most calls to Cloud Datastore, so in most cases you don't need to use the explicit batching operations shown below.
也就是说,您仍然可以按照 的建议使用任务队列 (我更喜欢 deferred
库) 以便批量放置大量数据在后台。
作为对@JJ Geewax 回答的更新,截至 2016 年 7 月 1 日
读写操作的成本已更改,如下所述:https://cloud.google.com/blog/products/gcp/google-cloud-datastore-simplifies-pricing-cuts-cost-dramatically-for-most-use-cases
所以对于所描述的情况,写作应该变得更便宜,因为
writing a single entity only costs 1 write regardless of indexes and will now cost [=10=].18 per 100,000
我们正在从我们的生产数据库中迁移一些数据,并希望将大部分数据存档在 Cloud Datastore 中。
最终我们会将所有数据移到那里,但最初将重点放在存档数据上作为测试。
我们选择的语言是 Python,并且已经能够将数据从 mysql 逐行传输到数据存储区。
我们有大约 1.2 亿行要传输,一次传输一行的方法将花费很长时间。
有没有人找到一些关于如何使用 python 将数据批量插入云数据存储的文档或示例?
如有任何意见和建议,我们将不胜感激,在此先感谢您。
据我所知,Cloud Datastore 没有 "bulk-loading" 功能,因此如果您期待 "upload a file with all your data and it'll appear in Datastore" 之类的功能,我认为您不会找到任何东西。
您始终可以使用并行化工作的本地队列快速编写脚本。
基本要点是:
- 排队脚本从您的 MySQL 实例中提取数据并将其放入队列中。
- (许多)工作人员从此队列中拉出,并尝试将项目写入数据存储。
- 失败时,将项目推回队列。
Datastore 是大规模可并行化的,因此如果您可以编写一个每秒发送数千次写入的脚本,它应该可以正常工作。此外,这里的最大瓶颈将是网络 IO(发送请求后,您必须等待一段时间才能获得响应),因此许多线程应该获得相当不错的整体写入率。但是,您需要确保在这些线程之间适当地分配工作。
也就是说,您应该调查 Cloud Datastore 是否适合您的数据和 durability/availability 需求。如果您要获取 120m 行并将其加载到 Cloud Datastore 中以进行键值样式查询(也就是,您有一个 key
和一个未编入索引的 value
属性 即 JSON 数据),那么这可能是有道理的,但在这种情况下加载数据将花费您约 70 美元(1.2 亿 * 0.06 美元/100k)。
如果您有房产(默认情况下会编入索引),则此费用会大幅增加。
操作成本为每 100k 0.06 美元,但单个 "write" 可能包含多个 "operations"。例如,假设您在具有 5 列的 table 中有 120m 行(相当于一种具有 5 个属性)。
一个"new entity write"相当于:
- + 2(每个新实体 1 x 2 次写入操作的固定成本)
- + 10(每个索引 属性 5 x 2 次写入操作)
- = 12 "operations" 每个实体。
因此您加载此数据的实际成本是:
1.2 亿个实体 * 12 ops/entity * ($0.06/100k ops) = $864.00
我相信您正在寻找的是 put_multi()
方法。
从docs开始,您可以使用put_multi()
来批处理多个放置操作。这将导致批处理使用单个 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是这样的:
Note: The ndb library automatically batches most calls to Cloud Datastore, so in most cases you don't need to use the explicit batching operations shown below.
也就是说,您仍然可以按照 的建议使用任务队列 (我更喜欢 deferred
库) 以便批量放置大量数据在后台。
作为对@JJ Geewax 回答的更新,截至 2016 年 7 月 1 日 读写操作的成本已更改,如下所述:https://cloud.google.com/blog/products/gcp/google-cloud-datastore-simplifies-pricing-cuts-cost-dramatically-for-most-use-cases
所以对于所描述的情况,写作应该变得更便宜,因为
writing a single entity only costs 1 write regardless of indexes and will now cost [=10=].18 per 100,000