快捷搜索:  汽车  科技

hive分桶原理(从底层设计窥见其优化策略)

hive分桶原理(从底层设计窥见其优化策略)设置严格模式:hive提供一个严格的模式,可以防止用户执行那些可能产生负面影响的查询。通过设置下面的属性启用MapReduce严格模式。设置本地模式:小文件较多时,在本地运行mr要比在集群上运行mr快的多Hive中存在的问题:Hive的优化:正如上面所说的,Hive的优化其实是比较粗糙的,几乎只能通过底层mr去做调优工作。另外hive本身也提供了一些优化,比如,我们可以通过设置本地模式、严格模式等来限制执行效率较低的查询。除此之外我们还可以设置mr任务的个数、并行执行等来方式来进行调优,但这些调优方式从本质上来说都是对底层MapReduce的优化。下面我们老学习几个常见的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分桶原理(从底层设计窥见其优化策略)(3)

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

hive分桶原理(从底层设计窥见其优化策略)(4)

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

hive分桶原理(从底层设计窥见其优化策略)(5)

注意:此模式下禁止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分桶原理(从底层设计窥见其优化策略)(6)

  • 启用并行执行

每个hiveQL都被转换成一个或多个阶段,可能是一个MapReduce阶段,采样阶段,归并阶段等。默认情况下hive在任意时刻只执行其中的一个阶段。如果组成一个特定作业的多个执行阶段是彼此独立的,那么它们可以并行执行。从而加快作业执行速度。通过配置以下选项开启并行执行。

hive分桶原理(从底层设计窥见其优化策略)(7)

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

hive分桶原理(从底层设计窥见其优化策略)(8)

  • 使用ORC文件格式

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

  • 使用向量化查询

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

hive分桶原理(从底层设计窥见其优化策略)(9)

参数说明如下: 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.

猜您喜欢: