我想知道如何选择最佳设置来调整我 Spark Job 。
基本上我只是将一个大的csv
文件读入DataFrame
并计算一些字符串出现次数。
输入文件超过500 GB。火花工作似乎太慢..
终端进度条:
[Stage1:=======> (4174 + 50) / 18500]
NumberCompletedTasks:
(4174)需要大约一个小时。
NumberActiveTasks:
(50),我相信我可以通过设置来控制。
--conf spark.dynamicAllocation.maxExecutors=50
(尝试使用不同的值)。
TotalNumberOfTasks:
(18500),为什么这是固定的?这是什么意思,它只与文件大小有关吗?
由于我只是用很少的逻辑阅读csv
,我怎样才能优化Spark Job?
我也尝试过改变:
--executor-memory 10g
--driver-memory 12g
答案 0 :(得分:1)
任务数量取决于源RDD的分区数量,在您从HDFS读取的情况下,块大小决定分区数量因此任务数量,它不会基于执行程序数量,如果你想增加/减少你需要改变分区的任务数量,在你的情况下你需要在读取时覆盖HDFS配置min / maxSplit大小,对于现有的RDD,我们可以使用repartion / coalesce来做同样的事情。
答案 1 :(得分:1)
分区数=任务数。 如果你有18500个分区,那么spark将运行18500个任务来处理这些分区。
您只是在阅读文件并从中进行过滤吗?你进行任何广泛的转换吗?如果执行广泛转换,则生成的RDD中的分区数由属性" spark.sql.shuffle.partitions"控制。如果设置为18500,则生成的RDD将具有18500个分区,因此需要18500个任务。
其次,如果启用了动态分配,spark.dynamicAllocation.maxExecutors表示执行程序数的上限。从我所看到的,你有5个节点,每个节点10个执行器[共50个执行器]和每个执行器1个核心[如果你在YARN中运行,那么每个执行器1个核心是默认的]。
更快地运行你的工作:如果可能的话,通过属性spark.sql.shuffle.partitions减少shuffle分区的数量,并增加每个执行器的核心数量[推荐的每个执行器5个核心]。