如何在Hadoop中共享全局序列号生成器?

afa*_*ncy 1 java rpc hadoop mapreduce

现在我使用Hadoop处理最终将加载到同一个表中的数据.我需要一个共享的序列号生成器来为每一行生成id.现在我使用以下方法生成唯一编号:

1)在HDFS中创建一个文本文件,例如test.seq,用于保存当前的序列号.

2)我使用锁定文件".lock"来控制并发.假设我们有两个并行处理数据的任务.如果task1想要获取该号码,它将检查锁定文件是否存在.如果是,则表示task2正在从test.seq访问该号码,然后task1必须等待.当task2获取了该号码时,它会在返回时通过增加1来覆盖旧号码,并删除锁定文件".lock".当task1看到.lock消失时,task1将首先创建一个".lock"文件,然后以相同的方式获取序列号.

但是,我不确定这种方法是否切实可行.因为我将.lock和test.seq文件保存在HDFS中,即使任务1更改了test.seq的内容,它也可能无法立即被task2识别.当其他任务通过namenode获取有关HDFS中数据的信息时.因此,datanode将首先通知对namenode的更改,然后通知其他任务更改.这是对的吗?

另一个想法是创建在Master上运行的torjan程序.所以,任务获取顺序号是通过RPC Torjan程序.但是如何在主程序上运行Torjan程序?

有人可以给我一些建议吗?谢谢!

Sam*_*Sam 6

你是对的,HDFS不会给你一个快速变化数据的一致视图.这种方法也会给您的名称节点带来大量流量负担.

我强烈建议您努力部署ZooKeeper.它是作为一项独立服务构建的,但是专为使用Hadoop进行全局状态跟踪而设计.好东西.

要解决您的问题,您将在ZooKeeper为升序值分配的目录中创建节点.它可以扩展,它具有容错能力,以及所有优秀的东西.