本人在试验过程中发现,为Executor分配更大内存(不超过每个节点总内存的75%),会报OOM错误,但是内存分配更小时反而正常运行。
程序过程:从Hbase中读取数据,分区缓存,计算行数
[mw_shl_code=scala,true]val hrdd = sc.newAPIHadoopRDD(configuration, classOf[TableInputFormat],
classOf[org.apache.hadoop.hbase.io.ImmutableBytesWritable],
classOf[org.apache.hadoop.hbase.client.Result])
val hrddre = hrdd.repartition(1000).persist(StorageLevel.MEMORY_ONLY)
hrddre.count()[/mw_shl_code]
读入数据量:30G,300万行左右
集群配置:三个节点,每个节点64G内存,32core,任务启动前集群空闲内存52G以上
采用Standalone模式,按照默认每个节点启动一个Executor,当采用每个Executor分配20G内存时,程序正常:
--executor-memory 20g --total-executor-cores 60
当每个Executor分配超过25G,比如30G,会报OOM错误,程序失败:
--executor-memory 30g --total-executor-cores 60
求教论坛里的高手,Spark或者Linux系统或者JVM会在哪里限制每个Executor的内存上限么,为什么分配更大的内存,反而会内存耗尽呢?
|