【问题标题】:How to use salting technique for joining data frames having skewed data如何使用加盐技术连接具有倾斜数据的数据帧
【发布时间】:2020-09-06 12:15:12
【问题描述】:

我是 spark 新手,并试图了解如何处理 spark 中的倾斜数据。我创建了两个表员工和部门。员工歪曲了其中一个部门的数据。

其中一个解决方案是广播部门表,效果很好。但我想了解如何在下面的代码中使用盐渍技术来提高性能。

from pyspark.sql import SparkSession
import pyspark.sql.functions as f
spark = SparkSession.builder.appName("skewTestSpark").config("spark.sql.warehouse.dir",
                                       '/user/hive/warehouse').enableHiveSupport().getOrCreate()
df1 = spark.sql("select * from spark.employee")
df2 = spark.sql("select id as dept_id, name as dept_name from spark.department")
res = df1.join(df2, df1.department==df2.dept_id)
res.write.parquet("hdfs://<host>:<port>/user/result/employee")

以上代码的分布:

【问题讨论】:

    标签: apache-spark pyspark skew


    【解决方案1】:

    员工(即使存在偏差)不太可能导致 Spark 瓶颈。事实上,这个例子是有缺陷的。想想大型的大型 JOIN,而不是适合广播联接类别的东西。

    盐渍: 在 SQL 连接或分组等操作上使用“Salting”,可以更改键以以均匀的方式重新分配数据,以便任何给定分区的任何操作的处理时间都相似。

    这里有一个很好的 JOIN 示例:https://dzone.com/articles/why-your-spark-apps-are-slow-or-failing-part-ii-da

    我推荐的另一本好书在这里:https://godatadriven.com/blog/b-efficient-large-spark-optimisation/

    我可以解释这一切,但第一个链接解释得很好。需要进行一些试验才能获得更好的密钥分配。

    【讨论】:

    • 是的,两个表都应该很大,可能会导致性能问题。但是如果我们认为这两个表都有大量数据,那么考虑到相同的场景,我们如何在 PySpark 中编写加盐技术。
    • 文章给出了加盐键的例子。您需要使分布更加均匀。这是一个实验问题。
    猜你喜欢
    • 2023-02-19
    • 2020-01-26
    • 2020-09-25
    • 1970-01-01
    • 2017-03-10
    • 2021-04-23
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多