写点什么

Hive 学习笔记(二)

发布于: 1 小时前

本篇是 Hive 学习笔记第二篇,第一篇传送门https://xie.infoq.cn/article/0c0f67ab82ed951b27481341d

6. 为什么要对数据仓库分层?

  • 用空间换时间,通过大量的预处理来提升应用系统的用户体验(效率),因此数据仓库会存在大量冗余的数据。

  • 如果不分层的话,如果源业务系统的业务规则发生变化将会影响整个数据清洗过程,工作量巨大。

  • 通过数据分层管理可以简化数据清洗的过程,因为把原来一步的工作分到了多个步骤去完成,相当于把一个复杂的工作拆成了多个简单的工作,把一个大的黑盒变成了一个白盒,每一层的处理逻辑都相对简单和容易理解,这样我们比较容易保证每一个步骤的正确性,当数据发生错误的时候,往往我们只需要局部调整某个步骤即可。


数据仓库详细介绍可查看:万字详解整个数据仓库建设体系

7. 使用过 Hive 解析 JSON 串吗

Hive 处理 json 数据总体来说有两个方向的路走


  1. 将 json 以字符串的方式整个入 Hive 表,然后通过使用 UDF 函数解析已经导入到 hive 中的数据,比如使用LATERAL VIEW json_tuple的方法,获取所需要的列名。

  2. 在导入之前将 json 拆成各个字段,导入 Hive 表的数据是已经解析过的。这将需要使用第三方的 SerDe。


详细介绍可查看:Hive解析Json数组超全讲解

8. sort by 和 order by 的区别

order by 会对输入做全局排序,因此只有一个 reducer(多个 reducer 无法保证全局有序)只有一个 reducer,会导致当输入规模较大时,需要较长的计算时间。


sort by 不是全局排序,其在数据进入 reducer 前完成排序.因此,如果用 sort by 进行排序,并且设置 mapred.reduce.tasks>1, 则 sort by 只保证每个 reducer 的输出有序,不保证全局有序

9. 数据倾斜怎么解决

数据倾斜问题主要有以下几种:


  1. 空值引发的数据倾斜

  2. 不同数据类型引发的数据倾斜

  3. 不可拆分大文件引发的数据倾斜

  4. 数据膨胀引发的数据倾斜

  5. 表连接时引发的数据倾斜

  6. 确实无法减少数据量引发的数据倾斜


以上倾斜问题的具体解决方案可查看:Hive千亿级数据倾斜解决方案


注意:对于 left join 或者 right join 来说,不会对关联的字段自动去除 null 值,对于 inner join 来说,会对关联的字段自动去除 null 值。


小伙伴们在阅读时注意下,在上面的文章(Hive 千亿级数据倾斜解决方案)中,有一处 sql 出现了上述问题(举例的时候原本是想使用 left join 的,结果手误写成了 join)。此问题由公众号读者发现,感谢这位读者指正。

10. Hive 小文件过多怎么解决

1. 使用 hive 自带的 concatenate 命令,自动合并小文件

使用方法:


#对于非分区表alter table A concatenate;
#对于分区表alter table B partition(day=20201224) concatenate;
复制代码


注意:

1、concatenate 命令只支持 RCFILE 和 ORC 文件类型。

2、使用 concatenate 命令合并小文件时不能指定合并后的文件数量,但可以多次执行该命令。

3、当多次使用 concatenate 后文件数量不在变化,这个跟参数 mapreduce.input.fileinputformat.split.minsize=256mb 的设置有关,可设定每个文件的最小 size。

2. 调整参数减少 Map 数量

设置 map 输入合并小文件的相关参数(执行 Map 前进行小文件合并):


在 mapper 中将多个文件合成一个 split 作为输入(CombineHiveInputFormat底层是 Hadoop 的CombineFileInputFormat方法):


set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; -- 默认
复制代码


每个 Map 最大输入大小(这个值决定了合并后文件的数量):


set mapred.max.split.size=256000000;   -- 256M
复制代码


一个节点上 split 的至少大小(这个值决定了多个 DataNode 上的文件是否需要合并):


set mapred.min.split.size.per.node=100000000;  -- 100M
复制代码


一个交换机下 split 的至少大小(这个值决定了多个交换机上的文件是否需要合并):


set mapred.min.split.size.per.rack=100000000;  -- 100M
复制代码
3. 减少 Reduce 的数量

reduce 的个数决定了输出的文件的个数,所以可以调整 reduce 的个数控制 hive 表的文件数量。


hive 中的分区函数 distribute by 正好是控制 MR 中 partition 分区的,可以通过设置 reduce 的数量,结合分区函数让数据均衡的进入每个 reduce 即可:


#设置reduce的数量有两种方式,第一种是直接设置reduce个数set mapreduce.job.reduces=10;
#第二种是设置每个reduce的大小,Hive会根据数据总大小猜测确定一个reduce个数set hive.exec.reducers.bytes.per.reducer=5120000000; -- 默认是1G,设置为5G
#执行以下语句,将数据均衡的分配到reduce中set mapreduce.job.reduces=10;insert overwrite table A partition(dt)select * from Bdistribute by rand();
复制代码


对于上述语句解释:如设置 reduce 数量为 10,使用 rand(), 随机生成一个数 x % 10 ,这样数据就会随机进入 reduce 中,防止出现有的文件过大或过小。

4. 使用 hadoop 的 archive 将小文件归档

Hadoop Archive 简称 HAR,是一个高效地将小文件放入 HDFS 块中的文件存档工具,它能够将多个小文件打包成一个 HAR 文件,这样在减少 namenode 内存使用的同时,仍然允许对文件进行透明的访问。


#用来控制归档是否可用set hive.archive.enabled=true;#通知Hive在创建归档时是否可以设置父目录set hive.archive.har.parentdir.settable=true;#控制需要归档文件的大小set har.partfile.size=1099511627776;
使用以下命令进行归档:ALTER TABLE A ARCHIVE PARTITION(dt='2021-05-07', hr='12');
对已归档的分区恢复为原文件:ALTER TABLE A UNARCHIVE PARTITION(dt='2021-05-07', hr='12');
复制代码


注意:

归档的分区可以查看不能 insert overwrite,必须先 unarchive


Hive 小文件问题具体可查看:解决hive小文件过多问题

11. Hive 优化有哪些

1. 数据存储及压缩:

针对 hive 中表的存储格式通常有 orc 和 parquet,压缩格式一般使用 snappy。相比与 textfile 格式表,orc 占有更少的存储。因为 hive 底层使用 MR 计算架构,数据流是 hdfs 到磁盘再到 hdfs,而且会有很多次,所以使用 orc 数据格式和 snappy 压缩策略可以降低 IO 读写,还能降低网络传输量,这样在一定程度上可以节省存储,还能提升 hql 任务执行效率;

2. 通过调参优化:

并行执行,调节 parallel 参数;


调节 jvm 参数,重用 jvm;


设置 map、reduce 的参数;开启 strict mode 模式;


关闭推测执行设置。

3. 有效地减小数据集将大表拆分成子表;结合使用外部表和分区表。
4. SQL 优化
  • 大表对大表:尽量减少数据集,可以通过分区表,避免扫描全表或者全字段;

  • 大表对小表:设置自动识别小表,将小表放入内存中去执行。


Hive 优化详细剖析可查看:Hive企业级性能优化




发布于: 1 小时前阅读数: 3
用户头像

专注于大数据技术研究 2020.11.10 加入

运营公众号:五分钟学大数据。大数据领域原创技术号,深入大数据技术

评论

发布
暂无评论
Hive学习笔记(二)