คอนเทนเนอร์ทำงานเกินขีด จำกัด หน่วยความจำ


85

ใน Hadoop v1 ฉันได้กำหนดตัวทำแผนที่และช่องตัวลดจำนวน 7 ช่องที่มีขนาด 1GB ตัวทำแผนที่และตัวลดขนาดของฉันทำงานได้ดี เครื่องของฉันมีหน่วยความจำ 8G โปรเซสเซอร์ 8 ตัว ตอนนี้ด้วย YARN เมื่อเรียกใช้แอปพลิเคชันเดียวกันบนเครื่องเดียวกันฉันได้รับข้อผิดพลาดเกี่ยวกับคอนเทนเนอร์ โดยค่าเริ่มต้นฉันมีการตั้งค่านี้:

  <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>

มันทำให้ฉันมีข้อผิดพลาด:

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.

จากนั้นฉันพยายามตั้งค่าขีด จำกัด หน่วยความจำใน mapred-site.xml:

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

แต่ยังคงได้รับข้อผิดพลาด:

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.

ฉันสับสนว่าทำไมงานแผนที่ต้องใช้หน่วยความจำมากขนาดนี้ ตามความเข้าใจของฉันหน่วยความจำ 1GB เพียงพอสำหรับงานแผนที่ / ลดขนาดของฉัน เหตุใดเมื่อฉันกำหนดหน่วยความจำให้กับคอนเทนเนอร์มากขึ้นงานจึงใช้มากขึ้น เป็นเพราะแต่ละงานแยกกันมากขึ้นหรือเปล่า? ฉันรู้สึกว่ามันมีประสิทธิภาพมากขึ้นในการลดขนาดของคอนเทนเนอร์ลงเล็กน้อยและสร้างคอนเทนเนอร์เพิ่มขึ้นเพื่อให้งานต่างๆทำงานควบคู่กันไปมากขึ้น ปัญหาคือฉันจะแน่ใจได้อย่างไรว่าแต่ละคอนเทนเนอร์จะไม่ถูกกำหนดให้มีการแยกมากกว่าที่จะจัดการได้



ไฮ! config ของคุณ 'yarn.nodemanager.vmem-pmem-ratio = 2'?
สไปรต์

คำตอบ:


102

คุณควรกำหนดค่าการจัดสรรหน่วยความจำสูงสุดสำหรับ MapReduce อย่างเหมาะสม จากบทช่วยสอน HortonWorks นี้ :

[... ]

แต่ละเครื่องในคลัสเตอร์ของเรามี RAM 48 GB RAM นี้บางส่วนควร> สงวนไว้สำหรับการใช้งานระบบปฏิบัติการ ในแต่ละโหนดเราจะกำหนด RAM 40 GB สำหรับ> YARN เพื่อใช้และเก็บไว้ 8 GB สำหรับระบบปฏิบัติการ

สำหรับคลัสเตอร์ตัวอย่างของเราเรามี RAM ขั้นต่ำสำหรับ Container (yarn.scheduler.minimum-adjustment-mb) = 2 GB ดังนั้นเราจะกำหนด 4 GB สำหรับคอนเทนเนอร์งานแผนที่และ 8 GB สำหรับลดงานคอนเทนเนอร์

ใน mapred-site.xml:

mapreduce.map.memory.mb: 4096

mapreduce.reduce.memory.mb: 8192

แต่ละคอนเทนเนอร์จะเรียกใช้ JVM สำหรับแผนที่และลดงาน ควรตั้งค่าขนาดฮีพ JVM ให้ต่ำกว่าแผนที่และลดหน่วยความจำที่กำหนดไว้ข้างต้นเพื่อให้อยู่ในขอบเขตของหน่วยความจำคอนเทนเนอร์ที่จัดสรรโดย YARN

ใน mapred-site.xml:

mapreduce.map.java.opts: -Xmx3072m

mapreduce.reduce.java.opts: -Xmx6144m

การตั้งค่าดังกล่าวข้างต้นกำหนดค่าขีด จำกัด บนของแรมทางกายภาพที่แผนที่และลดงานที่จะใช้

สรุปได้:

  1. ใน YARN คุณควรใช้การกำหนดค่าmapreduceไม่ใช่แบบmapredที่ใช้ แก้ไข:ความคิดเห็นนี้ใช้ไม่ได้อีกต่อไปเมื่อคุณได้แก้ไขคำถามของคุณแล้ว
  2. สิ่งที่คุณกำหนดคือจำนวนเงินที่คุณต้องการขอไม่ใช่ค่าสูงสุดที่จะจัดสรร
  3. ขีด จำกัด สูงสุดได้รับการกำหนดค่าด้วยการjava.optsตั้งค่าที่ระบุไว้ด้านบน

สุดท้ายคุณอาจต้องการตรวจสอบคำถาม SOอื่น ๆที่อธิบายปัญหาที่คล้ายกัน (และวิธีแก้ไข)


ใช่. โดยการตั้งค่าmapreduce.map.java.optsและmapreduce.reduce.java.optsแก้ปัญหาของฉัน คุณทราบหรือไม่ว่าหน่วยความจำจริงที่กำหนดให้กับงานนั้นถูกกำหนดโดยmapreduce.map/reduce.memory.mb? วิธีการที่ไม่yarn.scheduler.minimum-allocation-mbส่งผลกระทบต่อการกำหนดหน่วยความจำที่เกิดขึ้นจริง?
Lishu

@lishu ถ้าช่วยได้โปรดยอมรับคำตอบ เกี่ยวกับคำถามสุดท้ายของคุณการตั้งค่าเส้นด้ายจะใช้กับการจัดสรรคอนเทนเนอร์ในคลัสเตอร์ ซึ่งรวมถึงแผนที่และลดงาน แต่งานอื่น ๆ จากแอปพลิเคชันประเภทอื่นด้วย การตั้งค่า mapreduce ใช้กับงาน mapreduce เท่านั้น
cabad

@cabad ฉันพัฒนา lib ที่ Lishu ใช้ ฉันสงสัยว่าคุณจะเปลี่ยนอะไรในคำตอบของคุณหรือไม่เมื่อรู้ว่างาน MR กำลังวางไข่กระบวนการที่จัดสรรหน่วยความจำส่วนใหญ่ (สตรีมมิ่ง hadoop) แน่นอนว่าการตั้งค่า Xmx ไม่ส่งผลกระทบต่อกระบวนการภายนอกเนื่องจากไม่ใช่โปรแกรมจาวา ขอบคุณสำหรับความช่วยเหลือของคุณ.
piccolbo

2
ขณะนี้มีเครื่องมือที่มีประโยชน์จาก Hortonworks ที่เรียกว่า hdp-configuration-utils เพื่อรับค่าที่แนะนำ รับได้จากgithub.com/hortonworks/hdp-configuration-utils
selle

1
หากการใช้การกำหนดค่าหน่วยความจำที่เหมาะสมไม่สามารถแก้ไขปัญหาได้ (เช่นในกรณีของฉันจริง ๆ แล้วมันใช้งานได้กับ hadoop ที่ทำงานบน Ubuntu แต่ไม่ใช่บน CentOS) ให้ลองปิดการใช้งานการตรวจสอบvmem
Bakhshi

47

มีการตรวจสอบที่ระดับ Yarn สำหรับอัตราส่วนการใช้หน่วยความจำเสมือนและกายภาพ ปัญหาไม่เพียง แต่ VM มีหน่วยความจำกายภาพไม่เพียงพอ แต่เป็นเพราะการใช้หน่วยความจำเสมือนมากกว่าที่คาดไว้สำหรับหน่วยความจำกายภาพที่กำหนด

หมายเหตุ : สิ่งนี้เกิดขึ้นกับ Centos / RHEL 6 เนื่องจากการจัดสรรหน่วยความจำเสมือนในเชิงรุก

สามารถแก้ไขได้โดย:

  1. การตรวจสอบการใช้งานหน่วยความจำเสมือนปิดการใช้งานโดยการตั้งค่า yarn.nodemanager.vmem เช็คอินเปิดใช้งานการเท็จ ;

  2. เพิ่มอัตราส่วน VM: PM โดยตั้งค่าyarn.nodemanager.vmem-pmem-ratioเป็นค่าที่สูงขึ้น

อ้างอิง :

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

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

เพิ่มคุณสมบัติต่อไปนี้ใน yarn-site.xml

 <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

ฉันมีปัญหาที่คล้ายกันมากกับการใช้ HIVE ใน EMR ไม่มีวิธีแก้ปัญหาที่ยังหลงเหลืออยู่สำหรับฉัน - กล่าวคือไม่มีการกำหนดค่า mapreduce ใดที่ใช้ได้ผลสำหรับฉัน และไม่ได้ตั้งค่าyarn.nodemanager.vmem-check-enabledเป็นเท็จ

อย่างไรก็ตามสิ่งที่ได้ผลคือการตั้งค่าtez.am.resource.memory.mbตัวอย่างเช่น:

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

การตั้งค่าอื่นที่ต้องพิจารณาปรับแต่งคือ yarn.app.mapreduce.am.resource.mb


อืม @hiroprotagonist คุณรู้ไหมว่า "การปรับแต่ง" พารามิเตอร์เส้นด้ายจะต้องเกิดขึ้นก่อนที่ YARN จะเริ่มทำงานหรือใช้เฉพาะในเวลาสมัครเท่านั้น (และสามารถเปลี่ยนจากงานหนึ่งไปเป็นงานถัดไปได้)
ผู้พิพากษาจิต

1
ฉันสามารถตั้งค่าได้ในเวลาสมัคร โดยเฉพาะภายในคอนโซลโต้ตอบแบบไฮฟ์
hiroprotagonist

8

ฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับคำตอบที่ยอมรับได้เนื่องจากชื่อเสียงที่ไม่ดี อย่างไรก็ตามฉันต้องการเพิ่มพฤติกรรมนี้เกิดจากการออกแบบ NodeManager กำลังฆ่าคอนเทนเนอร์ของคุณ ดูเหมือนว่าคุณกำลังพยายามใช้การสตรีม hadoop ซึ่งทำงานเป็นกระบวนการย่อยของงานลดแผนที่ NodeManager ตรวจสอบแผนผังกระบวนการทั้งหมดของงานและถ้ามันกินหน่วยความจำมากกว่าค่าสูงสุดที่ตั้งไว้ใน mapreduce.map.memory.mb หรือ mapreduce.reduce.memory.mb ตามลำดับเราคาดว่า Nodemanager จะฆ่างานมิฉะนั้น งานของคุณคือการขโมยหน่วยความจำที่เป็นของคอนเทนเนอร์อื่นซึ่งคุณไม่ต้องการ


1

ในขณะที่ทำงานกับจุดประกายใน EMR ฉันประสบปัญหาเดียวกันและการตั้งค่าmaximizeResourceAllocation=trueก็ทำตามเคล็ดลับ หวังว่ามันจะช่วยใครสักคน คุณต้องตั้งค่าเมื่อคุณสร้างคลัสเตอร์ จากเอกสาร EMR:

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 ควรพูด:

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

1

เราประสบปัญหานี้เมื่อเร็ว ๆ นี้ หากปัญหาเกี่ยวข้องกับหน่วยความจำผู้ทำแผนที่มีสองสิ่งที่ฉันอยากแนะนำที่ต้องตรวจสอบคือ

  • ตรวจสอบว่าCombiner เปิดใช้งานอยู่หรือไม่ ? ถ้าใช่ก็หมายความว่าจะต้องรันลอจิกลดบนเร็กคอร์ดทั้งหมด (เอาต์พุตของ mapper) สิ่งนี้เกิดขึ้นในหน่วยความจำ ขึ้นอยู่กับแอปพลิเคชันของคุณคุณต้องตรวจสอบว่าการเปิดใช้งาน Combiner ช่วยได้หรือไม่ การแลกเปลี่ยนอยู่ระหว่างไบต์การถ่ายโอนเครือข่ายและเวลาที่ใช้ / หน่วยความจำ / CPU สำหรับลอจิกลดจำนวนของเร็กคอร์ด 'X'
    • หากคุณรู้สึกว่าคอมไบเนอร์ไม่ค่อยมีค่าให้ปิดการใช้งาน
    • หากคุณต้องการตัวรวมและ 'X' เป็นจำนวนมาก (เช่นบันทึกหลายล้านรายการ) ให้พิจารณาเปลี่ยนตรรกะการแยกของคุณ (สำหรับรูปแบบการป้อนข้อมูลเริ่มต้นใช้ขนาดบล็อกน้อยกว่าโดยปกติ 1 บล็อกขนาด = 1 แยก) เพื่อจับคู่จำนวนบันทึกน้อยลงกับ a ผู้ทำแผนที่เดียว
  • จำนวนเร็กคอร์ดที่ประมวลผลในตัวทำแผนที่เดียว โปรดจำไว้ว่าต้องเรียงลำดับระเบียนทั้งหมดในหน่วยความจำ (เอาต์พุตของ mapper จะถูกเรียงลำดับ) พิจารณาการตั้งค่าmapreduce.task.io.sort.mb (ค่าเริ่มต้นคือ 200MB) เป็นค่าที่สูงขึ้นหากจำเป็น mapred-configs.xml
  • หากข้อใดข้างต้นไม่ช่วยให้ลองเรียกใช้ลอจิกแมปเปอร์เป็นแอปพลิเคชันแบบสแตนด์อโลนและกำหนดโปรไฟล์แอปพลิเคชันโดยใช้ Profiler (เช่น JProfiler) และดูว่าหน่วยความจำถูกนำไปใช้ที่ไหน สิ่งนี้สามารถให้ข้อมูลเชิงลึกที่ดีแก่คุณได้

1

รันเส้นด้ายบนระบบย่อย Windows Linux ด้วย Ubunto OS ข้อผิดพลาด "ทำงานเกินขีด จำกัด หน่วยความจำเสมือน Killing container" ฉันแก้ไขได้โดยปิดใช้งานการตรวจสอบหน่วยความจำเสมือนในไฟล์ yarn-site.xml

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

ใน WSL ข้อความแสดงข้อผิดพลาดมีตัวเลขที่ไร้เหตุผล (อย่างน้อยสำหรับฉัน): "... กำลังทำงานเกินขีด จำกัด หน่วยความจำเสมือนการใช้งานปัจจุบัน: ใช้หน่วยความจำกายภาพ 338.8 MB จาก 2 GB หน่วยความจำเสมือน 481.1 GB จาก 4.2 GB ที่ใช้ฆ่าคอนเทนเนอร์ .”
Samik R

@SamikR ใช่ฉันมีสถานการณ์ที่คล้ายกันฉันเดาว่ามันไม่ใช่ปัญหา hadoop มันเป็นปัญหา WSL บางทีฉันอาจต้องโอนการสาธิตไปยังคอมพิวเตอร์ระบบปฏิบัติการ Linux จริง
Bingoabs

0

ฉันไม่ได้ตรวจสอบเป็นการส่วนตัว แต่ข้อผิดพลาด hasoop-yarn-container-virtual-memory-understand-and-solutions-container-is-running-beyond-virtual-memory-ขีด จำกัด -error นั้นฟังดูสมเหตุสมผลมาก

ฉันแก้ไขปัญหาโดยเปลี่ยนyarn.nodemanager.vmem-pmem-ratioเป็นค่าที่สูงขึ้นและฉันยอมรับว่า:

อีกวิธีหนึ่งที่แนะนำน้อยกว่าคือปิดใช้งานการตรวจสอบหน่วยความจำเสมือนโดยตั้งค่าเปิดใช้งาน yarn.nodemanager.vmem เป็น false

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.