SORU
12 Ocak 2013, CUMARTESİ


Nasıl Hadoop işlem kayıtları blok sınırları boyunca ayrılır?

Hadoop - The Definitive Guide göre

Define FileİnputFormats mantıksal kayıtları genellikle düzgün HDFS blok içine sığmaz. Örneğin, bir TextİnputFormat mantıksal kayıtları HDFS sınırları daha sık geçecek olan çizgiler vardır. Bu hiçbir rulman üzerinde işleyen programınızı hatları değil cevapsız veya kırık, örneğin—ama buna değer bilmek, öyle demek veri-yerel haritalar (maps çalışmakta aynı ev sahibi olarak onların veri girişi) gerçekleştirmek biraz uzak okur. Bu nedenler hafif yükü normalde önemli değildir.

Kayıt bir satır iki blok (b1 ve b2 arasında bölünmüş olduğunu varsayalım. Okuma cihazını ilk blok işleme (b1) son satırı EOL ayırıcı yok olduğunu fark edecek ve sonraki veri bloğunu (b2) satırın kalan getirir.

Nasıl eşleyici ikinci blok (b2) işleme ilk kaydı eksik olduğunu tespit ediyor ve işlem bloğunda ikinci kaydı (b2) başlangıç yapmalıyım?

CEVAP
26 Ocak 2013, CUMARTESİ


İlginç bir soru, biraz zaman ayrıntılar için kod bakarak geçirdim ve burada benim düşünceleri vardır. Bu FileİnputFormat baktığımızda aşağıdaki bilgi verir InputFormat.getSplits, istemci tarafından işlenir böler:

  • Her giriş, dosya uzunluğu, blok boyut ve maxSize mapred.max.split.size minSize karşılık geldiği max(minSize, min(maxSize, blockSize)) split boyutunu hesaplamak için mapred.min.split.size.
  • FileSplitfarklı s split boyutu yukarıda hesaplanır içine dosyayı bölmek. Burada önemli olan buFileSplit start bir parametre girdi dosyasında ofset ile ilgili başlatıldı. Hala bu noktada çizgilerini kullanma diye bir şey yok. Kodun ilgili kısmı şöyle:

    while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
      int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
      splits.add(new FileSplit(path, length-bytesRemaining, splitSize, 
                               blkLocations[blkIndex].getHosts()));
      bytesRemaining -= splitSize;
    }
    

Eğer TextInputFormat tarafından tanımlanan LineRecordReader bakarsanız bundan sonra, bu satırları işlenir nerede:

  • LineRecordReader başlatmak FSDataInputStream üzerinde çizgiler okuyabilmek için bir soyutlama olan ** 16 yaşında bir örneğini oluşturmaya çalışır. 2 durum vardır:
  • Eğer CompressionCodec tanımlanmış ise, o zaman bu sınırları ele sorumludur Kodek. Muhtemelen Sorunuzun konuyla ilgisi yok.
  • InputSplit start daha sonra 0, farklı ise . eğer Kodek ancak eğer yok, bu da bazı ilginç nerede: ^strong>geriye 1 karakter ve sonra \n \r\n (Windows) tarafından belirlenen karşılaşma ilk satırı atlamak! Bu geri çizgi sınırlarını bölünmesi sınırları halinde, bu geçerli satırı atlamayın sağlar, çünkü bu önemlidir. Burada ise ilgili kod:

    if (codec != null) {
       in = new LineReader(codec.createInputStream(fileIn), job);
       end = Long.MAX_VALUE;
    } else {
       if (start != 0) {
         skipFirstLine = true;
         --start;
         fileIn.seek(start);
       }
       in = new LineReader(fileIn, job);
    }
    if (skipFirstLine) {  // skip first line and re-establish "start".
      start  = in.readLine(new Text(), 0,
                        (int)Math.min((long)Integer.MAX_VALUE, end - start));
    }
    this.pos = start;
    

İstemci hesaplanır böler beri, mappers sırayla çalıştırmak için gerek yok, her eşleyici zaten Eğer ilk satırı silmek için neds ya da değil bilir.

Eğer aynı dosya içinde her 100Mb 2 hattınız varsa, ve basitleştirmek için yani temelde bölünmüş boyutu 64 MB olduğunu söylüyorlar. Giriş hesaplanır böler, aşağıdaki senaryo olacak o zaman:

  • 1 Bu engellemek için yol ve ana içeren bölme. Başlatıldı başlar 200-200=0Mb, uzunluğu 64 MB.
  • Split 2 200-200 64=64 MB, 64 MB uzunluk başında başlatıldı.
  • Split 3 200-200 128=128 MB, 64 MB uzunluk başında başlatıldı.
  • Split 4 başlangıç 200-200 192=192Mb, uzunluğu 8 MB başlatıldı.
  • Eşleyici 64 MB sınırını aşan ilk satırı atlamak yok, ve tam bir satırı okumak çok 0. 1 süreç bölünmeye kadar uzaktan okuma ihtiyacı var.
  • Eşleyici B split 2, başlangıç=! işleyecek 0 yüzden atlamak ilk satırdan sonra 64 MB-1byte, karşılık gelen satır sonu 1 100Mb ki hala bölünmüş 2, Biz 28Mb doğrultusunda bölünmüş 2, uzaktan okuma kalan 72Mb.
  • Eşleyici C split 3, başlangıç=! işleyecek Dosya sonu olan 200Mb, 2 satır sonuna denk 128 MB-1byte, sonra ilk satırı atlamak 0 öyle bir şey yapma.
  • Eşleyici D 192Mb-1byte sonra bir yeni satır arar dışında eşleyici olarak aynı C.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006
  • The Scary Snowman

    The Scary Sn

    1 ŞUBAT 2011
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008