Hive是大数据领域常用的组件之一,主要是大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的的一个点,因此掌握一些Hive调优是必不可少的一项技能。影响Hive效率的主要有数据倾斜、数据冗余、job的IO以及不同底层引擎配置情况和Hive本身参数和HiveSQL的执行等因素。本文主要结合实际业务情况,在使用Spark作为底层引擎时,通过一些常见的配置参数对报错任务进行调整优化。

下面从两个方面对复杂任务的优化:

Spark资源参数优化

主要针对Spark运行过程中各个使用资源的地方,通过调节资源相关参数,来优化资源使用的效率,从而提升Spark作业的执行性能。例如:num-executors、executor-memory、executor-cores等。

Shuffle相关参数调优

主要针对spark运行过程中的shuffle,通过调节参数,提高shuffle的执行效率,从而提升spark作业的执行性能。例如:spark.shuffle.memoryFraction,spark.sql.shuffle.partitions等。

案例1

复杂任务执行失败,大约有400行sql,较为复杂,join聚合函数操作较多。手动重试任务后仍然报错。

查看任务报错日志

分析关键信息

Exception in thread "broadcast-exchange-0" java.lang.OutOfMemoryError: Not enough memory to build and broadcast the table to all worker nodes. As a workaround, you can either disable broadcast by setting

spark.sql.autoBroadcastJoinThreshold to -1 or increase the spark driver memory by setting spark.driver.memory to a higher value

得出结论

当前所有的工作节点均没有足够的内存去build并且广播表,建议处理方法:将广播置为无效或者增加spark的driver memory。

优化效果

经过对比测试验证,在同时调大excutor内存和driver内存后,任务可以成功运行。单独调大driver或excutor内存,任务运行依然失败。

Q1:什么情况下应将广播设置为无效?

根据官网文档对该参数的描述可知:其默认值为10M,意味着执行join时,这张表字节大小在10M内可以自动广播到所有工作节点。将表广播到其他工作节点,会减少shuffle的过程,提升效率。如果在内存足够并且数据量过多的情况下,可以将适当提高该参数值作为一种优化手段。如果在表都很大的情况下,建议将自动广播参数置为无效。将参数值设置为-1时会禁用自动广播。

案例2

某个任务已经运行了40多个小时,自动重试了3次,一直处于阻塞状态

查看异常任务SQL

发现任务中由10多个SQL语句构成,一个语句大概有200+行,union all、join、sum操作较多。

查看任务报错日志

分析关键信息

org.apache.spark.shuffle.MetadataFetchFailedException:

Missing an output location for shuffle 433

得出结论

一般任务有大量shuffle操作的时候,我们可以从shuffle数据量及shuffle分区数的角度对任务进行优化调整。

优化效果

只采取调大executor内存的方式进行优化,任务可以运行成功,但任务执行耗时仍然需20+分钟,执行效率与优化前相比无明显变化。原因在于任务执行中产生了较多的task,此时可以通过调整分区参数进行深入优化。分区参数spark.sql.shuffle.partitions是Spark SQL专用的设置,将该参数的值由200(默认值)调小为50,任务运行成功,执行耗时减少50%,约10分钟;继续将该参数调小为10,任务运行成功,执行耗时减少70%,约6分钟,优化完成。

**Q2:spark.default.parallelism参数与

spark.sql.shuffle.partitions参数有什么区别?**

虽然这两个参数较为相似,但default.parallelism只在处理RDD时才会起作用,对Spark SQL无效。其值设置为【num- executors * executor-cores】的2~3倍较为合理。可以参考官网的定义说明:

延伸拓展

1.shuffle分为shuffle write和shuffle read两部分。

2.shuffle write的分区数由上一阶段的RDD分区数控制,shuffle read的分区数则是由Spark提供的一些参数控制。

3.shuffle write可以简单理解为类似于saveAsLocalDiskFile的操作,将计算的中间结果按某种规则临时放到各个executor所在的本地磁盘上。

4.shuffle read时数据的分区数则是由spark提供的一些参数控制。如果这个参数值设置的很小,同时shuffle read的量很大,那么将会导致一个task需要处理的数据非常大,容易引发JVM crash。如果这个参数值设置的很大,可能会导致task的数量过多,任务执行速度过慢。

job和stage以及task的关系如下图所示,job的划分是action操作造成的,Stage是job通过依赖关系划分出来的,一个Stage对应一个TaskSet,一个Task对应一个rdd分区。同时大量使用shuffle操作也会使task数量变多。

本次优化主要是结合实际优化案例,对底层引擎spark的参数进行调优。如何通过优化提升任务执行效率?如何利用监控分析将被动运维转为主动运维?请关注后续Hive性能优化及监控方面的实践连载。

hive sql 报错后继续执行_Hive优化之Spark执行引擎参数调优(二)相关推荐

  1. hive sql 报错后继续执行_Hive迁移Presto的技术实践

    本文来自OPPO互联网技术团队,如需要转载,请注明出处及作者.欢迎关注我们的公众号:OPPO_tech hive设计之初,就被定位一款离线数仓产品,虽然Hortonworks喊出了Make Apach ...

  2. hive sql 报错后继续执行_Hive迁移Presto在OPPO的实践

    " hive设计之初,就被定位一款离线数仓产品,虽然Hortonworks喊出了Make Apache Hive 100x Faster的牛逼口号,也在上面做了大量的优化,然而性能提升依旧不 ...

  3. hive sql 报错后继续执行_Hive 执行sql命令报错

    Failed with exception java.io.IOException:java.lang.IllegalArgumentException: java.net.URISyntaxExce ...

  4. DB2 sql报错后查证原因与解决问题的方法

    DB2 sql报错后查证原因与解决问题的方法 参考文章: (1)DB2 sql报错后查证原因与解决问题的方法 (2)https://www.cnblogs.com/BradMiller/p/31978 ...

  5. 记录hive sql报错,return code1和return code2解决方法

    执行hive sql语句的时候非常容易出现return code 1.return code 2.return code 3的情况,我就遇到了很多次,code3在某次意外中得以解决 但是引发了code ...

  6. hive sql报错:SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error

    SQL 错误 [10004] [42000]: Error while compiling statement: FAILED: SemanticException [Error 10004]: Li ...

  7. 关于执行SQL报错:java.lang.ArrayIndexOutOfBoundsException: 6

    关于执行SQL报错:java.lang.ArrayIndexOutOfBoundsException: 6 由于工作需要,需创建一个表C,表数据由表A left join 表B生成,表A数据量大概30 ...

  8. 数据库执行sql报错Got a packet bigger than 'max_allowed_packet' bytes及重启mysql

    准备在mysql上使用数据库A,但mysql5经过重装后,上面的数据库已丢失,只得通过之前备份的A.sql重新生成数据库A. 1.执行sql报错 在执行A.sql的过程中,出现如下错误:Got a p ...

  9. Oracle 执行sql报错 ORA-20401:Reject By Dbsec

    在项目执行迁移数据的过程中有一条sql报错 Reject By Dbsec 字面意思被 Dbsec拒绝 之后我将sql 贴出来放在Navicat中执行,也是报同样的错误,并且sql没有任何的语法错误 ...

最新文章

  1. wxruby框架例子1
  2. 孕期出血是否先兆流产——B超看婴儿是否在子宫内+hcg值是否过低孕激素不足...
  3. C语言判断计算机存储是大端还是小端
  4. STM32F103_IWDG独立看门狗
  5. 在国外当程序员有多爽
  6. python selenium 获取接口数据
  7. QML用openGL渲染NV12
  8. 语音转写录音转文字哪种更好
  9. 布线工程-认识光纤和光缆
  10. C语言编程练习----2021级山东理工大学ACM实验二题解
  11. java判断移动端和pc端_Java判断PC端还是移动端
  12. [BZOJ3772]精神污染(主席树+链剖)
  13. HDMI 4K分辨率 时序
  14. python是什么?为何被称为胶水语言?
  15. vue使用脚手架的单文件组件环境搭建
  16. 【洛谷】P1008 [NOIP1998 普及组] 三连击
  17. Linux系统设置命令大全
  18. led指示灯识别功能
  19. 读李开复——《做最好的自己》有感
  20. 主流显卡生产厂商全面剖析--各种显卡品牌

热门文章

  1. 两个简单的前台显示构架01
  2. 添加Expires头
  3. ubuntu11.04中nautilus(文件管理器)查看FTP乱码的解决办法
  4. Stackint stack = new Stackint报错原因
  5. (篇九)C语言统计某个字母的个数、统计各种字符的个数、统计单词的个数
  6. 利尔达e95蓝牙模块程序_Arduino使用HC05蓝牙模块与手机连接
  7. Python+tkinter实现超时无键盘操作自动退出
  8. 1900页Python系列PPT分享一:基础知识(106页)
  9. 几行Python代码模拟轮盘抽奖游戏
  10. pwm gpio android,关于占空比与PWM_以及GPIO背光开关