Spark集群配置

时间:2019-01-02 09:19:27

标签: apache-spark pyspark

我正在使用一个带有两个节点的Spark集群,每个节点都有两个执行程序(每个执行程序使用2个内核和6GB内存)。

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

我是一个新手,我正在处理8000万行数据,其中包括改组沉重的任务,例如聚合(计数)和联接操作(在数据帧上自行联接)。

瓶颈:

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

我应该采取什么方法,如何消除瓶颈?
任何建议都是非常可取的。

query =““(从表中选择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。我在这里错过了什么吗?我想我没有并行化我的数据集。

1 个答案:

答案 0 :(得分:1)

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

  1. 尝试减少要处理的记录和列的数量。如前所述,您是新手,可能不需要全部8000万行,因此可以根据需要过滤行。另外,选择必填而不是全部的列。

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

  3. 如果要连接两个DataFrame,并且其中一个足够小以适合内存,则可以考虑使用broadcast join

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

  5. 您还可以尝试使用Spark UI监视您的应用程序,并查看是否有比其他任务花费更多时间的任务。那么可能您需要处理数据的偏斜。

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