【问题标题】:Using ZooKeeper to manage tasks which are in process or have been processed使用 ZooKeeper 管理正在处理或已处理的任务
【发布时间】:2016-05-14 08:02:02
【问题描述】:

我有一个 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 个文件,因此这部分应用程序的性能对我来说并不重要(我当然希望处理文件更快)。或者,我可以有另一个只有一个实例的脚本(或选择一个领导者)来扫描文件并将它们放入队列中。我可以修改导致这些文件首先神奇地出现的代码。我可以用芹菜或风暴。然而,所有这些替代方案都扩大了我试图保持小而简单的范围。

【问题讨论】:

    标签: python apache-zookeeper distributed-computing


    【解决方案1】:

    一般来说,您的方法应该有效。有可能,您将 znode 写入 ZooKeeper 的方式是,如果相同路径存在,连续创建将失败。

    对于临时 znode,您已经很好地发现,如果客户端关闭与 ZooKeeper 的连接,它们会自动消失,这在计算节点失败的情况下尤其有用。

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

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

    总的来说,我相信具有发布订阅模式的消息队列系统会扩展得更好一些。在这种情况下,您只需要考虑如何重新安排故障计算节点的作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-03
      • 2017-03-19
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      相关资源
      最近更新 更多