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
理解更多