现在我正在使用 Hadoop 来处理最终将加载到同一个表中的数据。我需要一个共享的序列号生成器来为每一行生成 id。现在我使用以下方法生成唯一编号:
1) 在HDFS中创建一个文本文件,例如test.seq,用于保存当前序号。
2) 我使用锁文件“.lock”来控制并发。假设我们有两个任务来并行处理数据。如果 task1 想要获取号码,它会检查锁文件是否存在。如果是,则说明task2正在从test.seq中取数,task1必须等待。当task2获取到号码后,返回时加1覆盖旧号码,并删除锁文件“.lock”。当 task1 看到 .lock 消失时,task1 会先创建一个“.lock”文件,然后以同样的方式获取序号。
但是,我不确定这种方法是否可行。因为我把 .lock 和 test.seq 文件保存在 HDFS 中,所以即使 test.seq 的内容被任务 1 更改了,任务 2 也可能不会立即意识到。由于其他任务通过名称节点获取有关 HDFS 中数据的信息。所以,datanode会先把变化通知给namenode,然后再通知其他tasks变化。这是正确的吗?
另一个想法是创建运行在 Master 上的 torjan 程序。所以,任务获取序号是通过Torjan程序的RPC。但是如何在master程序上运行Torjan程序呢?
有人可以给我一些建议吗?谢谢!
最佳答案
您说得对,HDFS 不会为您提供快速变化的数据的一致 View 。这种方法还会给您的名称节点带来大量流量负担。
我强烈建议您努力部署 ZooKeeper .它是作为一项独立服务构建的,但专为使用 Hadoop 进行全局状态跟踪而设计。很棒的东西。
要解决您的问题,您可以在 ZooKeeper 分配升序值的目录中创建节点。它具有扩展性、容错性以及所有这些优点。
关于java - 如何在 Hadoop 中共享全局序列号生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929485/