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
İ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ğimax(minSize, min(maxSize, blockSize))
split boyutunu hesaplamak içinmapred.min.split.size
. FileSplit
farklı 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şlatmakFSDataInputStream
ü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.
Vim kayıtları nasıl kullanılır?...
Nasıl performSelector:withObject:after...
Nasıl XML etiketleri bir blok açıklama...
Nasıl'in Komut İstemi Windows 5 s...
Nasıl açık SQL işlem günlüğü Server mı...