2016-01-22 84 views
0

我的紗線容器內存不足: 此特定容器運行Apache-Spark驅動程序節點。紗線容器內存不足

我不明白的部分:我限制我的驅動程序的堆大小爲512MB(您可以在下面的錯誤消息中看到這一點)。但紗容器抱怨內存大於1GB(另請參見下面的消息)。您可以驗證該紗線是否正在啓動Java,並使用Xmx512m運行。我的容器設置爲1GB內存,增量爲0.5GB。另外我的物理機器託管容器每個都有32GB。我SSH到了其中一個物理機器,並看到它有很多空閒內存...

另一個奇怪的事情是,java不拋出OutOfMemory異常。當我查看驅動程序日誌時,我發現最終它從紗線中獲得了SIGTERM,並很好地關閉。如果Yarn內部的java進程超過了512MB,那麼在它嘗試從紗線中分配1GB之前,是否應該在Java中獲得OutOfMemory異常?

我也嘗試使用1024m堆運行。那一次,容器崩潰,使用量爲1.5GB。這發生了一致。很顯然,容器有能力在1GB的限制之外再分配0.5GB的容量。 (相當邏輯,因爲物理機有30GB的空閒內存)

除了java可以佔用多餘的512MB的YARN容器內部還有其他東西嗎?

我在紗線上運行Apache Spark的CDH 5.4.1。集羣上的Java版本也升級到Oracle Java8。我看到一些人聲稱在java8默認MaxPermSize參數已經改變,但我很難相信,這可能需要多達512MB ...

紗錯誤消息:

Diagnostics: Container [pid=23335,containerID=container_1453125563779_0160_02_000001] is running beyond physical memory limits. Current usage: 1.0 GB of 1 GB physical memory used; 2.6 GB of 2.1 GB virtual memory used. Killing container. 
Dump of the process-tree for container_1453125563779_0160_02_000001 : 
    |- PID PPID PGRPID SESSID CMD_NAME USER_MODE_TIME(MILLIS) SYSTEM_TIME(MILLIS) VMEM_USAGE(BYTES) RSSMEM_USAGE(PAGES) FULL_CMD_LINE 
    |- 23335 23333 23335 23335 (bash) 1 0 11767808 432 /bin/bash -c LD_LIBRARY_PATH=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native::/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native /usr/lib/jvm/java-8-oracle/bin/java -server -Xmx512m -Djava.io.tmpdir=/var/yarn/nm/usercache/hdfs/appcache/application_1453125563779_0160/container_1453125563779_0160_02_000001/tmp '-Dspark.eventLog.enabled=true' '-Dspark.executor.memory=512m' '-Dspark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar' '-Dspark.yarn.am.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.shuffle.service.enabled=true' '-Dspark.yarn.jar=local:/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/spark/assembly/lib/spark-assembly-1.3.0-cdh5.4.1-hadoop2.6.0-cdh5.4.1.jar' '-Dspark.app.name=not_telling-1453479057517' '-Dspark.shuffle.service.port=7337' '-Dspark.driver.extraClassPath=/etc/hbase/conf:/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar' '-Dspark.serializer=org.apache.spark.serializer.KryoSerializer' '-Dspark.yarn.historyServer.address=http://XXXX-cdh-dev-cdh-node2:18088' '-Dspark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native' '-Dspark.eventLog.dir=hdfs://XXXX-cdh-dev-cdh-node1:8020/user/spark/applicationHistory' '-Dspark.master=yarn-cluster' -Dspark.yarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class 'not_telling' --jar file:/home/cloud-user/temp/not_telling.jar --arg '--conf' --arg 'spark.executor.extraClasspath=/opt/cloudera/parcels/CDH/jars/htrace-core-3.0.4.jar' --executor-memory 512m --executor-cores 4 --num-executors 10 1> /var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001/stdout 2> /var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001/stderr 
    |- 23338 23335 23335 23335 (java) 95290 10928 2786668544 261830 /usr/lib/jvm/java-8-oracle/bin/java -server -Xmx512m -Djava.io.tmpdir=/var/yarn/nm/usercache/hdfs/appcache/application_1453125563779_0160/container_1453125563779_0160_02_000001/tmp -Dspark.eventLog.enabled=true -Dspark.executor.memory=512m -Dspark.executor.extraClassPath=/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar -Dspark.yarn.am.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.executor.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.shuffle.service.enabled=true -Dspark.yarn.jar=local:/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/spark/assembly/lib/spark-assembly-1.3.0-cdh5.4.1-hadoop2.6.0-cdh5.4.1.jar -Dspark.app.name=not_tellin-1453479057517 -Dspark.shuffle.service.port=7337 -Dspark.driver.extraClassPath=/etc/hbase/conf:/opt/cloudera/parcels/CDH/lib/hbase/lib/htrace-core-3.1.0-incubating.jar -Dspark.serializer=org.apache.spark.serializer.KryoSerializer -Dspark.yarn.historyServer.address=http://XXXX-cdh-dev-cdh-node2:18088 -Dspark.driver.extraLibraryPath=/opt/cloudera/parcels/CDH-5.4.1-1.cdh5.4.1.p0.6/lib/hadoop/lib/native -Dspark.eventLog.dir=hdfs://XXXX-cdh-dev-cdh-node1:8020/user/spark/applicationHistory -Dspark.master=yarn-cluster -Dspark.yarn.app.container.log.dir=/var/log/hadoop-yarn/container/application_1453125563779_0160/container_1453125563779_0160_02_000001 org.apache.spark.deploy.yarn.ApplicationMaster --class not_telling --jar file:not_telling.jar --arg --conf --arg spark.executor.extraClasspath=/opt/cloudera/parcels/CDH/jars/htrace-core-3.0.4.jar --executor-memory 512m --executor-cores 4 --num-executors 10 

回答

0

退房this article,它有一個很好的描述。您可能需要注意他們在說什麼「在計算執行程序的內存時,請注意最大(7%,384米)開銷堆內存。」

編輯(通過Eshalev):我正在接受這個答案,並詳細說明了發現的內容。 Java8使用不同的內存方案。具體的CompressedClasses在「Metaspace」中保留1024MB。這比以前版本的java在「perm-gen」內存中分配的要大得多。你可以使用「jmap -heap [pid]」來檢查它。我們目前通過超出我們的堆需求超過1024MB而使應用程序崩潰。這是浪費,但它使應用程序不會崩潰。

0

有時候問題在於你的RDD沒有被均分。您也可以嘗試增加分區(通過執行合併或重新分區,您也可以使用partitionBy)對每個/某個轉換進行分區。

+0

不應該這樣造成一個OutOfMemoryException從Java內部的方法更早?我希望這會燒燬我所有的堆內存和崩潰。 (我limitted Java堆與XMX ...) – eshalev

+0

特殊照顧的權利。但也許你可以嘗試讓你的遺囑執行人均勻分佈 – minyo

2

您的應用程序因虛擬內存使用而被終止(請注意,使用2.1GB消息中的2.6)。

幾個選項,可以幫助:紗線-site.xml中

  1. 禁用虛擬內存檢查,通過改變 「yarn.nodemanager.vmem檢查啓用」 爲false。這是相當頻繁地完成的,這通常是我坦白的。
  2. 增加「spark.yarn.executor.memoryOverhead」和「spark.yarn.driver.memoryOverhead」,直到您的作業停止死亡。

這樣做的原因是因爲YARN限制了您的進程允許使用的堆內存量。如果您的應用程序有大量的可執行代碼(java 7或更早版本中的大型perm gen),您將很快達到此限制。如果您使用堆疊內存非常頻繁使用的pyspark,您也很有可能擊中它。

+0

呀,還是可以理解爲什麼Hadoop是保持在默認情況下啓用此的vmem檢查。在Linux(或任何其他操作系統)上幾乎不可能使用jvm進程可靠地跟蹤vmem。如果你需要在紗線上運行任何東西,首先要禁用vmem檢查。 –

1

,除非你要處理的數據非常幾行,你會不遠處,每執行1GB內存去。

來計算,你可以使用正確的ressources最好的辦法是這樣的: 佔用CPU和內存的NB你有1節點上,留下1爲系統HDFS 4個CPU核心(1個芯4 4core節點的情況下,核心,如果你有32個核心節點) 除以2至5(至少2個具有多任務與廣播數據和不要超過5,你將面臨不良HDFS IO帶寬),你會得到您可以在一個節點上擁有的執行者數量。 現在採取的RAM的容量此節點,尋找最大taht紗允許你在一個節點的所有集裝箱(這應該是接近26 GB您的情況),並通過計算之前執行的數量除以它。 刪除10%,你得到了一個執行者的金額或內存。

手動設定執行程序存儲器中作爲HDP或CDH可能強制其384MB至極的spark.yarn.executor.memoryOverhead到10%是最小值。

現在實例的數量,乘以節點執行人X號的號碼,並移除1對驅動器(是的,你應該提高內存和CPU的數量驅動程序的方法相同)

所以例如我已經在AWS 3個節點R4.8xlarge每一個具有32 cpu和244GB存儲器和讓我有每20個執行人與4個CPU和26 GB存儲器

spark.executor.memory=26g 
spark.yarn.executor.memoryOverhead=2600 
spark.driver.memory=26g 
spark.yarn.driver.memoryOverhead=2600 
spark.executor.cores=4 
spark.executor.instances=20 
spark.driver.cores=4 

之後,你可以根據需要調你的配置,例如你可能會減少執行器的數量,讓它們擁有更多的內存。