背景
最近在跑 sparkSQL的时候,执行到一半,频繁打印日志报错:
WARN TaskMemoryManager: Failed to allocate a page (104876 bytes), try again.
WARN TaskMemoryManager: Failed to allocate a page (104876 bytes), try again.
…
原因
执行任务的内存不够,需要频繁回收资源
解决办法
1、优化sql脚本。(首选,当时我就是这么解决的)
2、增加driver内存, --driver-memory 6G
我当时的sql 简化如下:
select name
from stu
where id in (select id from in_stu);
stu数据量为 800w, in_stu 数据量为 1.2kw
优化为:
select name
from stu
where id in (select distinct id from in_stu);
优化后in_stu id 的数据量降到 11 w,问题解决。
扩展
对于sql优化,还有另一个解决思路:
当两张很大的表 做 join 操作,比如 a left join b
可以优化为: a left join (SELECT col1, col2, sum(col3) col3 from b group by col1, col2)b
也就是说在join的时候,对于另一张表先做group by 操作 从而降低数据量