在spark sql shell中运行连接查询时发生java堆空间outofmemoryerror

wvyml7n5  于 2021-06-25  发布在  Hive
关注(0)|答案(0)|浏览(332)

以下是我的群集配置:
主节点:1(16 vcpu,64 gb内存)
工作节点:2个(共64个vcpu,256 gb内存)
下面是我尝试在spark sql shell上运行的配置单元查询:

select a.*,b.name as name from (
small_tbl b 
join
(select * 
from large_tbl where date = '2019-01-01') a
on a.id = b.id);

以下是spark ui上显示的查询执行计划:

启动shell时设置的配置属性如下:

spark-sql --conf spark.driver.maxResultSize=30g \
--conf spark.broadcast.compress=true \
--conf spark.rdd.compress=true \
--conf spark.memory.offHeap.enabled=true \
--conf spark.memory.offHeap.size=304857600 \
--conf spark.dynamicAllocation.enabled=false \
--conf spark.executor.instances=12 \
--conf spark.executor.memory=16g 
--conf spark.executor.cores=5 \
--conf spark.driver.memory=32g \
--conf spark.yarn.executor.memoryOverhead=512 \
--conf spark.executor.extrajavaoptions=-Xms20g \
--conf spark.executor.heartbeatInterval=30s \
--conf spark.shuffle.io.preferDirectBufs=true \
--conf spark.memory.fraction=0.5

我已经尝试了这里和这里建议的大多数解决方案,这在上面设置的属性中很明显。据我所知,在驱动程序端增加maxresultsize属性不是一个好主意,因为数据集可能会超出驱动程序的内存大小,并且驱动程序不应用于以这种规模存储数据。
我已经成功地在tez引擎上执行了这个查询,大约花了4分钟,而spark需要15分钟才能执行,并且由于堆空间不足而突然终止。
我坚信一定有办法加速spark上的查询执行。请给我推荐一个适合这种查询的解决方案。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题