spark中的sql查询由于广播而执行时间过长

nlejzf6q  于 2021-05-27  发布在  Hadoop
关注(0)|答案(0)|浏览(540)

目前我使用sparksql执行大型查询,从配置单元中的外部表中选择数据。查询通过with语句形成64个表,包含65个小表与大表的左联接;小表包含10-20万条记录,约15万条记录,大表平均包含500-1000万条记录。
最初的执行时间从50分钟到80分钟不等 spark.sql.broadcastTimeout=1 ; 在我按照mazaneicha的建议默认离开这个选项之后,执行时间增加到130分钟。大部分执行时间(大约40-80分钟)都花在广播上,此时查询没有实际执行,而是准备执行。请参见下面的spark sql输出示例:

2020-02-21 11:19:56 INFO  FileInputFormat:247 - Total input paths to process : 1
2020-02-21 11:19:56 INFO  FileInputFormat:247 - Total input paths to process : 1
2020-02-21 11:19:56 INFO  FileInputFormat:247 - Total input paths to process : 1
2020-02-21 11:19:56 INFO  FileInputFormat:247 - Total input paths to process : 1
2020-02-21 11:19:56 INFO  FileInputFormat:247 - Total input paths to process : 1
2020-02-21 11:19:56 INFO  CodeGenerator:54 - Code generated in 14.347002 ms
2020-02-21 11:19:56 INFO  CodeGenerator:54 - Code generated in 26.140162 ms
2020-02-21 11:19:56 INFO  CodeGenerator:54 - Code generated in 35.269363 ms
2020-02-21 11:19:56 INFO  CodeGenerator:54 - Code generated in 27.790616 ms
2020-02-21 11:19:56 INFO  MemoryStore:54 - Block broadcast_80 stored as values in memory (estimated size 298.2 KB, free 4.1 GB)
2020-02-21 11:19:56 INFO  MemoryStore:54 - Block broadcast_80_piece0 stored as bytes in memory (estimated size 27.9 KB, free 4.1 GB)
2020-02-21 11:19:56 INFO  BlockManagerInfo:54 - Added broadcast_80_piece0 in memory on <HOST>:35221 (size: 27.9 KB, free: 4.1 GB)
2020-02-21 11:19:56 INFO  SparkContext:54 - Created broadcast 80 from

类似的输出在实际执行查询之前我看到了很长时间。这么长的时间让我心烦意乱,我正试图找到减少执行时间的方法,因为我需要在2019年和2020年的每一天执行这个查询。例如,我添加了broadcast提示,希望它能加速广播(spark中的sql性能调优)。我还添加了合并和重新分区提示,如下所示:

INSERT OVERWRITE TABLE <table_name>
PARTITION (date='2020-02-20')
SELECT 
/*+ BROADCAST(base_features) */
/*+ COALESCE(8192) */
/*+ REPARTITION(8192) */
COALESCE(...

我按如下方式运行查询:

--master yarn --num-executors 8 --executor-memory 32G --executor-cores 8 --driver-memory 8G --conf "spark.executor.heartbeatInterval=500000" --conf "spark.network.timeout=510000" -f query.hql

目前大约需要60-70分钟才能完成。
我增加了超时,以避免在执行结束时终止任务和异常。
我也试过了 EXPLAIN EXTENDED 语句,但输出很大,解释不好,并且包含敏感信息,我无法共享。档案里我能注意到什么?
问题在查询中吗?也许它是有用的使用 CACHE TABLE 声明为小表,但我不知道如何正确地做。

暂无答案!

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

相关问题