本期导读 :【阿里云 CDP 公开课】第九讲
主题:Hive3 新特性
讲师:王雪峰,Cloudera 生态资深解决方案工程师
内容框架:
- Hive3 的新功能
- Hive3 的变更细节
- 实操演示
直播回放链接:(第9讲)
https://developer.aliyun.com/live/248958
一、Hive3 的新功能
Hive3 的新功能
1)性能提升
- 更好的SQL兼容性
- Hive3支持绝大多数最新的ANSI SQL 2016标准;
- ACID v2
- 相比Hive2的ACID v1,v2在小文件、Stats、性能等方面都有了很大提升;
- 查询Caching
- 配置单元过滤并缓存相似或相同的查询。Hive不会重新计算未更改的数据,当数百个或数千个BI工具和Web服务的用户查询Hive时,缓存重复查询可以大大减少负载;
- 物化视图
- 多个查询经常需要相同的中间汇总表或联接表,所以可以通过将中间表预先计算和缓存到视图中来避免昂贵、重复的查询部分共享;
- Hive on Tez:Hive3底层计算引擎使用Hive on Tez,通过内存来计算,性能是Hive2的50倍;
2)事务特性优化
- 计划查询
- JDBC 联邦
- 启动后 Hive 从 JDBC 数据源创建两个数据库:information_schema和sys;
- 所有Metastore表都映射到表空间中,并且在sys中可用;
- information_schema数据显示系统状态,类似于sys数据库数据,可以使用SQL标准查询来查询information_schema;
- Kafka Connector和Cloud Connectors:实现直接操作组件存储和应用;
3)托管表优化
- 在Hive3中严格控制了文件系统和计算机的内存资源,提高整体性能的可预测性以及安全性;
- 使用ACID来确定要读取的文件,而不依赖于之前的存储系统;
- Hive3的文件移动比Hive2 减少很多;
- 聚集的缓存元数据和数据减少对文件系统的操作;
4)Spark
- 可以使用Hive从Spark应用程序查询数据,Hive Warehouse Connector(HWC)支持从Spark读取和写入Hive数据。
升级挑战:访问模式的更改
1)更高的安全性
- KNOX代理直接访问;
- 支持SSL接口访问;
- 完整的Kerberos实施;
- IDM 集成(许多服务的PAM默认值);
- 通过KNOX实现单点登录;
- 授权模型方面:CDP采用Ranger,Hive强制实施Ranger中指定的访问控制,与其他安全方案相比,为模型提供更强的安全性,并且在管理策略方面提供更大的灵活性;此模型仅允许Hive访问数据仓库。如果您未启用Ranger安全服务或其他安全性,则默认情况下,Hive会根据用户模拟使用CDP数据中心基于存储的授权;
- HDFS权限更改:在CDP数据中心中,基于存储的授权严重依赖于HDFS访问控制列表(ACL),ACL是HDFS中权限系统的扩展,默认情况下CDP数据中心在HDFS中打开ACL。
2)Hive自身变化
- HS2 vs. CLI (Beeline):Hive和Hive Sever分离,通过Hive Sever 2提供访问,同时,Hive CLI被Beeline取代;
- 旧版脚本:Hive1和Hive2的旧版脚本,在Hive3中需要进行测试和调整;
- 新的默认值:比如默认路径、默认结构等;
- SQL 强制(CBO 改进);
- 旧版的作业配置调整;
- 旧版摄取模式调整:比如小文件摄取;
- JDBC/ODBC驱动更新
- JDBC/ODBC访问点控制;
- 资源映射;
- 托管表(v1 与v2);
- 非模拟;
- 更严格的ACL 检查(DDL);
3)Spark
- 访问托管表:Spark不能直接访问Hive托管表,需要通过HWC进行操作,通过HWC从Spark访问Hive ACID表,外部表则无需通过HWC;
- 组件升级(1.x 到2.x);
- 适应更安全的环境;
- 元存储翻译层;
- 数据位置;
功能变化
- 托管表:使用V2版本,针对不同的文件格式产生不同的作用,在定义和默认位置方面都会有调整;
- 仓库位置:拆分托管表和外部表,以获得更好的治理标准;
- 安全防控:有模拟和非模拟方式,推荐使用非模拟方式访问;
- 数据安全治理:通过ACL整合和非模拟方式集成;
- LLAP:CDP私有云和公有云版本中提供,而Base版本则不提供LLAP;
- JDBC驱动程序更新。
功能移除
- 执行引擎不再支持Hive on MR/Spark,由Hive on Tez执行;
- 移除Hive CONCAT,使用ACID 表;
- 移除Hive Indexes,使用物化视图代替;
- 移除Hive CLI ,使用Beeline;
- Tez View 从DAS 中移到Hue;
- Oozie 的HiveAction被Hive2Action代替;
二、Hive3的变更细节
1)Hive Metastore(HMS)转换层
- 允许在各种Metastore用户之间安全共享元数据,如Hive、Spark和Impala;
- 每个客户端技术(Hive、Spark 和 Impala)都支持读取和写入数据源的功能列表;
- Metastore将这些功能与所请求的表相匹配,如果请求中存在不兼容,Metastore将向客户端提出异常并终止对表详细信息的内联请求;
在集成中推荐使用NON-IMPERSONATION(非模拟),doas=false方式。
2)通过翻译层进行规范化的副作用
Hive Metastore 转换层在HDP 3.1.5 及更高版本中可用,包括CDP-PvC Base 7.1+。
- 更改了“数据库”LOCATION值的“使用”:LOCATION在外部表中可用,而在托管表中不可用,从历史上看(直到 HDP 3.1.4) ,它控制了“托管”表的基本目录,而现在(HDP 3.1.5 + 和 CDP-PvC Base 7.1),它代表“外部”位置的默认基本目录;
- 控制“托管”表的基本位置,可以通过数据库的“MANAGEDLOCATION”进行控制(仅限 CDP 7.1+);
- 禁止非 ACID 托管表https://issues.apache.org/jira/browse/HIVE-22158
3)更改托管(ACID)表的“默认”位置
在CDP Runtime 7.1 及更高版本中可用(不在HDP 3 中)。
先决条件:
- 对于非模拟 (doas=false),“hive”超级用户需要对该位置的 RW 访问权限;
- SHOW DATABASE 不会显示托管位置;
4)结构转换为Hive Metastore
在Hive或Spark中创建的表由 Hive Metastore 翻译和调整,并在内部存储以匹配公认的最佳实践和术语。
- 在Hive中创建CREATE Table默认创建支持ACID的托管表,需要文件格式是ORC;
- 在Hive和在Spark中创建CREATE EXTERNAL都默认创建外表,这种外表的表结构和数据是分离的,当DROP Table后数据依然存在;
- 在Spark中创建CREATE表默认创建EXTERNAL/PURGE表,这种表的表格式和数据是一体的,当DROP Table后,数据也跟着移除;
- 外部表可以配置PURGE(相当于“经典”托管表)。
5)Hive1到Hive3会话
- 执行引擎从 Hive on MR 迁移到 Hive on TEZ的,检查会阻碍TEZ的旧会话配置;
- 原本就是Hive on TEZ的,CBO已经成熟,但许多旧的“会话”设置可能会产生负面影响;
因此推荐以下操作:
- 查看查询设置的会话值,删除它们并重试,在相关的地方添加回来;
- 检查统计数据,并在必要时刷新这些数据;
- 定期进行Rebalance,整合小文件。
6)Hive3 Warehouse拆分/影响
针对托管和外部两个仓库位置:
- 托管表在目录/warehouse/tablespace/managed/hive下:
可以通过“数据库”级别的“位置”设置调整位置;
- 外部表在目录/warehouse/tablespace/external/hive下:
可以通过“TABLE”级别的“位置”设置调整位置;
Hive3的Warehouse构建模式,与Hive1和Hive2有很大不同,它覆盖CREATE TABLE中的位置:
- 在托管表创建中设置“位置”,违反了posix安全性,继而创建失败;
- 触发尝试有效 SBA 的外部代码路径;
- 设置“位置”只能用于“外部”表。
7)Hive的细微默认值变更
Hive的细微默认值变更,比如CREATE TABLE,在 Hive 3 中是创建一个托管ACID 表,而在 Hive1和2中,是创建一个托管(非ACID)表,这意味着:
- 如果“CREATE TABLE”表是应用程序工作流程的一部分,则该表的使用者必须是Hive或使用Spark HWC,因为该表将是一个 ACID 表;
- 或者,将这些“CREATE TABLE”语句转换为“CREATE EXTERNAL TABLE”(带有清除)以保持与“经典托管表”之前相同的行为;
在CDP 7.1.4 中,新的“会话”级别配置将提供“CREATE TABLE”到“CREATE EXTERNAL TABLE”的自动转换。保存需要“经典”托管表的旧脚本的返工,结果是一个具有清除功能的“外部”表。
- 用于会话级别控制的JDBC参数:hiveCreateAsExternalLegacy=true
- HS2级别控制的HS2 配置:hive.create.as.external.legacy=true
8)Hive3的ODBC设置
推荐设置两个参数,来调整ODBC驱动程序设置(见下图):
- Use Native Query = True (选中)
- Get Tables With Query = False (不选)
通过以上设置,可以实现Hive访问性能优化,因此这些设置的相反值很可能会导致通过此 ODBC 接口使用 Hive 的应用程序性能不佳。
9)Spark 与 Hive 托管表的集成
Spark与Hive托管表的集成,主要是Spark读写Hive表的情况:
- 托管表的访问模式推荐使用HWC (JDBC 模式) 低容量处理模式;
- 也可以直接使用Hive Direct Read/Spark SQL模式来读取托管表;
- 写入仍需要通过HWC模式;
- 同时在读取时会存在未进行权限验证直接访问的安全隐患。
三、 Demo 演示
Demo 演示主要有两部分:Hive3的ACID和Hive3的Merge,会在Zeppelin中进行操作。
Hive3的ACID
详细步骤如下:
1)创建表:Hive ACID
CRAETE TABLE IF NOT EXISTS hello_acid (key int,value int)
查看建表语句;
show create table hello_acid
查看表信息:
INSERT INTO hello_acid PARTITION (load_date) VALUES
2)插入数据;
INSERT INTO hello_acid PARTITION (load_date) VALUES
数据查询:
Select * FROM hello_acid
3)删除key=2的记录
DELETE FROM hello_acid WHERE key = 2
数据查询:key=2的记录被删除
4)数据更新,将key=3的数据更新成10;
UPDATE hello_acid SET value = 10 WHERE key = 3
数据查询
5)创建mydim表,并插入三条记录;
6)创建中间表update_staging_table,并插入数据;
查看表记录
根据中间表的key值更新mydim数据,结果显示影响了2个记录,接着进行数据查询,显示有2个记录由true变成false:
UPDATE mydim SET is_current = false WHERE mydim.key IN (SELECT key FROM update_staging_table)
根据中间表数据进行数据删除,结果显示将2个false的记录删除,只剩下true的1条记录;
DELETE FROM mydim WHERE mydim.key IN (SELECT key FROM update_staging_table)
7)信息查询:
交易信息:
锁信息:
row_id:
Hive 3的Merge
详细步骤如下:
1)创建数据库、创建表;
CREATE DATABASE merge_data CREAT TABLE merge_data.transaction CREAT TABLE merge_data.merge_source
2)向两个表中插入记录
INSERT INTO merge_data.transaction PARTITION (tran_date) VALUES INSERT INTO merge_data.merge_source VALUES
2)进行merge操作
MERGE INTO merge_data.transactions AS T USING merge_data.merge_source AS S ON T.ID = S.ID and T.tran_date = S.tran_date WHEN MATCHED AND (T.TranValue != S.TranValue AND S.TranValue IS NOT NULL) THEN UPDATE SET TranValue = S.TranValue, last_update_user = ‘merge_update’ WHEN MATCHED AND S.TranValue IS NULL THEN DELETE WHEN NOT MATCHED THEN INSERT VALUES (S.ID, S.TranValue, ‘merge_insert’, S.tran_date)
查看merge后的数据
另外,在CDP中,无论是Hive、Spark和Impala,都是通过Ranger来管理的,在Ranger的Hadoop SQL里进行设置。
⭐点击回放链接,观看第9讲视频回放,获取讲师实例讲解:
https://developer.aliyun.com/live/248958
更多信息
产品试用
目前,CDP产品支持三个场景试用体验:
第一,CDP沙箱环境。主要测试常用场景:如构建数仓、ETL等常见的大数据分析场景,以及测试安全、数据血缘和治理等组件。
第二,Edge2AI场景。在此Edge2Al的实操实验中,将为IoT预测性维护用例构建完整的OT到IT的工作流。
第三,CDP Base+Data Service。测试存算分离,新一代容器化计集群,用户体验良好的APP等。
立即开通:https://cloudera.console.aliyun.com/?
试用申请:https://survey.aliyun.com/apps/zhiliao/owtTaIQU3
技术交流
钉钉扫描下方二维码加入产品交流群一起参与讨论吧!