Kapsayıcı bellek sınırlarının ötesinde çalışıyor


85

Hadoop v1'de, her 7 eşleyici ve düşürücü yuvasını 1 GB boyutunda atadım, eşleyicilerim ve indirgeyicilerim sorunsuz çalışıyor. Makinemde 8G bellek, 8 işlemci var. Şimdi YARN ile aynı uygulamayı aynı makinede çalıştırdığımda konteyner hatası alıyorum. Varsayılan olarak şu ayarlara sahibim:

  <property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>1024</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
  </property>
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>

Bana hata verdi:

Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.

Daha sonra mapred-site.xml'de bellek sınırı ayarlamaya çalıştım:

  <property>
    <name>mapreduce.map.memory.mb</name>
    <value>4096</value>
  </property>
  <property>
    <name>mapreduce.reduce.memory.mb</name>
    <value>4096</value>
  </property>

Ama yine de hata alıyorum:

Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.

Harita görevinin neden bu kadar belleğe ihtiyacı olduğunu kafam karıştı. Anladığım kadarıyla haritam / azaltma görevim için 1GB hafıza yeterli. Neden konteynere daha fazla bellek atadıkça görev daha çok kullanıyor? Her görevin daha fazla bölünmesi mi? Kabın boyutunu biraz küçültmenin ve daha fazla kap oluşturmanın daha verimli olduğunu düşünüyorum, böylece daha fazla görev paralel olarak çalışıyor. Sorun şu ki, her bir konteynere başa çıkabileceğinden daha fazla bölme atanmayacağından nasıl emin olabilirim?



Selam ! yapılandırmanız 'iplik.nodemanager.vmem-pmem-oranı = 2'?
sprite

Yanıtlar:


102

Ayrıca MapReduce için maksimum bellek ayırmalarını doğru şekilde yapılandırmalısınız. Gönderen bu HortonWorks öğretici :

[...]

Kümemizdeki her makinede 48 GB RAM bulunmaktadır. Bu RAM'in bir kısmı İşletim Sistemi kullanımı için> ayrılmalıdır. Her düğümde, İşletim Sistemi için kullanmak ve 8 GB'ı kullanmak üzere YARN için 40 GB RAM atayacağız

Örnek kümemiz için, bir Konteyner için minimum RAM'e sahibiz (iplik.scheduler.minimum-ayırma-mb) = 2 GB. Bu nedenle, Harita görevi Kapsayıcıları için 4 GB ve Görevleri Azaltma Kapsayıcıları için 8 GB atayacağız.

Mapred-site.xml'de:

mapreduce.map.memory.mb: 4096

mapreduce.reduce.memory.mb: 8192

Her Konteyner, Harita ve Azaltma görevleri için JVM'leri çalıştıracaktır. JVM yığın boyutu, YARN tarafından ayrılan Konteyner belleğinin sınırları içinde olmaları için yukarıda tanımlanan Eşleme ve Azaltma belleğinden daha düşük bir değere ayarlanmalıdır.

Mapred-site.xml'de:

mapreduce.map.java.opts: -Xmx3072m

mapreduce.reduce.java.opts: -Xmx6144m

Yukarıdaki ayarlar , Harita ve Azaltma görevlerinin kullanacağı fiziksel RAM'in üst sınırını yapılandırır .

Özetlersek:

  1. mapreduceYARN'da yapılandırmaları kullanmalısınız , mapredolanları değil . DÜZENLEME: Sorunuzu düzenlediğiniz için bu yorum artık geçerli değil.
  2. Yapılandırmakta olduğunuz şey, tahsis edilecek maksimum miktar değil, aslında ne kadar talep etmek istediğinizdir.
  3. Maksimum limitler, java.optsyukarıda listelenen ayarlarla yapılandırılır .

Son olarak, benzer bir sorunu (ve çözümü) tanımlayan bu diğer SO sorusunu kontrol etmek isteyebilirsiniz .


Evet. Sorunumu ayarlayarak mapreduce.map.java.optsve mapreduce.reduce.java.optsçözerek. Göreve atanan gerçek belleğin yalnızca tarafından mapreduce.map/reduce.memory.mbmı tanımlandığını biliyor musunuz ? yarn.scheduler.minimum-allocation-mbGerçek bellek atamasını nasıl etkiler?
Lishu

@lishu, eğer yardımcı olduysa, lütfen cevabı kabul et. Son sorunuzla ilgili olarak, iplik ayarı, kümedeki herhangi bir kap tahsisi için geçerlidir; bu harita ve görevleri azaltmayı, ancak diğer Uygulama türlerinden diğer görevleri de içerir. Mapreduce ayarları yalnızca mapreduce işleri için geçerlidir.
cabad

@cabad, Lishu'nun kullandığı bir kitaplık geliştiriyorum. MR görevinin aslında belleğin çoğunu ayıran bir süreci (hadoop akışı) ortaya çıkardığını bilerek cevabınızda herhangi bir şeyi değiştirip değiştirmeyeceğinizi merak ediyordum. Kesinlikle Xmx ayarı, bir java programı olmadığı için harici süreci etkilemez. Yardımınız için teşekkürler.
piccolbo

2
Şimdi Hortonworks tarafından önerilen değerleri almak için hdp-configuration-utils adında kullanışlı bir araç var. Dan alın github.com/hortonworks/hdp-configuration-utils
selle

1
Uygun bellek yapılandırmasını uygulamak sorunu çözmediyse (benim durumumda olduğu gibi, aslında ubuntu'da çalışan ancak CentOS'ta çalışmayan bir hadoop üzerinde çalıştı) vmem kontrolünü devre dışı bırakmayı deneyin: blog.cloudera.com/blog/2014/04/…
Bakhshi

47

Sanal ve Fiziksel bellek kullanım oranı için İplik seviyesinde bir kontrol vardır. Sorun sadece sanal makinenin yeterli fiziksel belleğe sahip olmaması değildir. Ancak bunun nedeni, sanal bellek kullanımının belirli fiziksel bellek için beklenenden fazla olmasıdır.

Not : Bu, sanal belleğin agresif tahsisi nedeniyle Centos / RHEL 6'da oluyor.

Aşağıdakilerden biri çözülebilir:

  1. Ayarlayarak devre dışı bırak sanal bellek kullanımı kontrol yarn.nodemanager.vmem-çek özellikli etmek yanlış ;

  2. İplik.nodemanager.vmem-pmem oranını daha yüksek bir değere ayarlayarak VM: PM oranını artırın .

Referanslar :

https://issues.apache.org/jira/browse/HADOOP-11364

http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/

İplik-site.xml'de aşağıdaki özelliği ekleyin

 <property>
   <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
    <description>Whether virtual memory limits will be enforced for containers</description>
  </property>
 <property>
   <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
    <description>Ratio between virtual memory to physical memory when setting memory limits for containers</description>
  </property>

15

EMR'de HIVE kullanırken gerçekten benzer bir sorun yaşadım. Mevcut çözümlerin hiçbiri benim için işe yaramadı - yani, mapreduce yapılandırmalarının hiçbiri benim için çalışmadı; ve hiçbiri yarn.nodemanager.vmem-check-enabledyanlış ayarlamadı .

Bununla birlikte, sonuçta işe yarayan şey ayarlanmaktı tez.am.resource.memory.mb, örneğin:

hive -hiveconf tez.am.resource.memory.mb=4096

İnce ayar yapmayı düşünmeniz gereken başka bir ayar da yarn.app.mapreduce.am.resource.mb


Um @hiroprotagonist, iplik parametresinin YARN başlamadan önce "ince ayarlanması" gerekip gerekmediğini veya sadece uygulama zamanında kullanılıp kullanılmayacağını (ve bir işten diğerine değiştirilebileceğini) biliyor musunuz?
Yargıç Mental

1
uygulama zamanında ayarlayabildim. özellikle kovan etkileşimli konsolu içinde.
hiroprotagonist

8

Düşük itibar nedeniyle kabul edilen cevap hakkında yorum yapamam. Ancak, eklemek isterim ki, bu davranış tasarım gereğidir. NodeManager, kapsayıcınızı öldürüyor. Harita azaltma görevinin alt süreci olarak çalışan hadoop akışını kullanmaya çalışıyorsunuz gibi görünüyor. NodeManager, görevin tüm işlem ağacını izler ve eğer sırasıyla mapreduce.map.memory.mb veya mapreduce.reduce.memory.mb'deki maksimum setten daha fazla bellek tüketirse, Nodemanager'ın görevi sonlandırmasını bekleriz, aksi takdirde Senin görevin, istemediğin diğer kaplara ait olan belleği çalmak.


1

EMR'de kıvılcımla çalışırken aynı sorunu ve ayarı yaşıyordum maximizeResourceAllocation=true hile yaptı; umarım birine yardımcı olur. Kümeyi oluştururken ayarlamanız gerekir. Gönderen EMR docs:

aws emr create-cluster --release-label emr-5.4.0 --applications Name=Spark \
--instance-type m3.xlarge --instance-count 2 --service-role EMR_DefaultRole --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole --configurations https://s3.amazonaws.com/mybucket/myfolder/myConfig.json

MyConfig.json şunu söylemelidir:

[
  {
    "Classification": "spark",
    "Properties": {
      "maximizeResourceAllocation": "true"
    }
  }
]

1

Son zamanlarda bu sorunla da karşılaştık. Sorun eşleştirici belleğiyle ilgiliyse, kontrol edilmesi gereken birkaç şey önermek isterim.

  • Olmadığını kontrol edin birleştirici etkin olup ? Evet ise, bu, tüm kayıtlarda azaltma mantığının çalıştırılması gerektiği anlamına gelir (eşleyicinin çıktısı). Bu hafızada olur.Uygulamanıza bağlı olarak, birleştiriciyi etkinleştirmenin yardımcı olup olmadığını kontrol etmeniz gerekir. Takas, ağ aktarım baytları ile 'X' sayıda kayıt üzerinde azaltma mantığı için alınan zaman / bellek / CPU arasındadır.
    • Birleştiricinin çok değerli olmadığını düşünüyorsanız, devre dışı bırakın.
    • Birleştiriciye ihtiyacınız varsa ve 'X' çok büyük bir sayıysa (örneğin milyonlarca kayıt), o zaman ayırma mantığınızı değiştirmeyi düşünün (Varsayılan giriş biçimleri için daha az blok boyutu kullanın, normalde 1 blok boyutu = 1 bölme) tek eşleyici.
  • Tek bir eşleştiricide işlenen kayıt sayısı. Tüm bu kayıtların bellekte sıralanması gerektiğini unutmayın (eşleyicinin çıktısı sıralanır). Gerekirse, mapreduce.task.io.sort.mb'yi (varsayılan 200MB) daha yüksek bir değere ayarlamayı düşünün . mapred-configs.xml
  • Yukarıdakilerden herhangi biri yardımcı olmadıysa, eşleyici mantığını bağımsız bir uygulama olarak çalıştırmayı deneyin ve bir Profiler (JProfiler gibi) kullanarak uygulamanın profilini çıkarın ve belleğin nerede kullanıldığını görün. Bu size çok iyi bilgiler verebilir.

1

Ubunto OS ile Windows Linux alt sisteminde iplik çalıştırma, hata "sanal bellek sınırlarının ötesine geçiyor, Killing container" İplik-site.xml dosyasında sanal bellek kontrolünü devre dışı bırakarak sorunu çözdüm

<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> 

WSL'de hata mesajında ​​saçma sayılar var (en azından benim için): "... sanal bellek sınırlarının ötesinde çalışıyor. Mevcut kullanım: 338,8 MB 2 GB fiziksel bellek kullanıldı; 481,1 GB 4,2 GB sanal bellek kullanıldı. Öldürme kapsayıcısı . "
Samik R

@SamikR Evet, benzer bir durum var sanırım hadoop sorunları değil, WSL sorunları. Belki demoyu gerçek bir Linux işletim sistemi bilgisayarına
aktarmam gerekiyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.