Apache spark 增加spark中的分区数

Apache spark 增加spark中的分区数,apache-spark,hive,apache-spark-sql,Apache Spark,Hive,Apache Spark Sql,我使用配置单元对项目执行SQL查询。我将ORC与50k跨距用于数据,并使用此配置创建了配置单元ORC表,其中某个日期列作为分区 现在我想使用Spark SQL对在相同数据上运行的相同查询进行基准测试 我执行了以下查询 val q1 = sqlContext.sql("select col1,col2,col3,sum(col4),sum(col5) from mytable where date_key=somedatkye group by col1,col2,col3") 在配置单元中,此

我使用配置单元对项目执行SQL查询。我将ORC与50k跨距用于数据,并使用此配置创建了配置单元ORC表,其中某个日期列作为分区

现在我想使用Spark SQL对在相同数据上运行的相同查询进行基准测试

我执行了以下查询

val q1 = sqlContext.sql("select col1,col2,col3,sum(col4),sum(col5) from mytable where date_key=somedatkye group by col1,col2,col3")
在配置单元中,此查询需要90秒。但是spark对同一个查询需要21分钟,在查看作业时,我发现问题是因为spark创建了2个阶段,在第一个阶段,它只有7个任务,orc文件中给定分区内的7个数据块中的每一个都有一个任务。这些块的大小不同,一个是5MB,另一个是45MB,正因为如此,散乱的块需要更多的时间,导致工作花费了太多的时间


如何在spark中缓解此问题。如何手动增加分区数量,从而增加阶段1中的任务数量,即使给定查询范围只有7个物理块。

我坚信差异不在于数据倾斜,但事实上,Hive使用谓词下推来跳过扫描所有与WHERE子句不匹配的ORC条带。查看如何在Spark in中激活它(注意:它需要几个JIRA才能正常工作,请检查您的Spark版本是否安全)免责声明:如果您的WHERE子句应用于分区键,那么谓词下推将没有帮助。在重读你的问题之后,我不是很确定。我的where子句适用于分区键,所以我不认为谓词向下推是这里的问题。我通过查看文件系统中的hive warehouse来验证这一点,在我要查找的date_键下,正好有7个文件,spark创建了正好7个分区,输入大小等于文件大小。希望这能澄清问题。根据定义,Hive还应该启动7个映射程序。或者更少,因为您的文件非常非常小,可以应用CombineInputFormat。即使缺乏矢量化(SPARK-16060)也无法解释SPARK如此缓慢的原因。我坚信差异不在于数据倾斜,而在于Hive使用谓词下推来跳过扫描所有与WHERE子句不匹配的ORC条带。查看如何在Spark in中激活它(注意:它需要几个JIRA才能正常工作,请检查您的Spark版本是否安全)免责声明:如果您的WHERE子句应用于分区键,那么谓词下推将没有帮助。在重读你的问题之后,我不是很确定。我的where子句适用于分区键,所以我不认为谓词向下推是这里的问题。我通过查看文件系统中的hive warehouse来验证这一点,在我要查找的date_键下,正好有7个文件,spark创建了正好7个分区,输入大小等于文件大小。希望这能澄清问题。根据定义,Hive还应该启动7个映射程序。或者更少,因为您的文件非常非常小,可以应用CombineInputFormat。即使缺乏矢量化(SPARK-16060)也无法解释SPARK为何如此缓慢。