hive优化

Hive痛点直击&经验分享
hive的使用场景有哪些?适合实时性强的分析场景使用么?

Hive是建立在Hadoop上的数据仓库基础构架,它的最佳使用场合是大数据集的批处理作业,一般延迟性比较高,并不能够在大规模数据集上实现低延迟快速的查询,所以不适合实时性强的分析场景。不过目前Hive底层的计算框架除了支持原生的MapReduce,还支持Tez和Spark,这对提升Hive的查询处理性能帮助很大,从Hive 2.0版本开始,推荐使用Tez或Spark作为Hive的计算引擎。

如果希望实时查询分析,可以结合Impala,Presto,Drill等开源的交互式、实时的查询引擎使用,它们能够访问Hive中的表进行数据查询分析。

hive的技术特点有哪些? 类sql操作啊,内置大量用户函数udf等等。

Hive应该是第一个出现的SQL on Hadoop的产品,技术特点如下:

类SQL查询方式,支持标准SQL也比较全面;
支持索引,加快数据查询;
元数据保存在关系型数据库中,比如MySQL,可以减少查询过程中执行语义检查的时间;
支持多种数据存储格式类型,比如Text,Sequence,RCFile,Parquet和ORC等,针对不同的场景进行选择;
数据存储在HDFS分布式文件系统中,实现冗余高可用;
内置常用的基本函数,以及窗口分析型函数,同时支持用户自定义UDF,UDAF,UDTF函数;
底层计算引擎支持MapReduce,Tez和Spark,根据需要进行动态选择。
Hive创建的内部表和外部表有何异同?

这个其实和很多传统数据库中的内部表和外部表一样,没有什么差别。

我将从表的创建和删除两方面简单介绍一下:

Hive 创建内部表时,后面执行导入操作时会将用户数据移动到表所在的数据仓库指向的路径;
若创建外部表时,只会记录表对应的用户数据所在的路径,不对用户数据的位置做任何改变。
在删除表的时候,内部表的元数据和用户数据会被一起删除;
而外部表只会删除元数据,不删除用户数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。
Hive的优化技巧有哪些?比如如何处理数据倾斜、大表与小表join时,如何优化性能。

Hive优化其实涉及到几方面,其中一方面是计算引擎方面的优化,比如你使用MapReduce作为计算引擎,那么就需要优化MapReduce;如果你选择Spark作为计算引擎,那么需要对Spark进行优化。

这里我仅从Hive这一层面介绍该如何优化,基本内容如下:

(1)表设计层面优化

合理利用中间结果集,避免查过就丢的资源浪费,减低Hadoop的IO负载
合理设计表分区,包括静态分区和动态分区
尽量不使用复杂或低效函数,比如count(distinct),可以使用其他方式实现
选择合适的表存储格式和压缩格式
如果某些逻辑使用系统函数可能嵌套好几层,那么可以使用自定义函数实现
适当使用索引
(2)语法和参数层面优化

合理控制mapper和reducer数
设置map和reduce的内存大小
合并小文件
避免数据倾斜,解决数据倾斜问题
处理数据倾斜的方法其实有很多,不论是Group by还是Join时出现数据倾斜,其实都是数据热点的问题,即某些Key值太多,导致都分发到一个节点执行,那么我们可以将数据量比较大的Key拿出来单独处理,最后再合并到结果集中。如果出现数据倾斜的Key值对结果无关紧要,比如空值,那么我们可以过滤处理,或者将空值加上随机数,进行分发到集群的所有节点并行处理。当然也可以利用Hive自带的参数进行优化,设置当分组或关联的Key值超过多少数量时,进行单独处理,即额外启动一个MapReduce作业处理。
这方面的具体优化过程,请参考我的技术博客。

减少Job数
Join优化
尽量将小表放到join的左边。小表和大表join时,如果差一个以及以上数量级并且小表数据量很小,可以使用mapjoin方式,将小表全部读入内存中,在map阶段进行表关联匹配。大表和大表进行关联时,要注意数据倾斜的问题。如果两个表以相同Key进行分桶,以及表的桶个数是倍数关系,可以使用bucket join,加快关联查询。

避免笛卡尔积
提前裁剪数据,减少处理的数据量,避免资源浪费
(3)Hive Job优化

并行化执行——每个查询被Hive转化成多个阶段,有些阶段关联性不大,则可以并行化执行,减少执行时间。
本地化执行
JVM重利用——JVM重利用可以是Job长时间保留slot,直到作业结束,这在对于有较多任务和较多小文件的任务是非常有意义的,减少执行时间。
推测执行——所谓的推测执行,就是当所有的task都开始运行之后,Job Tracker会统计所有任务的平均进度,如果某个task所在的节点配置内存比较低或者CPU负载很大,导致任务执行比总体任务的平均执行要慢,此时Job Tracker就会在其他节点启动一个新的相同的任务,原有任务和新任务哪个先执行完就把其他节点的另外一个任务kill掉。
Hive中间结果压缩数据——中间压缩就是处理Hive查询的多个job之间的数据,对于中间压缩,最好选择一个节省CPU耗时的压缩方式
分享一下Hive数据仓库经验。

由于Hive的类SQL和类数据库功能,它向非编程人员开放了大数据Hadoop生态系统,Hive也推动了Hadoop的普及和发展。

企业使用Hive来构建数据仓库,一是可以节约成本,二是基于SQL开发,将传统数据库迁移到Hadoop平台上分析也相关方便,三是支持和Hive集成的Hadoop生态圈的产品也丰富,满足架构扩展。

在使用Hive来构建企业级数据仓库时要注意以下几点:

根据不同业务数据来源,在Hive创建不同的数据库,方便分类管理;
表的文件存储格式尽量采用Parquet或ORC,不仅降低存储量,还优化了查询,压缩,表关联等性能;
Hive的计算引擎,推荐使用Tez或Spark;
实现用户权限的控制,针对不同项目设置相应的用户,相互之间权限独立,实现数据安全,也可以根据需要,授予相应表权限。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值