【问题标题】:Tune Spark, set executors and memory driver for reading large csv file调整 Spark,设置执行程序和内存驱动程序以读取大型 csv 文件
【发布时间】:2017-12-05 23:06:11
【问题描述】:

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

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

终端进度条

[Stage1:=======>                      (4174 + 50) / 18500]

NumberCompletedTasks: (4174) 大约需要一小时。

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

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

我也尝试过改变:

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

【问题讨论】:

  • 这个文件在本地机器上吗?只有一个文件吗?
  • 只有一个文件,超过 500GB。在具有 6 个节点的集群中运行
  • 那么,这个文件是保存在你的驱动机器上的吧?

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


【解决方案1】:

任务数取决于源 RDD 的分区数,在您从 HDFS 读取的情况下,块大小决定分区数,因此任务数,它不会基于执行程序的数量,如果您想增加/减少需要更改分区的任务数量,在您的情况下,您需要在读取时覆盖 HDFS 配置 min/maxSplit 大小,对于现有的 RDD,我们可以使用 repartion/coalesce 来做同样的事情。

【讨论】:

    【解决方案2】:

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

    您只是在读取文件并对其进行过滤吗?您是否执行任何 Wide 转换?如果执行宽转换,则生成的 RDD 中的分区数由属性“spark.sql.shuffle.partitions”控制。如果将其设置为 18500,那么生成的 RDD 将有 18500 个分区,因此有 18500 个任务。

    其次,spark.dynamicAllocation.maxExecutors 表示启用动态分配时执行器数量的上限。从我所见,您有 5 个节点,每个节点有 10 个执行程序 [总共 50 个执行程序],每个执行程序有 1 个核心 [如果您在 YARN 中运行,则默认每个执行程序有 1 个核心]。

    为了更快地运行你的工作:如果可能的话,通过属性 spark.sql.shuffle.partitions 减少随机分区的数量并增加每个执行器的核心数[推荐每个执行器 5 个核心]。

    【讨论】:

      猜你喜欢
      • 2017-05-29
      • 2018-04-06
      • 2015-11-24
      • 2018-12-17
      • 2019-08-11
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多