現在我正在使用Hadoop來處理最終將加載到同一個表中的數據。我需要一個共享的序列號生成器來爲每一行生成id。現在我使用以下方法生成唯一編號:如何在Hadoop中共享全局序列號生成器?
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意識到。由於其他任務通過namenode獲取有關HDFS中數據的信息。因此,datanode將首先通知對namenode的更改,然後通知其他任務更改。這是對的嗎?
另一個想法是創建在Master上運行的torjan程序。所以,任務獲得序號是通過RPC的Torjan程序。但是如何在主程序上運行Torjan程序?
有人能給我一些建議嗎?謝謝!
選擇此類似[SO問題](http://stackoverflow.com/questions/2671858/distributed-sequence-number-generation)更喜歡使用ZK生成序列號。檢查ZK上的[thread](http://zookeeper-user.578899.n2.nabble.com/Sequence-Number-Generation-With-Zookeeper-td5378618.html)。 –