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

调整Spark,设置用于读取大型csv文件的执行器和内存驱动程序,csv,apache-spark,memory,pyspark,jupyter-notebook,Csv,Apache Spark,Memory,Pyspark,Jupyter Notebook,我想知道如何选择最佳设置来运行tune meSpark Job。 基本上,我只是将一个大的csv文件读入一个DataFrame并计算一些字符串出现的次数 输入文件超过500 GB。火花工作似乎太慢了 终端进度条: [Stage1:=======> (4174 + 50) / 18500] NumberCompletedTasks:(4174)大约需要一个小时 NumberActiveTasks:(50),我相信我可以通过设置进行控制。 --con

我想知道如何选择最佳设置来运行tune meSpark Job。 基本上,我只是将一个大的
csv
文件读入一个
DataFrame
并计算一些字符串出现的次数

输入文件超过500 GB。火花工作似乎太慢了

终端进度条

[Stage1:=======>                      (4174 + 50) / 18500]
NumberCompletedTasks:
(4174)大约需要一个小时

NumberActiveTasks:
(50),我相信我可以通过设置进行控制。
--conf spark.dynamicAllocation.maxecutors=50
(尝试使用不同的值)

TotalNumberOfTasks:
(18500),为什么这是固定的?这意味着什么,它仅仅与文件大小有关吗? 由于我阅读的是
csv
,几乎没有逻辑,如何优化Spark作业

我还试着改变:

 --executor-memory 10g 
 --driver-memory 12g 

任务的数量取决于源RDD的分区数量,在您从HDFS读取的情况下,块大小决定分区的数量因此任务的数量,它不会基于执行者的数量,如果您想增加/减少需要更改分区的任务数量,在您的情况下,读取时需要覆盖HDFS配置min/MAXSPILT size,对于现有RDD,我们可以使用重新分区/合并来执行相同的操作。

分区数=任务数。 如果您有18500个分区,那么spark将运行18500个任务来处理这些分区

您只是在读取文件并对其进行筛选吗?您是否执行任何广泛的转换?如果执行广域转换,则结果RDD中的分区数由属性“spark.sql.shuffle.partitions”控制。如果设置为18500,那么结果RDD将有18500个分区,结果是18500个任务

其次,spark.DynamicLocation.maxExecutors表示启用动态分配时执行器数量的上限。从我所看到的,您有5个节点,每个节点10个执行器[总共50个执行器],每个执行器1个芯[如果您在纱线中运行,则默认情况下每个执行器1个芯]


要更快地运行作业:如果可能,请通过属性spark.sql.shuffle.partitions减少洗牌分区的数量,并增加每个执行器的内核数量[5个内核是建议的]。

此文件是否在本地计算机中?只有一个文件吗?只有一个文件,超过500gb。运行在一个有6个节点的集群中。所以,这个文件存储在您的驱动程序机器上,对吗?