写点什么

Hive 相关的总结

发布于: 2021 年 04 月 03 日
Hive相关的总结

1 Hive 的架构



2 Hive 和数据库比较

Hive 和数据库除了拥有类似的查询语言,再无类似之处。

1) 数据存储位置

Hive 存储在 HDFS。数据库将数据保存在块设备或者本地文件系统中。

2) 数据更新

Hive 中不建议对数据的改写。而数据库中的数据通常是需要经常进行修改的,

3) 执行延迟

Hive 执行延迟较高。数据库的执行延迟较低。当然,这个是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。

4) 数据规模

Hive 支持很大规模的数据计算;数据库可以支持的数据规模较小。

3 内部表和外部表

1) 内部表:当我们删除一个内部表时,Hive 也会删除这个表中数据。内部表不适合和其他工具共享数据。

2) 外部表:删除该表并不会删除掉原始数据,删除的是表的元数据

4 4 个 By 区别

1) Sort By:分区内有序;

2) Order By:全局排序,只有一个 Reducer;

3) Distrbute By:类似 MR 中 Partition,进行分区,结合 sort by 使用。

4) Cluster By:当 Distribute by 和 Sorts by 字段相同时,可以使用 Cluster by 方式。Cluster by 除了具有 Distribute by 的功能外还兼具 Sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。

5 窗口函数

RANK() 排序相同时会重复,总数不会变

DENSE_RANK() 排序相同时会重复,总数会减少

ROW_NUMBER() 会根据顺序计算

1) OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化

2) CURRENT ROW:当前行

3) n PRECEDING:往前 n 行数据

4) n FOLLOWING:往后 n 行数据

5) UNBOUNDED:起点,UNBOUNDED PRECEDING 表示从前面的起点, UNBOUNDED FOLLOWING 表示到后面的终点

6) LAG(col,n):往前第 n 行数据

7) LEAD(col,n):往后第 n 行数据

8) NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从 1 开始,对于每一行,NTILE 返回此行所属的组的编号。注意:n 必须为 int 类型。

6 自定义 UDF、UDTF

在项目中是否自定义过 UDF、UDTF 函数,以及用他们处理了什么问题,及自定义步骤?

1) 自定义过。

2) 用 UDF 函数解析公共字段;用 UDTF 函数解析事件字段。

自定义 UDF:继承 UDF,重写 evaluate 方法

自定义 UDTF:继承自 GenericUDTF,重写 3 个方法:initialize(自定义输出的列名和类型),process(将结果返回 forward(result)),close

为什么要自定义 UDF/UDTF,因为自定义函数,可以自己埋点 Log 打印日志,出错或者数据异常,方便调试.

7 Hive 优化

1) MapJoin

如果不指定 MapJoin 或者不符合 MapJoin 的条件,那么 Hive 解析器会将 Join 操作转换成 Common Join,即:在 Reduce 阶段完成 join。容易发生数据倾斜。可以用 MapJoin 把小表全部加载到内存在 map 端进行 join,避免 reducer 处理。

2) 行列过滤

列处理:在 SELECT 中,只拿需要的列,如果有,尽量使用分区过滤,少用 SELECT *。

行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在 Where 后面,那么就会先全表关联,之后再过滤。

3) 采用分桶技术

4) 采用分区技术

5) 合理设置 Map 数

a. 通常情况下,作业会通过 input 的目录产生一个或者多个 map 任务。

主要的决定因素有:input 的文件总个数,input 的文件大小,集群设置的文件块大小。

b. 是不是 map 数越多越好?

答案是否定的。如果一个任务有很多小文件(远远小于块大小 128m),则每个小文件也会被当做一个块,用一个 map 任务来完成,而一个 map 任务启动和初始化的时间远远大于逻辑处理的时间,就会造成很大的资源浪费。而且,同时可执行的 map 数是受限的。

c. 是不是保证每个 map 处理接近 128m 的文件块,就高枕无忧了?

答案也是不一定。比如有一个 127m 的文件,正常会用一个 map 去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果 map 处理的逻辑比较复杂,用一个 map 任务去做,肯定也比较耗时。

针对上面的问题 2 和 3,我们需要采取两种方式来解决:即减少 map 数和增加 map 数;

6) 小文件进行合并

在 Map 执行前合并小文件,减少 Map 数:CombineHiveInputFormat 具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat 没有对小文件合并功能。

7) 合理设置 Reduce 数

Reduce 个数并不是越多越好

a. 过多的启动和初始化 Reduce 也会消耗时间和资源;

b. 另外,有多少个 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

发布于: 2021 年 04 月 03 日阅读数: 20
用户头像

还未添加个人签名 2021.03.07 加入

还未添加个人简介

评论

发布
暂无评论
Hive相关的总结