Hive的一些总结

1.架构

在这里插入图片描述
2.与数据库比较

拥有类似的查询语言,其他不相同
1)数据存储位置
Hive 存储在 HDFS 。数据库将数据保存在块设备或者本地文件系统中。
2)数据更新
Hive 中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,
3)执行延迟
Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较
小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。
4)数据规模
Hive 支持很大规模的数据计算;数据库可以支持的数据规模较小。

3.内部表和外部表

1)管理表(内部表):当我们删除一个管理表时,Hive 也会删除这个表中数据。管理表不适合和其他工具共享数据。
2)外部表:删除该表并不会删除掉原始数据,删除的是表的元数据

4.四个By

Sort By:分区内有序,sort
Order By:全局排序,只有一个Reduce
Distrbute By:类似MR中Partition,进行分区,结合sort by使用
Cluster By:当 Distribute by 和 Sorts by 字段相同时,可以使用 Cluster by 方式Cluster by 除了具有 Distribute by 的功能外还兼具 Sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。

5.自定义 UDF (user defined function)、UDTF(user defined table-generating function)
UDF 作用于单个数据行,输出一个数据
UDTF作用于单个数据行,产生多个数据行,一个表作为输出

处理问题,例:
自定义UDF,解析公共字段。继承UDF,重写evaluate方法
自定义UDTF,解析事件字段,继承GenericUDTF,重写三个方法:initialize(自定义输出的列名和类型),process(将结果返回forward(result)),close
自定义可以自己埋点Log打印日志,出错或者数据异常,方便调试

5.Hive优化

1 )MapJoin
如果不指定 MapJoin 或者不符合 MapJoin 的条件,那么 Hive 解析器会将 Join 操作转换
成 Common Join,即:在 Reduce 阶段完成 join。容易发生数据倾斜。可以用 MapJoin 把小
表全部加载到内存在 map 端进行 join,避免 reducer 处理。
2) ) 行列过滤
列处理:在 SELECT 中,只拿需要的列,如果有,尽量使用分区过滤,少用 SELECT *。
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在 Where 后面,
那么就会先全表关联,之后再过滤。
3 )采用分桶技术
4 )采用分区技术
5)合理设置Map 数
(1)通常情况下,作业会通过 input 的目录产生一个或者多个 map 任务。
主要的决定因素有:input 的文件总个数,input 的文件大小,集群设置的文件块大小
(2)是不是 map 数越多越好?
不是。如果一个任务有很多小文件(远远小于块大小 128m),则每个小文件也会被当做一个块,用一个 map 任务来完成,而一个 map 任务启动和初始化的时间远远大
于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的 map 数是受限的。
(3)是不是保证每个 map 处理接近 128m 的文件块,就高枕无忧了?
不一定。比如有一个 127m 的文件,正常会用一个 map 去完成,但这个文件只
有一个或者两个小字段,却有几千万的记录,如果 map 处理的逻辑比较复杂,用一个 map任务去做,肯定也比较耗时。
针对上面的问题 2 和 3,我们需要采取两种方式来解决:即减少 map 数和增加 map 数;
6) ) 小文件进行合并
在 Map 执行前合并小文件,减少 Map 数:CombineHiveInputFormat 具有对小文件进行
合并
的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。
7) 合理设置 Reduce 数
Reduce 个数并不是越多越好
(1)过多的启动和初始化 Reduce 也会消耗时间和资源;
(2)另外,有多少个 Reduce,就会有多少个输出文件,如果生成了很多个小文件,那
么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题;
在设置 Reduce 个数的时候也需要考虑这两个原则:处理大数据量利用合适的 Reduce
数;使单个 Reduce 任务处理数据量大小要合适;

8) ) 常用参数
// 输出合并小文件
SET hive.merge.mapfiles = true; – 默认 true,在 map-only 任务结束时合并
小文件
SET hive.merge.mapredfiles = true; – 默认 false,在 map-reduce 任务结
束时合并小文件
SET hive.merge.size.per.task = 268435456; – 默认 256M
SET hive.merge.smallfiles.avgsize = 16777216; – 当输出文件的平均大小
小于该值时,启动一个独立的 map-reduce 任务进行文件 merge

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值