easthome001 发表于 2017-1-23 18:19 你在分区的时候,要合理。凡是不均匀的都可以叫倾斜,但在资源有限情况,而且分的极其不合理时候就会出现内存溢出的异常啦。 |
数据倾斜楼主怎么弄的。重新负载? |
lanyangkj 发表于 2017-1-23 17:56 还没回家过年 |
以上回答都算正确 正解是: 数据倾斜了! |
你这个肯定得找出是哪个算子造成的内存溢出,这样才好解决! |
einhep 发表于 2017-1-13 15:26 谢谢你的回答,不是这个问题! |
除了worker内存不够,另外的原因,可能是drive内存不够 可以在在spark-submit中指定 --driver-memory memSize参数来设定driver的jvm内存大小,可以通过spark-submit --help查看其他可以设置的参数。 eg: ./spark-submit \ --master spark://7070 \ --class $MAIN_CLASS \ --executor-memory 3G \ --total-executor-cores 10 \ --driver-memory 2g \ --name $APP_NAME \ --conf "spark.executor.extraJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" \ "$SPARK_APP_JAR" |
楼主都是怎么优化的。 产生这个问题,主要是Worker上面分配的任务执行数据时所需要的内存不够,直接导致内存溢出了 可以尝试下面三个方案 A、相同资源下,增加partition数可以减少内存问题。 原因如下:通过增加partition数,每个task要处理的数据少了,同一时间内,所有正在运行的task要处理的数量少了很多,所有Executor占用的内存也变小了。这可以缓解数据倾斜以及内存不足的压力。 B、关注shuffle read 阶段的并行数。例如reduce,group 之类的函数,其实他们都有第二个参数,并行度(partition数),只是大家一般都不设置。不过出了问题再设置一下,也不错。 C、给一个Executor 核数设置的太多,也就意味着同一时刻,在该Executor 的内存压力会更大,GC也会更频繁。我一般会控制在3个左右。然后通过提高Executor数量来保持资源的总量不变。 上面只是三个方法,问题的根本原因只要解决内存问题即可 |