调整Spark,设置执行程序和内存驱动程序以读取大型csv文件

时间:2017-12-05 23:06:11

标签: csv apache-spark memory pyspark jupyter-notebook

我想知道如何选择最佳设置来调整我 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 

2 个答案:

答案 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个核心]。