HIVE3 深度剖析 (下篇)
大家好,我是明哥!
HIVE3.x 系列相对于HIVE2.x系列,差异还是很大的。为方便大家了解这些差异点以更有效地使用HIVE,接下来我会通过几篇文章,重点剖析下这些差异点。
整个系列分为上下两篇文章,涵盖以下章节:
- 从 HIVE 架构的演进看 HIVE 的发展趋势
- 盘点下 HIVE3.X 和 HIVE2.X 的那些重大差异点
- HIVE3.X 的 ORC 事务表详解
- HIVE3.X 的 LEGACY 传统模式详解
- 周边生态如 SPARK/DATAX 如何对接HIVE 3x
- 大数据应用对接 HIVE3.x 的几点建议
本片文章是下篇,包含上述后三个章节,希望大家喜欢。
1. HIVE3.X 的 LEGACY 传统模式详解
-
如上篇所述,Hive 的 ORC 事务内表,通过 ACID 事务特性,提供诸多优势,包括对多个作业并发读写同一个表或同一个分区的支持,包括记录级别的增删改和数据修复功能,包括更好的批量性能、安全保障和用户体验等等;
-
但是直接切换使用 HIVE ORC 事务表,涉及到用户的学习成本,也涉及到遗留系统代码的迁移改造,所以可能在一段时间内,用户仍期望 HIVE3.X 能尽量保留原有 Hive2.X 的使用模式 (即默认方式创建的表仍然是非事务表);
-
Cloudera 推出 了 Hive 的 LEGACY 传统 模式,并回馈给了 APACHE HIVE 开源社区,以缓解 HIVE/CDP 在升级/迁移期间的脚本兼容性问题,并给用户更多的适应时间( 从 CDP7.1.4 开始支持传统模式);
-
HIVE3.X 的 legacy 传统模式,可以通过参数 hive.create.as.external.legacy 来开启,需要说明的是,该参数在推出之初,社区就明确指出,“This config is temporary and will be deprecated later”,所以长远来看,还是推荐大家学习 HIVE3.X 的这些新特性,并逐渐摒弃对传统模式的以来;
-
需要注意,并不是所有版本的 HIVE 3.X 都支持 LEGACY 模式,大家可以通过 BEELINE 登陆 HS2 后执行命令 SET hive.create.as.external.legacy 查看是否支持该参数,如果显示 xx is undefined ,则表示不支持 LEGACY 模
式;
-
大家知道,HIVE2.X中 DROP table 时,对于内表,会删除 HMS 中的元数据和底层存储系统 HDFS 中的数据,而对于外表,则只会删除 HMS 中的元数据不会删除底层存储系统 HDFS 中的数据;
-
在 HIVE3.X 中,根据 DROP TABLE 时是否删除底层存储系统 HDFS 中的数据,external 外表又被分为两种类型:external non purgeable table 和 external purge table,前者在DROP TABLE 时跟 HIVE2.X 的外表行为一致,不会删除底层HDFS中的数据;而后者 DROP TABLE 时跟 HIVE2.X 的内表行为一致,也会删除底层 HDFS 中的数据;
-
HIVE3.X 中创建外表时外表的具体类型,可以通过 session 级别参数 hive.external.table.purge.default 控制,也可以在建表时在