2010-08-01 30 views
14

Çok sayıda desen eşleştirmesi yaparak 1,5 TB üzerinde bir Hadoop işi çalıştırıyorum. Her biri 16GB RAM olan birkaç makinem var ve bu işte her zaman OutOfMemoryException'u bu veri ile elde ediyorum (Hive kullanıyorum).Hadoop çalışırken OutOfMemoryException nasıl önlenir?

hadoop-env.sh numaralı dosyada HADOOP_HEAPSIZE numaralı seçeneği nasıl en iyi şekilde ayarlayacağımı bilmek isterim, işim başarısız olur. Bu seçeneği ayarlamak bile, işlerim başarısız olmayacak mı?

HADOOP_HEAPSIZE - 1,5 GB arası ayarlandığında ve desen eşlemesinin yarısını sorgudan kaldırdığımda, iş başarıyla çalıştırılır. Peki, iş aksaklıklarından kaçınmaya yardımcı olmazsa, bu seçenek nedir?

En uygun kurulumla daha fazla deneme yapmayı deniyorum, ancak bu işler 10 saat sürdüğü için tavsiyenizi istiyorum.

+0

HADOOP_HEAPSIZE'nın * başarısız olmasından ne gibi bir şey olduğunu düşünüyorsunuz? Senin deneyimlerinden olduğu gibi geliyor. Sadece verilerinizi/işinizi incelemenizden bilinen nedenlerden dolayı, durumunuz en azından bu büyüklükte bir yığın boyutu gerektirmektedir. İşinizi bu kadar büyük bir yığına ihtiyaç duymayacak şekilde yeniden düzenleyebilir misiniz? –

+0

İşimi değiştirdim, bu yüzden bu kadar büyük bir yığın kullanmıyor, aynı zamanda bu sırada HADOOP_HEAPSIZE değiştirdim. Ve ben bu kargaşanın gerçek bir sonucunu görmüyorum, demek istediğim: Neden yığın daha küçük ayarla: miktar_of_my_RAM/number_of_mappers_or_reducers? – wlk

cevap

13

İş başarısız mı, yoksa sunucunuz çöküyor mu? İşiniz düğümlerdeki OutOfMemmory nedeniyle başarısız oluyorsa, azami harita ve redüktör sayınızı seçebilirsiniz ve JVM her biri için bir tercihte bulunmaz. mapred.child.java.opts (varsayılan değer 200Xmx'dir), genellikle veri düğümlerine özgü donanımınıza bağlı olarak artırılmalıdır.

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

En görevleri Namenode kurulum veya geçersiz olduğu (ve son set) farklı donanım düzenlemelerine sahip olabilir veri düğümlerde olabilir. Maksimum görevler, hem eşleştiriciler hem de redüktörler için ayarlanır. Bunu hesaplamak için, işlemci (çekirdekler) ve sahip olduğunuz RAM miktarını ve ayrıca mapred.child.java.opts içinde ayarladığınız JVM max'ı (varsayılan değer 200) temel alır. Datanode ve Tasktracker'ın her biri 1GB'a ayarlanır, bu yüzden 8GB'lık bir makine için mapred.tasktracker.map.tasks.maximum, 7'ye ve mapred.tasktracker.reduce.tasks.maximum, mapred.child.java ile 7'ye ayarlanabilir. .opts -400Xmx'e ayarlandı (8 çekirdeği varsayar). Lütfen 1'den fazla çekirdekli 1 CPU'nuz varsa, bu görev maksimumları CPU'nuz tarafından yapılıyorsa, o zaman veri düğümünüz için yeni donanım almanın veya maske görevlerini 1'e ayarlamanın zamanı olduğunu unutmayın. 4 çekirdekli 1 CPU'nuz varsa haritayı 3'e ayarlamak ve 3'e küçültmek iyi olacaktır (daemon için 1 çekirdekten tasarruf etmek).

Varsayılan olarak, yalnızca bir redüktör vardır ve mapred.reduce.tasks öğelerini birden çok olacak şekilde yapılandırmanız gerekir. Bu değer, düğüm başına düşen maksimum görev sayısının .95 ile 1.75 katı arasında bir sayı olmalıdır. Bu nedenle, 3 veri düğümünüz varsa ve en fazla 7 görevini ayarladıysanız, bunu 25 ile 36 arasında yapılandırın.

Sunucunuz OutOfMemory sorunları ile çöküyorsa, HADOOP_HEAPSIZE yalnızca işlem yığını için gelir (burada değil). görev yürütme).

Son olarak, İşiniz o kadar uzun sürüyorsa, başka bir iyi yapılandırma eklemenizin olup olmadığını kontrol edebilirsiniz: mapred.compress.map.output. Bu değerin true olarak ayarlanması (özellikle sıkıştırmak için aktarma zamanı arasındaki denge), özellikle büyük veri kümeleriyle çalışırken redüktörlerin kopyalanmasını büyük ölçüde hızlandırır. Genellikle işler zaman alır, ancak işleri hızlandırmak için çimdikleme seçenekleri de vardır. = 8 ^)