[英]Tune Spark, set executors and memory driver for reading large csv file
我想知道如何选择最佳设置来运行我的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
任务数取决于源RDD的分区数,在您要从HDFS读取的情况下,块大小决定分区数,因此任务数就不会取决于执行程序数,如果您想要增加/减少需要更改分区的任务数,在您的情况下,您需要在读取时覆盖HDFS配置的min / maxSplit大小,对于现有的RDD,我们可以使用分区/合并来执行相同的操作。
分区数=任务数。 如果您有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个核心]。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.