Hive是大数据畛域罕用的组件之一,次要是大数据离线数仓的运算,对于Hive的性能调优在日常工作和面试中是常常波及的的一个点,因而把握一些Hive调优是必不可少的一项技能。影响Hive效率的次要有数据歪斜、数据冗余、job的IO以及不同底层引擎配置状况和Hive自身参数和HiveSQL的执行等因素。本文次要形容在底层引擎为Spark时,常常会用到的、常见的配置参数。
资源参数优化
所谓的Spark资源参数调优,其实次要就是对Spark运行过程中各 个应用资源的中央,通过调节各种参数,来优化资源应用的效率,从而晋升Spark作业的执行性能。以下参数就是Spark中次要的资源参数,每个参数都对 应着作业运行原理中的某个局部,咱们同时也给出了一个调优的参考值。
num-executors
- 参数阐明:该参数用于设置Spark作业总共要用多少个Executor过程来执行。Driver在向YARN集群管理器申请资源时,YARN集 群管理器会尽可能依照你的设置来在集群的各个工作节点上,启动相应数量的Executor过程。这个参数十分之重要,如果不设置的话,默认只会给你启动少 量的Executor过程,此时你的Spark作业的运行速度是十分慢的。
- 参数调优倡议:每个Spark作业的运行个别设置50~100个左右的Executor过程比拟适合,设置太少或太多的Executor过程都不好。设置的太少,无奈充分利用集群资源;设置的太多的话,大部分队列可能无奈给予充沛的资源。
executor-memory
- 参数阐明:该参数用于设置每个Executor过程的内存。Executor内存的大小,很多时候间接决定了Spark作业的性能,而且跟常见的JVM OOM异样,也有间接的关联。
- 参数调优倡议:每个Executor过程的内存设置4G~8G较为适合。然而这只是一个参考值,具体的设置还是得依据不同部门的资源队列来定。可 以看看本人团队的资源队列的最大内存限度是多少,num-executors乘以executor-memory,就代表了你的Spark作业申请到的总 内存量(也就是所有Executor过程的内存总和),这个量是不能超过队列的最大内存量的。此外,如果你是跟团队里其他人共享这个资源队列,那么申请的 总内存量最好不要超过资源队列最大总内存的1/3~1/2,防止你本人的Spark作业占用了队列所有的资源,导致别的同学的作业无奈运行。
executor-cores
- 参数阐明:该参数用于设置每个Executor过程的CPU core数量。这个参数决定了每个Executor过程并行执行task线程的能力。因为每个CPU core同一时间只能执行一个task线程,因而每个Executor过程的CPU core数量越多,越可能疾速地执行完调配给本人的所有task线程。
- 参数调优倡议:Executor的CPU core数量设置为2~4个较为适合。同样得依据不同部门的资源队列来定,能够看看本人的资源队列的最大CPU core限度是多少,再根据设置的Executor数量,来决定每个Executor过程能够调配到几个CPU core。同样倡议,如果是跟别人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比拟适合,也是防止影响其他同学的作业运行。
driver-memory
- 参数阐明:该参数用于设置Driver过程的内存。
- 参数调优倡议:Driver的内存通常来说不设置,或者设置1G左右应该就够了。惟一须要留神的一点是,如果须要应用collect算子将RDD的数据全副拉取到Driver上进行解决,那么必须确保Driver的内存足够大,否则会呈现OOM内存溢出的问题。
spark.default.parallelism
- 参数阐明:该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会间接影响你的Spark作业性能。
- 参数调优倡议:Spark作业的默认task数量为500~1000个较为适合。很多同学常犯的一个谬误就是不去设置这个参数,那么此时就会导致 Spark本人依据底层HDFS的block数量来设置task的数量,默认是一个HDFS block对应一个task。通常来说,Spark默认设置的数量是偏少的(比方就几十个task),如果task数量偏少的话,就会导致你后面设置好的 Executor的参数都半途而废。试想一下,无论你的Executor过程有多少个,内存和CPU有多大,然而task只有1个或者10个,那么90% 的Executor过程可能基本就没有task执行,也就是白白浪费了资源!因而Spark官网倡议的设置准则是,设置该参数为num- executors * executor-cores的2~3倍较为适合,比方Executor的总CPU core数量为300个,那么设置1000个task是能够的,此时能够充沛地利用Spark集群的资源。
spark.storage.memoryFraction
- 参数阐明:该参数用于设置RDD长久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,能够用来保留长久化的RDD数据。依据你抉择的不同的长久化策略,如果内存不够时,可能数据就不会长久化,或者数据会写入磁盘。
- 参数调优倡议:如果Spark作业中,有较多的RDD长久化操作,该参数的值能够适当进步一些,保障长久化的数据可能包容在内存中。防止内存不够 缓存所有的数据,导致数据只能写入磁盘中,升高了性能。然而如果Spark作业中的shuffle类操作比拟多,而长久化操作比拟少,那么这个参数的值适 当升高一些比拟适合。此外,如果发现作业因为频繁的gc导致运行迟缓(通过spark web ui能够察看到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样倡议调低这个参数的值。
spark.shuffle.memoryFraction
- 参数阐明:该参数用于设置shuffle过程中一个task拉取到上个stage的task的输入后,进行聚合操作时可能应用的Executor 内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。shuffle操作在进行聚合时,如果发现应用的内存超出了 这个20%的限度,那么多余的数据就会溢写到磁盘文件中去,此时就会极大地升高性能。
- 参数调优倡议:如果Spark作业中的RDD长久化操作较少,shuffle操作较多时,倡议升高长久化操作的内存占比,进步shuffle操作 的内存占比比例,防止shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,升高了性能。此外,如果发现作业因为频繁的gc导致运行迟缓,意味着 task执行用户代码的内存不够用,那么同样倡议调低这个参数的值。
资源参数的调优,没有一个固定的值,须要同学们依据本人的理论状况(包含Spark作业中的shuffle操作数量、RDD长久化操作数量以及spark web ui中显示的作业gc状况),同时参考本篇文章中给出的原理以及调优倡议,正当地设置上述参数。
资源参数参考示例
以下是一份spark-submit命令的示例,大家能够参考一下,并依据本人的理论状况进行调节:
./bin/spark-submit --master yarn-cluster --num-executors 100 --executor-memory 6G --executor-cores 4 --driver-memory 1G --conf spark.default.parallelism=1000 --conf spark.storage.memoryFraction=0.5 --conf spark.shuffle.memoryFraction=0.3
理解更多