`
m635674608
  • 浏览: 5027741 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

了解SparkSQL运行计划及调优

 
阅读更多
  1. 优化过程中常用到方法
    1. 查看查询的整个运行计划 
      scala>query.queryExecution 
    2. 查看查询的Unresolved LogicalPlan 
      scala>query.queryExecution.logical
    3. 查看查询的Analyzed LogicalPlan
      scala>query.queryExecution.analyzed
    4. 查看优化后的LogicalPlan
      scala>query.queryExecution.optimizedPlan
    5. 查看物理计划
      scala>query.queryExecution.sparkPlan
    6. 查看RDD的转换过程
      scala>query.toDebugString
  2. SparkSQL调优
    Spark是一个快速的内存计算框架,同时是一个并行运算的框架,在计算性能调优的时候,除了要考虑广为人知的木桶原理外,还要考虑平行运算的Amdahl定理。
    木桶原理又称短板理论,其核心思想是:一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁上最短的那块。将这个理论应用到系统性能优化上,系统的最终性能取决于系统中性能表现最差的组件。例如,即使系统拥有充足的内存资源和CPU资源,但是如果磁盘I/O性能低下,那么系统的总体性能是取决于当前最慢的磁盘I/O速度,而不是当前最优越的CPU或者内存。在这种情况下,如果需要进一步提升系统性能,优化内存或者CPU资源是毫无用处的。只有提高磁盘I/O性能才能对系统的整体性能进行优化。

      SparkSQL作为Spark的一个组件,在调优的时候,也要充分考虑到上面的两个原理,既要考虑如何充分的利用硬件资源,又要考虑如何利用好分布式系统的并行计算。由于测试环境条件有限,本篇不能做出更详尽的实验数据来说明,只能在理论上加以说明。

2.1 并行性

SparkSQL在集群中运行,将一个查询任务分解成大量的Task分配给集群中的各个节点来运行。通常情况下,Task的数量是大于集群的并行度,shuffle的时候缺省的spark.sql.shuffle.partitionsw为200partition,也就是200Task

而实验的集群环境却只能并行3Task,也就是说同时只能有3Task保持Running

 

这时大家就应该明白了,要跑完这200Task就要跑200/3=67批次。如何减少运行的批次呢?那就要尽量提高查询任务的并行度。查询任务的并行度由两方面决定:集群的处理能力和集群的有效处理能力。

l对于Spark Standalone集群来说,集群的处理能力是由conf/spark-env中的SPARK_WORKER_INSTANCES参数、SPARK_WORKER_CORES参数决定的;而SPARK_WORKER_INSTANCES*SPARK_WORKER_CORES不能超过物理机器的实际CPU core

l集群的有效处理能力是指集群中空闲的集群资源,一般是指使用spark-submitspark-shell时指定的--total-executor-cores,一般情况下,我们不需要指定,这时候,Spark Standalone集群会将所有空闲的core分配给查询,并且在Task轮询运行过程中,Standalone集群会将其他spark应用程序运行完后空闲出来的core也分配给正在运行中的查询。

综上所述,SparkSQL的查询并行度主要和集群的core数量相关,合理配置每个节点的core可以提高集群的并行度,提高查询的效率。

2.2 高效的数据格式

高效的数据格式,一方面是加快了数据的读入速度,另一方面可以减少内存的消耗。高效的数据格式包括多个方面:

2.2.1 数据本地性

分布式计算系统的精粹在于移动计算而非移动数据,但是在实际的计算过程中,总存在着移动数据的情况,除非是在集群的所有节点上都保存数据的副本。移动数据,将数据从一个节点移动到另一个节点进行计算,不但消耗了网络IO,也消耗了磁盘IO,降低了整个计算的效率。为了提高数据的本地性,除了优化算法(也就是修改spark内存,难度有点高),就是合理设置数据的副本。设置数据的副本,这需要通过配置参数并长期观察运行状态才能获取的一个经验值。

下面是Spark webUI监控Stage的一个图:

lPROCESS_LOCAL是指读取缓存在本地节点的数据

lNODE_LOCAL是指读取本地节点硬盘数据

lANY是指读取非本地节点数据

l通常读取数据PROCESS_LOCAL>NODE_LOCAL>ANY,尽量使数据以PROCESS_LOCALNODE_LOCAL方式读取。其中PROCESS_LOCAL还和cache有关。

 

2.2.2 合适的数据类型

对于要查询的数据,定义合适的数据类型也是非常有必要。对于一个tinyint可以使用的数据列,不需要为了方便定义成int类型,一个tinyint的数据占用了1byte,而int占用了4byte。也就是说,一旦将这数据进行缓存的话,内存的消耗将增加数倍。在SparkSQL里,定义合适的数据类型可以节省有限的内存资源。

2.2.3 合适的数据列

对于要查询的数据,在写SQL语句的时候,尽量写出要查询的列名,如Select a,b from tbl,而不是使用Select * from tbl;这样不但可以减少磁盘IO,也减少缓存时消耗的内存。

2.2.4 优的数据存储格式

在查询的时候,最终还是要读取存储在文件系统中的文件。采用更优的数据存储格式,将有利于数据的读取速度。查看SparkSQLStage,可以发现,很多时候,数据读取消耗占有很大的比重。对于sqlContext来说,支持 textFiileSequenceFileParquetFilejsonFile;对于hiveContext来说,支持AvroFileORCFileParquet File,以及各种压缩。根据自己的业务需求,测试并选择合适的数据存储格式将有利于提高SparkSQL的查询效率。

2.3 内存的使用

spark应用程序最纠结的地方就是内存的使用了,也是最能体现“细节是魔鬼”的地方。Spark的内存配置项有不少,其中比较重要的几个是:

lSPARK_WORKER_MEMORY,在conf/spark-env.sh中配置SPARK_WORKER_MEMORY SPARK_WORKER_INSTANCES,可以充分的利用节点的内存资源,SPARK_WORKER_INSTANCES*SPARK_WORKER_MEMORY不要超过节点本身具备的内存容量;

lexecutor-memory,在spark-shellspark-submit提交spark应用程序时申请使用的内存数量;不要超过节点的SPARK_WORKER_MEMORY

lspark.storage.memoryFraction spark应用程序在所申请的内存资源中可用于cache的比例

lspark.shuffle.memoryFraction spark应用程序在所申请的内存资源中可用于shuffle的比例

在实际使用上,对于后两个参数,可以根据常用查询的内存消耗情况做适当的变更。另外,在SparkSQL使用上,有几点建议:

l对于频繁使用的表或查询才进行缓存,对于只使用一次的表不需要缓存;

l对于join操作,优先缓存较小的表;

l要多注意Stage的监控,多思考如何才能更多的Task使用PROCESS_LOCAL

l要多注意Storage的监控,多思考如何才能Fraction cached的比例更多

 

2.4 合适的Task

对于SparkSQL,还有一个比较重要的参数,就是shuffle时候的Task数量,通过spark.sql.shuffle.partitions来调节。调节的基础是spark集群的处理能力和要处理的数据量,spark的默认值是200Task过多,会产生很多的任务启动开销,Task多少,每个Task的处理时间过长,容易straggle

2.5 其他的一些建议

优化的方面的内容很多,但大部分都是细节性的内容,下面就简单地提提:

l  想要获取更好的表达式查询速度,可以将spark.sql.codegen设置为Ture

l  对于大数据集的计算结果,不要使用collect() ,collect()就结果返回给driver,很容易撑爆driver的内存;一般直接输出到分布式文件系统中;

l  对于Worker倾斜,设置spark.speculation=true 将持续不给力的节点去掉;

l  对于数据倾斜,采用加入部分中间步骤,如聚合后cache,具体情况具体分析;

l  适当的使用序化方案以及压缩方案;

l  善于利用集群监控系统,将集群的运行状况维持在一个合理的、平稳的状态;

l  善于解决重点矛盾,多观察Stage中的Task,查看最耗时的Task,查找原因并改善;

 

http://m.blog.csdn.net/article/details?id=49705417

分享到:
评论

相关推荐

    6.SparkSQL(中)--深入了解运行计划及调优.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    6.SparkSQL(上)--SparkSQL简介.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    6.SparkSQL(下)--Spark实战应用.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    4.Spark运行架构.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    3.Spark编程模型(下)--IDEA搭建及实战.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    Spark入门实战系列(资源合集)

    6.SparkSQL(中)--深入了解运行计划及调优 7.SparkStreaming(上)--SparkStreaming原理介绍 7.SparkStreaming(下)--SparkStreaming实战 8.SparkMLlib(上)--机器学习及SparkMLlib简介 8.SparkMLlib(下)--...

    3.Spark编程模型(上)--概念及SparkShell实战.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    1.Spark及其生态圈简介.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    2.Spark编译与部署(上)--基础环境搭建.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    SparkSql技术

    #### 四、深入了解SparkSQL运行计划 本节深入探讨了SparkSQL如何生成和优化运行计划,以及如何查看不同阶段的计划。 **4.1 安装hive/console** - **安装hive/console**:介绍了如何安装Hive控制台,以便用户可以...

    7.SparkStreaming(下)--SparkStreaming实战.pdf

    -Hive介绍及部署.pdf5.Hive(下)--Hive实战.pdf6.SparkSQL(上)--SparkSQL简介.pdf6.SparkSQL(下)--Spark实战应用.pdf6.SparkSQL(中)--深入了解运行计划及调优.pdf7.SparkStreaming(上)--SparkStreaming原理...

    7.SparkStreaming(上)--SparkStreaming原理介绍.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    10.分布式内存文件系统Tachyon介绍及安装部署.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    5.Hive(上)--Hive介绍及部署.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    9.SparkGraphX介绍及实例.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    5.Hive(下)--Hive实战.pdf

    -Hive介绍及部署.pdf5.Hive(下)--Hive实战.pdf6.SparkSQL(上)--SparkSQL简介.pdf6.SparkSQL(下)--Spark实战应用.pdf6.SparkSQL(中)--深入了解运行计划及调优.pdf7.SparkStreaming(上)--SparkStreaming原理...

    8.SparkMLlib(下)--SparkMLlib实战.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    2.Spark编译与部署(下)--Spark编译安装.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

    2.Spark编译与部署(中)--Hadoop编译安装.pdf

    6.SparkSQL(中)--深入了解运行计划及调优.pdf 7.SparkStreaming(上)--SparkStreaming原理介绍.pdf 7.SparkStreaming(下)--SparkStreaming实战.pdf 8.SparkMLlib(上)--机器学习及SparkMLlib简介.pdf 8.Spark...

Global site tag (gtag.js) - Google Analytics