Spark sql查询导致分区计数膨胀

时间:2016-03-15 15:50:23

标签: apache-spark-sql spark-dataframe

Spark(1.5.2)中的分区计数在某些SQL查询中爆炸。

可以避免吗?



在我的情况下,我有三个表(文本,所有者,人),我在其上执行以下查询:

sqlContext.sql(
                "SELECT t.* FROM texts t JOIN ("+
                        "SELECT o.TextId FROM "+
                        "owners o JOIN ("+
                        "SELECT UserId FROM person WHERE LOWER(name) "+
                        "RLIKE '.*"+escapeRegex(filter.name)+"\\s*$'"+
                        ") p ON (o.UserId=p.UserId) GROUP BY o.TextId"+
                        ") o "+
                        "ON (t.TextId = o.TextId)")

查询前的分区计数为2,之后使用textsDF.javaRDD().partitions().size()

获得200

1 个答案:

答案 0 :(得分:1)

Join / Group by或具有shuffle的任何操作的分区数取决于属性“spark.sql.shuffle.partitions”。必须在群集配置中将其设置为200。

此属性的重要性:这决定了对数据的reducer数量(理解的类型)。通过将此属性设置得更高,可以确保存在大量并行性。

如何,您可以根据自己的需要更改该属性。你可以设置如下任何数字的SparkConf。

conf.set("spark.sql.shuffle.partitions","2");

注意:将其设置为较低会降低性能,从而增加网络使用量和较小的并行度。

另一方面,文件读取的并行性取决于默认的并行性属性,该属性指示每个核心的任务数/ hdfs数据中的块数。但对于任何已经洗牌的操作,它取决于我提到的属性。