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()
答案 0 :(得分:1)
Join / Group by或具有shuffle的任何操作的分区数取决于属性“spark.sql.shuffle.partitions”。必须在群集配置中将其设置为200。
此属性的重要性:这决定了对数据的reducer数量(理解的类型)。通过将此属性设置得更高,可以确保存在大量并行性。
如何,您可以根据自己的需要更改该属性。你可以设置如下任何数字的SparkConf。
conf.set("spark.sql.shuffle.partitions","2");
注意:将其设置为较低会降低性能,从而增加网络使用量和较小的并行度。
另一方面,文件读取的并行性取决于默认的并行性属性,该属性指示每个核心的任务数/ hdfs数据中的块数。但对于任何已经洗牌的操作,它取决于我提到的属性。