Hadoop'ta global sıralı sayı üreteci nasıl paylaşılır?

Şimdi sonunda aynı masaya yüklenecek olan verileri işlemek için Hadoop kullanıyorum. Her satır için kimlik üretmek için paylaşılan bir sıralı sayı üretecine ihtiyacım var. Şimdi benzersiz sayıyı üretmek için aşağıdaki yaklaşımı kullanıyorum:

1) Geçerli sıralı sayıyı kaydetmek için HDFS içinde bir metin dosyası, ör. Test.seq oluşturun.

2) Eşzamanlılığı kontrol etmek için bir kilit dosyası ".lock" kullanıyorum. Verileri paralel olarak işlemek için iki görevimiz olduğunu varsayalım. Eğer görev1 numarayı almak istiyorsa, kilit dosyasının mevcut olup olmadığını kontrol edecektir. Evet ise, bu, görev2'nin test.seq'deki numaraya eriştiği anlamına gelir, ardından görev1 beklemelidir. Görev2 sayıyı aldığında, geri döndüğünde 1 sayısını artırarak eski sayıyı üzerine yazar ve ".lock" kilit dosyasını siler. Görev1, .lock'un kaybolduğunu gördüğünde, task1 öncelikle bir ".lock" dosyası oluşturur, ardından sıralı sayıyı elde etmek için aynı şekilde yapar.

Ancak, bu yaklaşımın pratik olup olmadığından emin değilim. HDFS'de .lock ve test.seq dosyalarını tuttuğumdan, test.seq içeriği bile görev 1 tarafından değiştirilmiş olsa bile, hemen görev2 tarafından fark edilmeyebilir. Diğer görevler HDFS'deki veriler hakkında bilgi aldıkça, adenode ile. Böylece, datanode ilk olarak ismindeki değişikliği bildirecek, daha sonra diğer görevlere değişiklikler bildirilecektir. Doğru mu?

Başka bir fikir, Usta üzerinde çalışan torjan programı oluşturmaktır. Yani, görev sıra numarası RPC Torjan programı aracılığıyla olsun. Ama ana programda Torjan programını nasıl çalıştırırım?

Birisi bana tavsiyede bulunabilir mi? Teşekkürler!

1
Bu benzer SO Sorusunu kontrol edin, ZK ile sıra numaraları oluşturmayı tercih edin. Konu konusuna bakın. ZK.
katma yazar Praveen Sripati, kaynak

3 cevap

HDFS'nin hızla değişen verileri tutarlı bir şekilde görmemesi konusunda haklısınız. Bu yaklaşım aynı zamanda ad düğümünüzü çok fazla trafik yükler.

ZooKeeper 'ı devreye alma çabalarını şiddetle tavsiye etmenizi öneririz. Bağımsız bir hizmet olarak inşa edilmiştir ancak Hadoop ile global durum takibi için tasarlanmıştır. Harika şeyler.

Sorununuzu çözmek için, ZooKeeper tarafından artan değerde atanacak bir dizinde düğümler oluşturabilirsiniz. Ölüyor, hataya dayanıklı ve tüm bu güzel şeyler.

6
katma
Zookeeper, Cloudera Hadoop ile birlikte gelir, kendi kümeniz varsa bu yöne gitmenizi öneririm. Zookeeper erişimi kolaylaştırmak için küratör kullanın (bu ham zookeeper apis kullanmak için bir acı). Her bir görev işleminin, zookeeper'de depolanmış bir global havuzdan bir dizi kimlik "kontrol" ettiği bir mekanizma uygularız, böylece bir milyon kimlikten verimli bir şekilde faydalanabilir, daha sonra da kontrol ettikleri kullanılmayan kimlikleri "kontrol edebilir". bunun sonu onun icrası.
katma yazar David Parks, kaynak

Asıl sorun, yatay ölçeklenebilirlik özellikleri nedeniyle hadoop'u seçmenizdir. Merkezi bir noktadan koordine edilmesi gereken bir şey eklediğinizde, yatay ölçeklenebilirliğin tüm biçimleri büyük zarar görür.

Yani iki seçeneğiniz var:

  1. Ölçekleme sınırlamalarını kabul edersiniz ve başkaları tarafından önerilen çözümlere başvurursunuz. (zookeeper seçeneği gibi)
  2. Bir merkezi koordinasyon biçimi gerektirmeyen bir çözüm seçersiniz. Anahtarın bazı özellikleri pahasına.

Eğer ikincinin sizin amaçlarınız için yeterli olup olmadığını görmeye çalışacağım. Böyle bir çözüm, geçerli izleyici örneğinin kimliğini almanız ve yerel bir sayaç değeri eklemeniz olabilir. Bu şekilde değer, izleyici başına ve aynı işin birden fazla çalıştırması boyunca benzersiz ve sıralı olarak, ancak işin içinde değil.

4
katma

Girişleri yalnızca kronolojik sırada almanız gerekiyorsa, bir kimlik yerine bir zaman damgası depolayın.

0
katma