首页 > 解决方案 > 星火集群配置

问题描述

我正在使用具有两个节点的 spark 集群,每个节点都有两个执行器(每个使用 2 个内核和 6GB 内存)。

这是一个很好的集群配置,可以更快地执行我的 spark 作业吗?

我对 spark 有点陌生,我正在处理 8000 万行数据,其中包括重组繁重的任务,如聚合(计数)和连接操作(数据帧上的自连接)。

瓶颈:

  1. 在读取数据时显示我的执行者资源不足。
  2. 在较小的数据集上,这需要很多时间。

我的方法应该是什么?如何消除瓶颈?
任何建议都是非常值得赞赏的。

查询=“(从表中选择x,y,z)作为df”

    jdbcDF = spark.read.format("jdbc").option("url", mysqlUrl) \
    .option("dbtable", query) \
    .option("user", mysqldetails[2]) \
    .option("password", mysqldetails[3]) \ 
    .option("numPartitions", "1000")\
    .load()

这给了我一个数据框,它在 jdbcDF.rdd.getNumPartitions() 上给了我 1 的值。我在这里遗漏了什么吗?我想我没有并行化我的数据集。

标签: apache-sparkpyspark

解决方案


有多种方法可以提高应用程序的性能。PFB 的一些要点可能会有所帮助。

  1. 尽量减少要处理的记录数和列数。正如您所提到的,您是 spark 新手,您可能不需要全部 8000 万行,因此您可以将行过滤为您需要的任何内容。此外,选择需要但不是全部的列。

  2. 如果您经常使用某些数据,请尝试考虑缓存数据,以便在下一次操作时从内存中读取数据。

  3. 如果您要连接两个 DataFrame,并且其中一个足够小以适合内存,那么您可以考虑使用广播连接

  4. 增加资源可能不会在所有情况下都提高应用程序的性能,但查看集群的配置应该会有所帮助。投入更多资源并检查性能可能是个好主意。

  5. 您也可以尝试使用 Spark UI 来监控您的应用程序,看看是否有一些任务比其他任务花费的时间长。那么可能您需要处理数据的偏度。

  6. 您可以尝试考虑根据您在过滤条件中使用的列对数据进行分区。


推荐阅读