使用ZooKeeper管理正在处理或已处理的任务

时间:2016-02-04 15:55:09

标签: python apache-zookeeper distributed-computing

我有一个python脚本,它定期扫描目录,处理新文件。每个文件需要很长时间才能处理(许多小时)。我目前在单台计算机上运行脚本,将已处理文件的名称写入本地文件。不花哨或不健壮,但它或多或少都有效。我想使用多个工作机器来提高吞吐量(和稳健性)。我的目标是让它尽可能简单。可以随时使用zookeeper群集。

我的计划是在zookeeper中创建一个目录“started_files”,其中包含带有文件名的短暂节点,该文件名已知是唯一的。我将有另一个目录“completed_files”与常规节点的文件名。在伪代码中,

if filename does not exist in completed files:
    try:
        create emphemeral node filename in started files
        process(filename)
        create node filename in completed files
    except node exists error:
        do nothing, another worker is processing it

我的第一个问题是这是否安全。在任何情况下,两台不同的机器可以成功地创建相同的节点吗?我不完全理解doc。将文件处理两次不会导致任何坏事,但我希望它原则上是正确的。

其次,这是一个体面的方法吗?还有另一种方法显然更好吗?我将每天处理10个文件,因此这部分应用程序的性能对我来说并不重要(我确定希望处理文件更快)。或者,我可以使用另一个只有一个实例的脚本(或选择一个领导者)来扫描文件并将它们放入队列中。我可以修改导致这些文件首先神奇地出现的代码。我可以用芹菜或风暴。然而,所有这些替代方案都扩大了我试图保持小而简单的范围。

1 个答案:

答案 0 :(得分:1)

一般来说,您的方法应该有效。您可以将Zoo Znode配置为ZooKeeper,以便连续创建相同路径(如果存在)将失败。

对于ephermal znodes,你已经很清楚地发现,如果客户端关闭了与ZooKeeper的连接,它们会自动消失,这对于计算节点失败尤其有用。

其他节点实际上可以使用ephermal znodes监视路径,以便确定何时扫描新任务是个好主意。

甚至可以在ZooKeeper之上实现一个队列,例如使用znodes的排序;有可能有更好的方法。

总的来说,我认为具有发布订阅模式的消息队列系统可以更好地扩展。在这种情况下,您只需要考虑如何重新安排失败的计算节点的作业。