Spark遇到的一个内存错误

Spark遇到的一个内存错误

问题

项目中遇到的一个问题,其实不是spark的锅,但错误是它爆出来的,排错过程可以借鉴:
错误是这样的:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 29 in stage 0.0 failed 4 times, most recent failure: Lost task 29.3 in stage 0.0 (TID 92, 10.252.252.125, executor 23): ExecutorLostFailure (executor 23 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.
Driver stacktrace:
at org.apache.spark.scheduler.DAGScheduler.orgapachesparkschedulerDAGSchedulerfailJobAndIndependentStages(DAGScheduler.scala:1891) at org.apache.spark.scheduler.DAGScheduleranonfunabortStage1.apply(DAGScheduler.scala:1879)
at org.apache.spark.scheduler.DAGScheduler$$anonfunabortStage1.apply(DAGScheduler.scala:1878)
……

这个错误是spark任务进行了一段时间之后出来的,在启动集群和提交任务之初不会有(有的话原因也不一样)。
关键信息是“Likely due to containers exceeding thresholds”,看上去和资源有关,但又不是常见的GC。进入spark的logs目录,没有从master和worker的LOG中看到有用的信息。进入spark的work目录,查看各个任务的日志,发现很多executor产生了hs_err_pidxxxx.log文件,报内存不足:

There is insufficient memory for the Java Runtime Environment to continue.
Native memory allocation (mmap) failed to map 291504128 bytes for committing reserved memory.
Possible reasons:
The system is out of physical RAM or swap space
In 32 bit mode, the process size limit was hit
Possible solutions:
Reduce memory load on the system
Increase physical memory or swap space
Check if swap backing store is full
Use 64 bit Java on a 64 bit OS
Decrease Java heap size (-Xmx/-Xms)
Decrease number of Java threads
Decrease Java thread stack sizes (-Xss)
Set larger code cache with -XX:ReservedCodeCacheSize=
This output file may be truncated or incomplete.
……

但实际上机器的可用内存资源很充足。256g内存+30多g的swap空间。

尝试1

配置Spark的内存,降低worker、executor等的内存申请量,问题得到了缓解。基本上只用到总内存量的50%以下,问题就基本没了(偶尔还会报错)。
在这个过程中,学习了spark对on_heap和off_heap的一些关联i机制(比如一般通过spark_env配的内存都是on_heap)。
不过最后发现这些配置没啥用,最终有用的就是降低spark内存申请。但明明有很多内存却分配不了的感觉令人不爽,治标不治本。

尝试2

和spark以及任务的各处都找不到有用的信息了,网上也没有特别现成的解决方案。之后从Linux的角度出发:采用:
free -h

cat /proc/meminfo
命令查看发现,cache/buffer占用内存特别大(主要是cache),一些解释说诸如对文件特别多的目录使用ls,其结果都会缓存下来(buffer),此外可能一些异常进程也留下了垃圾),再有就是读写缓存了(cache)。
于是执行:
sync
echo 3 > /proc/sys/vm/drop_caches
等命令清理cache。果然可用的内存增多了。参考:

Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes: echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.

此外通过jps命令发现了一些进程为:process information unavailable
执行:
rm -rf /tmp/hsperfdata_*
清楚了残留的进程。
不过submit spark任务之后还是出现内存不够分的情况,换句话说刚才的设置不起作用。

尝试3

后来看是研究下面两个文件:

  1. /etc/security/limits.conf :主要配置并发进程数量和同时打开文件数量。但是项目设备的配置是合理的,并不需要修改。
  2. /etc/sysctl.conf:这里面又大量内存参数可以改,当然是不是起到优化效果就不一定了。这些配置还可以通过sysctl命令查询或设置:
    sysctl -a (查看所有参数)
    sysctl -w vm.overcommit_memory=2 ( -w 临时改变参数的值)

网上一些参考:

vm.dirty_ratio = 1
vm.dirty_background_ratio=1
vm.dirty_writeback_centisecs=2
vm.dirty_expire_centisecs=3
vm.drop_caches=3
vm.swappiness =100
vm.vfs_cache_pressure=163
vm.overcommit_memory=2
vm.lowmem_reserve_ratio=32 32 8
kern.maxvnodes=3

进行了一些修改并确认生效之后,确认大部分参数解决不了问题。最后发现问题落在

vm.overcommit_memory=2

这个参数及其配套参数的默认值应该是:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

显然是有人改过这个数值。网上对者overcommit_memory有截然不同的解释,比如有的说:

  • 0是根据可用内存分配内存给进程。1是根据所有物理内存分配内存给进程,不管当前内存状态。2是允许内存分配超出物理内存和交换空间的总内存。

我采信了这个观点,所以看到设备上配置了vm.overcommit_memory=2,觉得是一个减少内存限制的配置。但后来觉得不对劲,因为详查hs_err_pidxxxx.log文件的时候发现了:

CommitLimit: 165156708 kB
Committed_AS: 164839264 kB

设备的实际内存是256g+30多g的swap空间。但是这个limit范围大概是150G左右,也可以通过Committed_AS(实际分配内存)看出基本分完了。于是通过CommitLimit和Committed_AS为关键字查询,发现了对overcommit_memory不同的解释:

  • 当设置vm.overcommit_memory=2时,可申请内存为: SWAP + 物理内存 * overcommit_ratio/100

overcommit_ratio的默认值是50。换句话说,我有256g内存,可用范围就是 128+30g左右,这和在hs_err_pidxxxx.log看到的信息一致。通过:
sysctl -w overcommit_ratio = 80
等方式临时或永久(通过修改sysctl.conf文件)修改 overcommit_ratio值,可分配的内存值确实就增多了(配置vm.overcommit_memory=0或1可能也能解决问题,但由于是共用设备,不知道别人为什么改,能少动就少动)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容

  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,442评论 0 13
  • 姓名: 李小娜 [嵌牛导读] :当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正...
    n184阅读 3,827评论 0 1
  • 在Redis的开发和运维过程中,由于对于Redis的某些特性没有真正合理地使用,会遇到一些棘手的问题,本章将对一些...
    linuxzw阅读 972评论 0 2
  • 目标:解决大量Log写入占用大量的File Cache,内容利用不充分导致swap 基本原则:尽量使用内存,减少s...
    明翼阅读 1,604评论 0 1
  • 那个春天,我是一只受了伤的猫咪,经常与狗子喝酒,可我知道狗子们毕竟是狗子,那不是我要的,猫咪的世界里我还是孤独的,...
    白阿布白阅读 440评论 0 0