问题描述
我是Spark的新手,并试图了解如何处理Spark中的偏斜数据。我创建了两个表employee和department。员工歪曲了部门之一的数据。
一种解决方案是广播部门表,并且工作正常。但是我想了解如何在下面的代码中使用加盐技术来提高性能。
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")
以上代码的分发:
解决方法
即使歪斜的员工也不太可能引起Spark瓶颈。实际上,这个例子是有缺陷的。考虑大型的大型JOIN,而不是适合广播联接类别的一些东西。
盐腌: 通过对SQL join或Grouping等操作使用“ 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/
我可以全部解释,但是第一个链接已经足够好地解释了。需要进行一些实验才能获得更好的密钥分配。