以下是我的群集配置:
主节点: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上的查询执行。请给我推荐一个适合这种查询的解决方案。
暂无答案!
目前还没有任何答案,快来回答吧!