本文以E-MapReduce的Hive为例,为您介绍在MaxCompute中如何创建外部Schema,并查询EMR中的Hive表数据。
前提条件
已创建MaxCompute项目,并为MaxCompute项目(即将创建External Schema的目标项目)开启项目级元数据支持的Schema开关。
使用限制
仅华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳)、中国香港、新加坡和德国(法兰克福)地域支持构建湖仓一体能力。
MaxCompute与EMR集群所在的VPC必须部署在同一地域。
步骤一:准备Hive数据
登录EMR on ECS控制台,创建EMR集群,并连接实例。
在创建EMR集群的过程中,您需要重点关注以下配置项:
配置区域
配置项
描述
示例
软件配置
业务场景
请根据实际需求选择业务场景。
自定义集群
产品版本
选择基于Hadoop和Hive构建的EMR版本。
EMR-3.53.0
可选服务
选择相关的Hadoop、HDFS、Hive、YARN及ZooKeeper组件,被选中的组件会默认启动相关的服务进程。
Hadoop-Common、HDFS、Hive、YARN、Spark3、ZooKeeper
元数据
选择自建RDS,并配置相关的数据库连接参数,详情请参见配置自建RDS。
若您的Hive+HDFS外部数据源在EMR集群中,目前仅支持使用自建RDS作为元数据库,不支持DLF统一元数据和内置MySQL。且在读取数据前,需确保EMR集群的Hive组件正常运行。
自建RDS
集群创建成功后,单击目标集群操作列的节点管理。
在节点管理页面,单击emr-master节点组下的目标节点ID,进入ECS控制台。
选择合适的工具,连接节点ECS实例,详情请参见ECS远程连接方式概述。
说明本文使用Workbench远程连接实例,登录密码为创建集群时所设置的密码。
进入Hive准备数据。在EMR中使用Workbench方式登录集群主节点,在终端界面输入
hive
,进入Hive模式,然后执行如下命令。创建非分区表,并写入数据。
-- 创建库 CREATE DATABASE IF NOT EXISTS myhive; -- 切换库 USE myhive; -- 创建非分区表 CREATE TABLE IF NOT EXISTS employees ( id INT, name STRING, age INT, department STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -- 插入数据 INSERT INTO employees VALUES(1, 'John', 25, 'Sales'),(2, 'Jane', 30, 'Marketing'),(3, 'Mike', 35, 'Engineering'),(4, 'Sarah', 28, 'HR'),(5, 'David', 32, 'Finance'),(6, 'Linda', 29, 'IT'),(7, 'Robert', 31, 'Operations'),(8, 'Emily', 27, 'Research'),(9, 'Michael', 33, 'Development'),(10, 'Chris', 26, 'Support'); -- 查询表 SELECT * FROM employees;
返回结果如下:
1 John 25 Sales 2 Jane 30 Marketing 3 Mike 35 Engineering 4 Sarah 28 HR 5 David 32 Finance 6 Linda 29 IT 7 Robert 31 Operations 8 Emily 27 Research 9 Michael 33 Development 10 Chris 26 Support
创建分区表,并写入数据。
-- 创建分区表 CREATE TABLE employees_pt ( id INT, name STRING, age INT ) PARTITIONED BY (department STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 插入数据 INSERT INTO employees_pt PARTITION (department='Sales') VALUES(1, 'John', 25),(2, 'Jane', 30),(3, 'Mike', 35); INSERT INTO employees_pt PARTITION (department='Marketing') VALUES(4, 'Sarah', 28),(5, 'David', 32); INSERT INTO employees_pt PARTITION (department='Engineering') VALUES(6, 'Linda', 29),(7, 'Robert', 31); INSERT INTO employees_pt PARTITION (department='HR') VALUES(8, 'Emily', 27),(9, 'Michael', 33),(10, 'Chris', 26); -- 查询表 SELECT * FROM employees_pt;
返回结果如下:
6 Linda 29 Engineering 7 Robert 31 Engineering 8 Emily 27 HR 9 Michael 33 HR 10 Chris 26 HR 4 Sarah 28 Marketing 5 David 32 Marketing 1 John 25 Sales 2 Jane 30 Sales 3 Mike 35 Sales
步骤二:在MaxCompute中创建Hive+HDFS外部数据源
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择租户管理 > 外部数据源。
在外部数据源页面,单击创建外部数据源。
在新增外部数据源对话框,配置如下参数。
参数
说明
示例
外部数据源类型
选择Hive+HDFS。
Hive+HDFS
外部数据源名称
可自定义命名。命名规则如下:
以字母开头,且只能包含小写字母、下划线和数字。
不能超过128个字符。
hive_fs
外部数据源描述
根据需要填写。
无
网络连接对象
网络连接名称,选择或创建MaxCompute到阿里云E-MapReduce或Hadoop VPC网络的连接。参数详情请参见访问VPC方案(专线直连)中的创建MaxCompute与目标VPC网络间的网络连接步骤。
说明网络连接基本概念请参见Networklink。
VPC必须与MaxCompute外部数据源及外部数据源挂载的项目处于同一地域。
networklink
集群名称
在Hadoop集群高可用环境下用于指代NameNode的名称。获取方法如下:
登录EMR控制台,单击目标集群ID,进入集群详情页面。
在集群服务页签,单击HDFS服务的配置,进入配置页面。
切换至hdfs-site.xml页签,在配置项名称栏搜索
dfs.nameservices
,该配置项对应的值则为集群名称。
hdfs-cluster
NameNode 地址
目标Hadoop集群的Active和Standby NameNode服务地址和端口号(端口号通常是8020)。获取方式如下:
登录EMR控制台,单击目标集群ID,进入集群详情页面。
在集群服务页签,单击HDFS服务,进入状态页面。
在组件列表区域,单击NameNode前面的
图标,展开拓扑列表。
获取master-1-1节点对应的内网IP,NameNode 地址格式即为
内网IP:8020
。
172.22.xx.xxx:8020
HMS 服务地址
目标Hadoop集群的Active和Standby NameNode的Hive元数据服务地址和端口号(端口号通常是9083)。格式为
内网IP:9083
。说明内网IP的获取方式,请参见上述NameNode地址参数说明。
172.22.xx.xxx:9083
认证类型
暂时仅支持无认证方式。
无认证方式
单击确认,完成外部数据源的创建。
步骤三:在MaxCompute中创建外部Schema
在MaxCompute客户端中执行如下命令,创建外部Schema。
目标MaxCompute项目需要提前开启项目级元数据支持的Schema开关。
SET odps.namespace.schema=true;
CREATE EXTERNAL SCHEMA IF NOT EXISTS es_hive
WITH hive_fs
ON 'myhive' ;
代码说明如下:
步骤四:在MaxCompute客户端中使用SQL访问Hadoop Hive数据
在MaxCompute客户端中查询External Schema内的表。
SET odps.namespace.schema=true; SHOW TABLES IN es_hive;
返回结果如下:
ALIYUN$xxx:employees ALIYUN$xxx:employees_pt
查询External Schema内的表明细。
查询非分区表。
SELECT * FROM es_hive.employees;
返回结果如下:
+------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 1 | John | 25 | Sales | | 2 | Jane | 30 | Marketing | | 3 | Mike | 35 | Engineering| | 4 | Sarah | 28 | HR | | 5 | David | 32 | Finance | | 6 | Linda | 29 | IT | | 7 | Robert | 31 | Operations | | 8 | Emily | 27 | Research | | 9 | Michael | 33 | Development| | 10 | Chris | 26 | Support | +------------+------------+------------+------------+
查询分区表。
SELECT * FROM es_hive.employees_pt WHERE department='HR';
返回结果如下:
+------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 8 | Emily | 27 | HR | | 9 | Michael | 33 | HR | | 10 | Chris | 26 | HR | +------------+------------+------------+------------+
步骤五:向Hadoop数据源添加新数据
向Hive分区表插入新分区数据。
在EMR中使用Workbench方式登录集群主节点,在终端界面输入
hive
,进入Hive模式,然后执行如下命令:-- 切换至myhive数据库,并向employees_pt表中插入数据 USE myhive; INSERT INTO employees_pt PARTITION (department='Computer') VALUES(11, 'Cily', 29),(12, 'Miky', 35); -- 在Hive侧查询分区表 SELECT * FROM employees_pt;
返回结果如下:
11 Cily 29 Computer 12 Miky 35 Computer 6 Linda 29 Engineering 7 Robert 31 Engineering 8 Emily 27 HR 9 Michael 33 HR 10 Chris 26 HR 4 Sarah 28 Marketing 5 David 32 Marketing 1 John 25 Sales 2 Jane 30 Sales 3 Mike 35 Sales
在MaxCompute客户端中查询新增的分区数据。
SELECT * FROM es_hive.employees_pt WHERE department='Computer';
返回结果如下:
+------+------+------+------------+ | id | name | age | department | +------+------+------+------------+ | 11 | Cily | 29 | Computer | | 12 | Miky | 35 | Computer | +------+------+------+------------+
步骤六:在MaxComputeke客户端中将联邦外表的数据复制入数仓
-- 将联邦外表的数据复制到数仓中
CREATE TABLE employees_copy AS SELECT * FROM es_hive.employees;
-- 查询数仓中已复制的表数据
SELECT * FROM employees_copy;
返回结果如下:
+------------+------------+------------+------------+
| id | name | age | department |
+------------+------------+------------+------------+
| 1 | John | 25 | Sales |
| 2 | Jane | 30 | Marketing |
| 3 | Mike | 35 | Engineering|
| 4 | Sarah | 28 | HR |
| 5 | David | 32 | Finance |
| 6 | Linda | 29 | IT |
| 7 | Robert | 31 | Operations |
| 8 | Emily | 27 | Research |
| 9 | Michael | 33 | Development|
| 10 | Chris | 26 | Support |
+------------+------------+------------+------------+