大家好,欢迎来到IT知识分享网。
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行而不是原来的每次只处理一行,这大大提升了指令流水线和缓存利用率,从而提高了表扫描、聚合、过滤和连接等操作的性能。通过以下配置启用向量化:
参数说明如下: 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.
IT知识分享网
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/6234.html