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

标签 java hadoop mapreduce rpc

现在我正在使用 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/

相关文章:

java - 当我调用 Reader.read() 时,什么可能导致 Java 中的 IOException?

java - 在 grpc Spring boot 中关闭自定义线程池执行器

linux - 为新的 Hadoop 集群自动配置 SSH

hadoop - 带有通配符或变量的distcp目录的设计模式(全局)

hadoop - 从 hdfs 与本地目录读取文件

java - 如何从 Android SDK 禁用(然后启用)短信功能

java - 在单独的类中重新绘制/更新 JPanel 时出现问题

hadoop - 资源管理器和节点管理器可以在同一个节点中吗? [ map R]

hadoop - 是什么导致mapreduce作业仅为hbase中的100000行创建一个 map

hadoop - MapReduce中的max如何从中获取其值,它们代表什么?