从Google AppEngine的数据存储中检索行时,我们希望通过多个同时进程来实现实体类型的所有数据检索。这些进程在后端Python服务器中异步运行。问题的关键是让每个过程检索整个数据集的“块”,这样我们就可以近乎均匀地分配负载分散到所有的人,像这样的:向App Engine数据存储区均匀分布同时查询
|_____|_____|_____|_____|_____|_____|_____|.....|_____|_____|
p1 p2 p3 p4 p5 p6 p7 pk-1 pk
其中每个pn
是一个过程并检索所有实体。
我想启用此方式就是以某种方式说,像这样(在Python):
chunk_size = num_entities/num_chunks
base_query = 'select * from entity offset %d limit %d'
for chunk in range(0, to = num_entities, step_by = chunk_size):
cursor = get_cursor(base_query, offset = chunk, limit = chunk_size)
while is_ready(cursor):
do_task_with_data(cursor.next())
凡get_cursor
将从AppEngine上从结果滚动从给定的偏移开始得到光标。例如,我只在这里包含limit
参数,以便它可以帮助,但也可以在while
循环内执行。在任何情况下,我们都希望得到一种情况,即查询不是带有限制和偏移量的O(n)(即最后的查询在获取数据之前必须滚动几乎所有的数据)。
另一种选择可能是基于某个随机值(我们的确有)分配实体,使用0-> 1的范围分成chunk_num块。
甚至有可能以某种方式从App Engine获取数据转储,然后处理该数据(尽管由于大小,它不会是我们的首选)。
什么是实现这个目标的好方法?有没有更好的方法来解决这个问题?任何想法都会非常感激。
这听起来像个好主意。据我所知,采用这种方法,我会以某种方式让每个映射器发送我需要发送的大量数据,对吧?你认为这需要一些“减少”步骤才能发挥作用吗?这反过来并行化,做AppEngine而不是在我们拥有的后端服务器上。 –
我会在这里使用mapreduce,但我不认为mapreduce guarntees将负载平均分配。 Mapreduce使用任务队列而不是后端,并且您的数据处理将发生在任务队列进程中。 – dragonx