热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

大数据开发之Hive优化篇1Hive优化概述

备注:Hive版本2.1.1@[TOC]#一.Hive的实现原理Hive的编译器将HQL转换成一组操作符(Operator)操作符是Hive的最小处理单元每

备注:

Hive 版本 2.1.1

Table of Contents

  • 一.Hive的实现原理
  • 二Hive优化
    • 2.1 选择合理的存储格式和压缩格式
    • 2.2 MR Job优化
    • 2.3 Join优化
      • 2.3.1 MapJoin 优化
      • 2.3.2 SMB Join 优化
    • 2.4 数据倾斜
    • 2.5 Hive的优化配置参数


一.Hive的实现原理

Hive的编译器将HQL转换成一组操作符(Operator)

操作符是Hive的最小处理单元

每个操作符代表一道HDFS操作或者MR Job 作业

image.png

Hive的操作符

image.png

Hive编译器

Parser:

将SQL转换成抽象语法树

语法解析器:

将抽象语法树转换成查询块

逻辑计划生成器:

将查询块转换成逻辑计划

物理计划生成器:

将逻辑计划转换成物理计划

物理计划优化器:

物理计划优化策略

编译流程

image.png

利用Explain查看执行计划

语法:

:EXPLAIN [EXTENDED] query

输出:



  1. 查询语句的抽象语法树(AST)

  2. 执行计划丌同阶段间的依赖关系

  3. 每个阶段的描述


二Hive优化

优化的目的:提升查询性能,快速产出结果

Hive的优化思路:



  1. 编译器优化器优化:采用合理的优化策略,生成高效的物理计划

  2. MapReduce执行层优化:通过MR参数优化,提升Job运行效率

  3. HDFS存储层优化:采用合理的存储格式和合理的Schema设计,降低IO瓶颈


2.1 选择合理的存储格式和压缩格式

列存储,高压缩比,列剪枝,过滤无用字段IO



  1. Orc

  2. Parquet

压缩格式选择:snappy


2.2 MR Job优化

并行执行

Hive产生的MR Job默认是顺序执行的,如果Job之间无依赖可以并行执行

set hive.exec.parallel=true;

本地执行

虽然Hive能够利用MR处理大规模数据,但某些场景下处理的数据量非常小可以本地执行,不必提交集群

set hive.exec.mode.local.auto=true;
hive.exec.mode.local.auto.inputbytes.max(默认128MB)
hive.exec.mode.local.auto.input.files.max(默认4)

合并输入小文件

如果Job输入有很多小文件,造成Map数太多,影响效率

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat

合并输出小文件

set hive.merge.mapfiles=true; // map only job结束时合并小文件
set hive.merge.mapredfiles=true; // 合并reduce输出的小文件
set hive.merge.smallfiles.avgsize=256000000; //当输出文件平均大小小于该值,启动新job合并文件
set hive.merge.size.per.task=64000000; //合并之后的每个文件大小

控制Map/Reduce数

控制Map/Reduce数来控制Job执行的并行度

Num_Map_tasks= $inputsize/ max($mapred.min.split.size, min($dfs.block.size, $mapred.max.split.size))
Num_Reduce_tasks= min($hive.exec.reducers.max, $inputsize/$hive.exec.reducers.bytes.per.reducer)

JVM重用

JVM重利用可以使job长时间保留slot,直到作业结束

set mapred.job.reuse.jvm.num.tasks=10 //每个jvm运行10个task

推测执行

set hive.mapred.reduce.tasks.speculative.execution=true
set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true

一定要开启压缩

中间结果压缩,减少Job跟Job之间的IO开销

set hive.exec.compress.intermediate=true
set mapred.map.output.compression.codec=

最终结果压缩,减少存储空间

set hive.exec.compress.output=true
Set mapred.output.compression.codec=

2.3 Join优化

Hive的Join类型:



  1. Shuffle Join

  2. Broadcast Join(MapJoin)

  3. Sort-Merge-Bucket Join

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4Mr5baa-1611020439271)(https://upload-images.jianshu.io/upload_images/2638478-7b767f2303382f84.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]


2.3.1 MapJoin 优化

方式一(自动判断):

set.hive.auto.convert.join=true;
hive.mapjoin.smalltable.filesize // 默认值是25mb, 小表小于25mb自动启动mapjoin

方式二(手动显式):

select /+mapjoin(A)/ f.a,f.bfrom A t join B f on (f.a=t.a)

image.png


2.3.2 SMB Join 优化

使用方式:

hive.optimize.bucketmapjoin= true

和mapjoin一起工作,所有要Join的表都必须对Join key做了分桶,并且大表的桶数是小表的整数倍

由于对表设计有太多的限制,不太常用


2.4 数据倾斜

数据倾斜是指由于数据分布不均匀,个别值集中占据大部分数据量,导致某一个或者几个ReduceTask处理的数据量相对很大造成的Job运行非常慢,甚至OOM挂掉

在SQL上,一般是由于group by 或者join shuffle key丌均匀造成的

数据倾斜是业务数据问题导致的,如果从业务上下手避免是最好的



  1. 比如由于Null值引起的,或者某一个特殊的key造成的数据量特别大

  2. 先过滤掉特殊key的数据再进行处理

Hive自身的优化方案:



  1. 由group by 引起的数据倾斜:

hive.map.aggr=true //做map端预聚合,相当于Map端Combiner
hive.groupby.skewindata//将key的数据随机分发到Reduce端做聚合,然后再起一个Job对上一步的结果做聚合


  1. 由Join引起的数据倾斜(Skew Join)

set hive.optimize.skewjoin= true
set hive.skewjoin.key= 100000
// 超过阈值就判断为skew key

image.png


2.5 Hive的优化配置参数

hive-site.xml中更改默认配置

在脚本中set变量

Hive的优化配置非常多,具体情况具体分析



推荐阅读
  • Java能否直接通过HTTP将字节流绕过HEAP写入SD卡? ... [详细]
  • 在本地环境中部署了两个不同版本的 Flink 集群,分别为 1.9.1 和 1.9.2。近期在尝试启动 1.9.1 版本的 Flink 任务时,遇到了 TaskExecutor 启动失败的问题。尽管 TaskManager 日志显示正常,但任务仍无法成功启动。经过详细分析,发现该问题是由 Kafka 版本不兼容引起的。通过调整 Kafka 客户端配置并升级相关依赖,最终成功解决了这一故障。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 技术日志:深入探讨Spark Streaming与Spark SQL的融合应用
    技术日志:深入探讨Spark Streaming与Spark SQL的融合应用 ... [详细]
  • APKAnalyzer(1):命令行操作体验与功能解析
    在对apkChecker进行深入研究后,自然而然地关注到了Android Studio中的APK分析功能。将APK文件导入IDE中,系统会自动解析并展示其中各类文件的详细信息。官方文档提供了详细的命令行工具使用指南,帮助开发者快速上手。本文以一个RecyclerView的Adapter代理开源库为例,探讨了如何利用这些工具进行高效的APK分析。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Apache Hadoop HDFS QJournalProtocol 中 getJournalCTime 方法的应用与代码实例分析 ... [详细]
  • Java中不同类型的常量池(字符串常量池、Class常量池和运行时常量池)的对比与关联分析
    在研究Java虚拟机的过程中,笔者发现存在多种类型的常量池,包括字符串常量池、Class常量池和运行时常量池。通过查阅CSDN、博客园等相关资料,对这些常量池的特性、用途及其相互关系进行了详细探讨。本文将深入分析这三种常量池的差异与联系,帮助读者更好地理解Java虚拟机的内部机制。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • MySQL:不仅仅是数据库那么简单
    MySQL不仅是一款高效、可靠的数据库管理系统,它还具备丰富的功能和扩展性,支持多种存储引擎,适用于各种应用场景。从简单的网站开发到复杂的企业级应用,MySQL都能提供强大的数据管理和优化能力,满足不同用户的需求。其开源特性也促进了社区的活跃发展,为技术进步提供了持续动力。 ... [详细]
  • MySQL 数据操作:增、删、查、改全面解析
    MySQL 数据操作:增、删、查、改全面解析 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
author-avatar
夏至_krisyeol_582
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有