首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

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数据库

大致执行流程: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的尽量不使用

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

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

注意:此模式下禁止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执行引擎如下:

启用并行执行

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

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

使用ORC文件格式

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

使用向量化查询

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190809A0U2A300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com