2011-10-28 55 views
1

現在我正在使用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程序?

有人能給我一些建議嗎?謝謝!

+0

選擇此類似[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)。 –

回答

4

主要問題是您選擇hadoop因爲水平可伸縮性屬性。
當您需要從中心點進行協調時,所有形式的水平可伸縮性都會受到很大影響。

所以,你有兩個選擇:

  1. 您接受比例限制,去被別人提出的解決方案。 (如zookeeper選項)
  2. 您選擇不需要中央協調形式的解決方案。以此密鑰的某些屬性爲代價。

我會試着看看後者是否足夠滿足您的需要。 一個這樣的解決方案可能是您採用當前跟蹤器實例的id並追加一個本地計數器值。 這種方式的價值是獨一無二的,每個追蹤者和同一工作的多次運行都是獨一無二的,但不在作業中。

6

你是對的,HDFS不會給你一個快速改變數據的一致視圖。這種方法也會給你的名字節點帶來很多流量。

我強烈建議您付出努力部署ZooKeeper。它是作爲一個獨立的服務構建的,但是專門用於Hadoop的全局狀態跟蹤。好東西。

要解決您的問題,您可以在ZooKeeper按升序值分配的目錄中創建節點。它具有擴展性,容錯性和所有優點。

+0

Zookeeper內置Cloudera Hadoop,如果您擁有自己的羣集,我會建議您朝這個方向發展。使用館長可以輕鬆訪問zookeeper(使用原始動物園管理員apis會很痛苦)。我們實現了一種機制,其中每個任務進程從存儲在zookeeper中的全局池中「檢出」一組ID,這樣它就可以有效地使用一百萬個ID,然後「檢入」它檢出的未使用的ID它的執行結束。 –

0

如果您只需要按時間順序輸入條目,請存儲時間戳而不是標識。

相關問題