2012-11-30 136 views
2

从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获取数据转储,然后处理该数据(尽管由于大小,它不会是我们的首选)。

什么是实现这个目标的好方法?有没有更好的方法来解决这个问题?任何想法都会非常感激。

回答

2

我认为你几乎可以描述mapreduce framework的功能。

+0

这听起来像个好主意。据我所知,采用这种方法,我会以某种方式让每个映射器发送我需要发送的大量数据,对吧?你认为这需要一些“减少”步骤才能发挥作用吗?这反过来并行化,做AppEngine而不是在我们拥有的后端服务器上。 –

+0

我会在这里使用mapreduce,但我不认为mapreduce guarntees将负载平均分配。 Mapreduce使用任务队列而不是后端,并且您的数据处理将发生在任务队列进程中。 – dragonx

相关问题