数仓应用工具Hive:从底层设计窥见其优化策略

数仓应用工具Hive:从底层设计窥见其优化策略_第1张图片

 

Hive介绍:

官网上对Hive的介绍可以简单理解为:它是一款构建在Hadoop之上的数据仓库软件,将已存储的数据结构化(将数据库中的各个文件关联起来,形成一定的结构关系),并提供了类SQL查询语句HQL(Hive Query Language)对数据进行分析处理。

Hive可以自动将HiveQL语句转换成一系列成MapReduce作业并执行,二不再需要程序员手动编写MR任务(SQL如何转化为MapReduce的?往下看)。用户可以很方便的使用命令行和JDBC程序的方式来连接到hive。当然Hive不仅支持MapReduce计算引擎,还支持Spark和Tez这两中分布式计算引擎,常用于离线批处理。

Hive架构原理:

  • Hive一般是架构在HDFS之上,HDFS是真实的数据存储的位置。
  • client:操作Hive的客户端,有CLI命令行的形式和JDBC驱动等操作形式。
  • Driver:Hive的核心驱动
  • 解析器(Sql Parser):将HSql转化为一个个逻辑查询块,并验证sql正确性。
  • 编译器(physical plan):将逻辑块转换成MapReducece执行计划。
  • 优化器(Query Optimistic):将MapReduce程序进行简单的优化操作(默认打开)
  • 执行器(Execution):执行MapReduce任务。
  • Meta Store:存储元数据(描述数据和数据间关系的数据)默认存储在Derby数据库

数仓应用工具Hive:从底层设计窥见其优化策略_第2张图片

 

  • 大致执行流程:client客户端提交执行命令给Driver,Driver将命令通过解析器、编译器、优化器、执行器解析成MapReduce程序,并从Meta Store 获取元数据,通过元数据获取HDFS的数据,执行MapReduce任务。

Hive中存在的问题:

  • HSql表达能力有限,不能使用迭代计算,不擅于做数据挖掘;
  • HSql底层是MapReduce任务,所以效率低、延时高;
  • Hive调优只能根据底层mr去解决。

Hive的优化:

正如上面所说的,Hive的优化其实是比较粗糙的,几乎只能通过底层mr去做调优工作。另外hive本身也提供了一些优化,比如,我们可以通过设置本地模式、严格模式等来限制执行效率较低的查询。除此之外我们还可以设置mr任务的个数、并行执行等来方式来进行调优,但这些调优方式从本质上来说都是对底层MapReduce的优化。下面我们老学习几个常见的Hive优化策略。

  • Fetch抓取:mr程序很慢,所以,我们可以设置fetch抓取,能不使用mr的尽量不使用

数仓应用工具Hive:从底层设计窥见其优化策略

 

设置本地模式:小文件较多时,在本地运行mr要比在集群上运行mr快的多

数仓应用工具Hive:从底层设计窥见其优化策略_第3张图片

 

设置严格模式:hive提供一个严格的模式,可以防止用户执行那些可能产生负面影响的查询。通过设置下面的属性启用MapReduce严格模式。

数仓应用工具Hive:从底层设计窥见其优化策略_第4张图片

 

注意:此模式下禁止3种类型的查询:

1.对于分区表,where子句不包含分区字段过滤条件的查询语句不允许执行。

2.对于使用order by子句的查询,要求必须使用limit子句,否则不允许执行

3.限制笛卡尔积查询。

  • 表的优化:表的优化方式很多,凡是其本质都是通过数据减少不必要数据操作来减少mr任务的压力具体内容有以下几种方式:

join原则:

  • 小表join大表将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率;再进一步,可以使用Group让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce。
  • 多个表关联时,最好分拆成小段,避免大sql(无法控制中间Job)
  • 大表Join大表:进行空key过滤、打散、转换
  • mapjoin:
  • 在Reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理。
  • 表的优化操作还有很多,想了解的可以关注我们,我们将为您提供更多大数据hive相关 资料。
  • 启用Tez执行引擎:使用Tez执行引擎代替传统的MapReduce引擎会大幅提升hive的查询性能。配置Tez执行引擎如下:

数仓应用工具Hive:从底层设计窥见其优化策略_第5张图片

 

  • 启用并行执行

每个hiveQL都被转换成一个或多个阶段,可能是一个MapReduce阶段,采样阶段,归并阶段等。默认情况下hive在任意时刻只执行其中的一个阶段。已经为大家精心准备了大数据的系统学习资料,从Linux-Hadoop-spark-......,需要的小伙伴可以点击如果组成一个特定作业的多个执行阶段是彼此独立的,那么它们可以并行执行。从而加快作业执行速度。通过配置以下选项开启并行执行。

数仓应用工具Hive:从底层设计窥见其优化策略_第6张图片

 

使用单一reduce执行多个Group by:通过为group by 开启单一reduce任务属性,可以将一个查询中的多个group by操作联合在一起发送给单一MapReduce作业。

数仓应用工具Hive:从底层设计窥见其优化策略_第7张图片

 

  • 使用ORC文件格式

hive的orc文件格式可以有效提升hive查询性能。

  • 使用向量化查询

通过查询执行向量化,使hive从单行处理数据改为批量处理方式,具体来说是一次处理1024行而不是原来的每次只处理一行,这大大提升了指令流水线和缓存利用率,从而提高了表扫描、聚合、过滤和连接等操作的性能。通过以下配置启用向量化:

数仓应用工具Hive:从底层设计窥见其优化策略_第8张图片

 

参数说明如下:
 hive.vectorized.execution.enabled:如果该标志设置为true, 则开启查询执行的向量模式,默认值为false.
 hive.vectorized.execution.reduce.enabled:如果该标志为true,则开启查询执行reduce端的向量模式,默认值为true
 hive.vectorized.execution.reduce.groupby.enabled:如果该标志为true,则开启查询执行reduce端的group by操作的向量模式,默认值为true.

你可能感兴趣的:(大数据,人工智能,互联网,hive,大数据,大数据开发,大数据分析,大数据学习)