【问题标题】:Spark Cluster configuration星火集群配置
【发布时间】:2019-01-03 17:37:31
【问题描述】:

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

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

我是 spark 的新手,我正在对 8000 万行数据运行一项工作,其中包括重组繁重的任务,如聚合(计数)和连接操作(数据帧上的自连接)。

瓶颈:

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

我的方法应该是什么?如何消除瓶颈?
任何建议都将受到高度评价。

query="(Select x,y,z from table) as 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-spark pyspark


    【解决方案1】:

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

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

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

    3. 如果您要加入两个 DataFrame,并且其中一个足够小以适合内存,那么您可以考虑broadcast join

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

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

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

    【讨论】:

    • 感谢您的建议。我已经尝试了一些提到的要点——我只是在读取所需的数据并使用广播哈希连接。但是,我对访问 spark UI 以监视我的任务知之甚少,我认为 spark jdbc 阅读器在阅读时没有并行化我的数据集。无论配置中提到的 numPartitions 如何,它都会为我提供单个分区上的数据。
    • 我在我的代码中添加了一个 sn-p,这似乎是一个问题。你能帮我解决这个问题吗?
    • 创建 jdbcDF 后,尝试根据某个列重新分区 DF,然后检查新 DF 上的分区。 newdf = jdbcDF.repartition(1000, "col1") newdf.rdd.getNumPartitions()
    • 我避免重新分区,因为它涉及重新洗牌。它也没有提高我的计算效率。我很困惑为什么从 db 读取数据时没有分区。
    猜你喜欢
    • 2013-05-16
    • 2016-05-22
    • 2013-11-26
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多