Hadoop'ta azaltma görevleri ne zaman başlar? Haritacıların belirli bir yüzdesi (eşiği) tamamlandıktan sonra mı başlıyorlar? Öyleyse, bu eşik sabit mi? Tipik olarak ne tür bir eşik kullanılır?
Yanıtlar:
Azaltma aşamasının 3 adımı vardır: karıştırma, sıralama, azaltma. Karıştırma, verilerin indirgeyici tarafından her eşleştiriciden toplandığı yerdir. Bu, yalnızca bir veri aktarımı olduğu için haritacılar veri üretirken gerçekleşebilir. Öte yandan, sıralama ve küçültme yalnızca tüm eşleyiciler tamamlandıktan sonra başlayabilir. İndirgeyici tamamlanma yüzdesine bakarak MapReduce'un hangisini yaptığını anlayabilirsiniz:% 0-33, karıştırma yapıyor,% 34-66 sıralama,% 67 -% 100 azalma anlamına gelir. Bu nedenle, düşürücüleriniz bazen% 33 oranında "takılı" görünecektir - haritacıların bitirmesini bekliyor.
İndirgeyiciler, biten haritacıların yüzde eşiğine göre karıştırmaya başlar. Redüktörlerin er ya da geç başlaması için parametreyi değiştirebilirsiniz.
Redüktörleri erken başlatmak neden iyi bir şeydir? Zamanla haritacılardan indirgeyicilere veri aktarımını yaydığı için, ağınız darboğazsa bu iyi bir şeydir.
Redüktörleri erken başlatmak neden kötü bir şey? Çünkü yalnızca verileri kopyalarken ve haritacıların bitirmesini beklerken yuvaları "karıştırırlar". Daha sonra başlayan ve aslında azaltma yuvalarını kullanan başka bir iş artık bunları kullanamaz.
Reducers varsayılan değerini değiştirerek başlangıç zaman özelleştirebilirsiniz mapred.reduce.slowstart.completed.maps
içinde mapred-site.xml
. 1.00
Redüktörleri başlatmadan önce tüm haritacıların bitmesini bekleyecek bir değer . Bir değer 0.0
redüktörleri hemen başlatır. Değeri 0.5
haritacıları yarısı tamamlandığında düşürücüler başlayacaktır. mapred.reduce.slowstart.completed.maps
İş bazında da değiştirebilirsiniz . Hadoop'un yeni sürümlerinde (en az 2.4.1) parametre denirmapreduce.job.reduce.slowstart.completedmaps
(teşekkürler user yegor256).
Tipik olarak, sistemde aynı anda birden fazla iş çalıştırılırsa mapred.reduce.slowstart.completed.maps
yukarıda kalmayı severim 0.9
. Bu şekilde, veri kopyalamaktan başka bir şey yapmadıklarında, iş indirgeyicileri zorlamaz. Bir seferde yalnızca bir işiniz varsa, yapmak 0.1
muhtemelen uygun olacaktır.
İndirgeme aşaması, bir redüktör çağrılmadan çok önce başlayabilir. "Bir" eşleştirici işi bitirir bitirmez, üretilen veriler bir miktar sıralama ve karıştırmaya (birleştirici ve bölümleyiciye çağrı içerir) geçer. İndirgeyici "aşama", eşleştirici sonrası veri işlemenin başladığı anda başlar. Bu işlemler yapıldıkça, indirgeyici yüzdesinde ilerleme göreceksiniz. Ancak, redüktörlerin hiçbiri henüz çağrılmadı. Mevcut / kullanılan işlemci sayısına, verilerin niteliğine ve beklenen azaltıcı sayısına bağlı olarak, yukarıda @ Donald-miner tarafından açıklandığı gibi parametreyi değiştirmek isteyebilirsiniz.
Anladığım kadarıyla Azaltma aşaması harita aşamasıyla başlıyor ve haritalardaki kayıtları tüketmeye devam ediyor. Ancak, harita aşamasından sonra sıralama ve karıştırma aşaması olduğu için, tüm çıktıların sıralanması ve indirgeyiciye gönderilmesi gerekir. Dolayısıyla mantıksal olarak, azaltma aşamasının yalnızca harita aşamasından sonra başladığını, ancak aslında performans nedeniyle düşürücüler de eşleyicilerle başlatıldığını hayal edebilirsiniz.
İndirgeme aşaması için gösterilen yüzde, aslında haritaların çıktısından indirgeyici girdi dizinlerine kopyalanan verilerin miktarı ile ilgilidir. Bu kopyalamanın ne zaman başlayacağını bilmek için? Donald'ın yukarıda gösterdiği gibi ayarlayabileceğiniz bir konfigürasyondur. Tüm veriler indirgeyicilere kopyalandığında (yani% 100 azaltma), bu, indirgeyicilerin çalışmaya başladığı andır ve bu nedenle, indirgeyici kodunuz G / Ç veya CPU yoğunsa "% 100 azalma" ile donabilir.
Haritanın azaltma görevinin nasıl çalıştığını daha iyi anlamak için bir WordCount örneğini düşünün. Büyük bir dosyamız olduğunu varsayalım, örneğin bir roman ve görevimiz dosyada her kelimenin kaç kez geçtiğini bulmaktır. Dosya büyük olduğu için farklı bloklara bölünebilir ve farklı çalışan düğümlerinde çoğaltılabilir. Kelime sayımı işi, harita ve azaltma görevlerinden oluşur. Harita görevi her bloğu girdi olarak alır ve bir ara anahtar-değer çifti oluşturur. Bu örnekte, kelimelerin geçtiği sayıları saydığımız için, bir bloğu işlerken eşleyici formun (kelime1, say1), (kelime2, sayı2) vb. Ara sonuçlarına yol açar. Tüm eşleyicilerin ara sonuçları ara sonucu yeniden sıralayacak bir karıştırma aşamasından geçti.
Farklı haritacılardan elde ettiğimiz harita çıktımızın aşağıdaki biçimde olduğunu varsayalım:
Harita 1: - (eşittir, 24) (eski, 32) (ve, 12)
Harita2: - (benim, 12) (is, 23) (oldu, 30)
Harita çıktıları, aynı anahtar değerleri aynı indirgeyiciye verilecek şekilde sıralanır. Burada şuna karşılık gelen anahtarların aynı redüktöre gittiği anlamına gelir. Son çıktıyı üreten redüktördür, bu durumda şu olur: - (ve, 12) (is, 47) (my, 12 ) (idi, 62)
İndirgeyici görevleri yalnızca completion
tüm haritacılardan sonra başlar .
Ancak veri aktarımı Harita'dan sonra gerçekleşir each
. Aslında bu bir çekme operasyonudur.
Bu, her seferinde indirgeyici her harita görevine, Haritadan geri çekilecek bazı verileri olup olmadığını soracak demektir. Herhangi bir eşleyicinin görevini tamamladığını görürlerse, Reducer ara verileri çeker.
Mapper'dan gelen ara veriler, içinde saklanır disk
. Ve Eşleştiriciden Azalt'a veri aktarımı Ağ üzerinden gerçekleşir ( Data Locality
Azaltma aşamasında korunmaz)