本文以E-MapReduce的Hive为例,介绍在MaxCompute中如何创建外部schema,并查询Hadoop中的Hive表数据。
适用范围
目前仅华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华南1(深圳)、中国香港、新加坡和德国(法兰克福)地域支持。
操作步骤
步骤一:前置准备
如已有Hive数据,可忽略此步骤。
MaxCompute与Hadoop集群所在的VPC必须部署在同一地域。
为已创建的MaxCompute项目,开启项目级元数据支持的Schema开关。
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择。
在项目管理页面,单击目标项目操作列的升级到支持Schema层级。
步骤二:准备Hive数据
如已有Hive数据,可忽略此步骤。
登录E-MapReduce控制台,在左上角选择地域。
在我的集群主页面,单击创建集群。
软件配置
在顶部菜单栏处,根据实际情况选择资源组。资源组默认显示账号全部资源。其他配置参数如下:
参数名
说明
地域
创建的集群会在对应的地域内,一旦创建便无法修改。
MaxCompute与Hadoop集群所在的VPC必须部署在同一地域。
业务场景
本示例中选择自定义集群。
产品版本
根据需求选择,推荐使用最新版本。
服务高可用
默认不开启。打开服务高可用开关后,EMR会把Master节点分布在不同的底层硬件上以降低故障风险。
可选服务(至少一项)
本文实践选择
HADOOP-COMMON(3.2.1)、HDFS(3.2.1)、HIVE(3.1.3)以及YARN(3.2.1)。允许采集服务运行日志
默认开启采集。
如果您有采集需求,可以在集群信息中,修改服务运行日志采集状态。
元数据
本示例中使用自建 RDS。
云上创建RDS步骤参见创建RDS MySQL实例与配置数据库。
用于生产环境的集群,建议使用 独立 RDS MySQL,可以选择使用阿里云高可用版本的 RDS MySQL 5.7
填写RDS连接信息hivemetastore-site.xml:
javax.jdo.option.ConnectionURL
JDBC元数据连接,例如:
jdbc:mysql://rds.host.name/hive_db_namejavax.jdo.option.ConnectionUserName
元数据的数据库账号名。
javax.jdo.option.ConnectionPassword
元数据的数据库密码。
上述配置仅适用于本文实践,关于通过E-MapReduce控制台创建分析集群的详细操作请参见快速创建和使用数据湖分析集群。
硬件配置
参数名
说明
付费类型
包年包月
按量付费
在测试场景下,建议使用按量付费,测试正常后可以释放该集群,再新建一个包年包月的生产集群正式使用。
可用区
集群创建后,无法直接更改可用区,请谨慎选择。
专有网络
选择对应区域下的专有网络。如果没有,单击创建VPC前往新建。创建专有网络完成后,单击刷新,可以选择刚创建的VPC。
交换机
选择在对应专有网络下可用区的交换机,如果在这个可用区没有可用的交换机,则需要新创建一个。
默认安全组
重要不支持使用ECS上创建的企业安全组。
如果已有在使用的安全组,可以直接选择使用或新建安全组。
节点组
根据业务诉求,配置Master节点组、Core节点组或Task节点组信息。详情请参见选择硬件与网络。
本例中打开Master节点组下的挂载公网开关,其余使用默认值即可。
集群伸缩
配置弹性伸缩规则。
基础配置
参数名
说明
集群名称
集群的名字,长度限制为1~64个字符,仅可使用中文、字母、数字、短划线(-)和下划线(_)。
身份凭证
密钥对:如果希望在不输入密码的情况下进行身份验证,可以选择密钥对方式,更多详情请参见管理SSH密钥对。
密码:用于远程登录集群的Master节点。请记录该配置,登录集群时您需要输入该密码。
登录集群Master节点,进入Hive准备数据。
登录集群Master节点
登录E-MapReduce控制台,在左上角选择地域。
单击目标集群对应的节点管理。
在节点管理页签,单击节点组所在行的
图标,单击节点ID进入实例详情页。在节点ID的实例页面,单击远程连接。
在弹出的远程连接对话框,使用默认的通过Workbench远程连接,单击立即登录。
在登录实例窗口根据实际情况填写该实例信息。
说明在创建密钥对时,私钥会自动下载保存为.pem格式的私钥文件。认证方式可以选择SSH密钥认证,上传私钥文件,可以在不输入密码的情况下进行身份验证。
准备Hive测试数据。使用Workbench方式登录集群主节点后,在终端界面输入如下命令:
[user@emr-node ~]$ hive -- 创建库 hive> CREATE database IF NOT EXISTS myhive; -- 切换库 hive> USE myhive; -- 创建非分区表 hive> CREATE TABLE IF NOT EXISTS employees ( id INT, name STRING, age INT, department STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -- 插入数据 hive> 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'); -- 创建分区表 hive> 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);查询非分区表和分区表:
-- 查询非分区表 hive> 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 -- 查询分区表 hive> 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
步骤三:创建Hive+HDFS外部数据源
登录MaxCompute控制台,在左上角选择地域。
在左侧导航栏,选择 。
在外部数据源页面,单击创建外部数据源。
在弹出的新增外部数据源对话框,根据界面提示配置相关参数。参数说明如下:
参数
是否必填
说明
外部数据源类型
必填
选择Hive+HDFS。
外部数据源名称
必填
可自定义命名。命名规则如下:
以字母开头,且只能包含小写字母、下划线和数字。
不能超过128个字符。
例如hive_hdfs_mc。
外部数据源描述
选填
根据需要填写。
网络连接对象
必填
网络连接名称,选择或创建MaxCompute到阿里云E-MapReduce或Hadoop VPC网络的连接。
重要VPC必须与MaxCompute外部数据源及外部数据源挂载的项目处于同一地域。
参数详情请参见访问VPC方案(专线直连)中的创建MaxCompute与目标VPC网络间的网络连接步骤。
集群名称
必填
在Hadoop集群高可用环境下用于指代NameNode的名称。
以EMR集群为例,集群名称的获取方法如下:
登录E-MapReduce控制台,在左上角选择地域。
单击目标集群ID,进入集群详情页面。
在集群服务页签,单击HDFS服务的配置,进入配置页面。
切换至hdfs-site.xml页签,在配置项名称栏搜索
dfs.nameservices,该配置项对应的值则为集群名称。
NameNode 地址
必填
目标Hadoop集群的Active和Standby NameNode服务地址和端口号(端口号通常是8020)。
以EMR集群为例,NameNode地址的获取方法如下:
登录E-MapReduce控制台,在左上角选择地域。
单击目标集群ID,进入集群详情页面。
在集群服务页签,单击HDFS服务的状态,进入状态页面。
在组件列表区域,单击NameNode前面的
图标,展开拓扑列表。获取master-1-1节点对应的内网 IP,NameNode 地址格式即为
内网IP:8020。
HMS 服务地址
必填
目标Hadoop集群的Active和Standby NameNode的Hive元数据服务地址和端口号(端口号通常是9083)。
登录E-MapReduce控制台,在左上角选择地域。
单击目标集群ID,进入集群详情页面。
在集群服务页签,单击Hive服务的状态,进入状态页面。
在组件列表区域,单击HiveRuntime前面的
图标,展开拓扑列表。获取master-1-1节点对应的内网 IP,HMS 服务地址格式即为
内网IP:9083。
认证类型
必填
暂时仅支持无认证方式。
创建交换机
必填
MaxCompute通过VPC访问数据源,默认采用反向访问2.0技术方案,该方案需要配置特定可用区的交换机,打通元数据访问链路。
各个Region可用交换机的可用区在界面提示中有说明,在要访问的数据源所在的VPC中,选择已有或新建满足可用区要求的交换机。
单击确认,完成外部数据源的创建。
在外部数据源页面,单击目标数据源对应的操作的详情,可查看数据源详细信息。
步骤四:创建外部Schema
连接至MaxCompute项目。
使用如下代码创建外部Schema:
-- 打开Schema语法开关。 SET odps.namespace.schema=true; CREATE EXTERNAL SCHEMA IF NOT EXISTS <YOUR_EXTERNAL_SCHEMA_NAME> WITH <YOUR_EXTERNAL_DATASOURCE_NAME> ON 'myhive' ;参数说明:
your_external_schema_name:创建的外部Schema名称,例如
ex_hms_hdfs。your_external_datasource_name:在前一步骤MaxCompute中已创建的外部数据源名称,外部Schema归属的项目必须与外部数据源处于同一地域,示例为
hive_hdfs_mc。myhive:在准备Hive数据阶段创建的Hive数据库名称。
步骤五:使用SQL访问Hadoop Hive数据
查询外部Schema内的表。
SET odps.namespace.schema=true; SHOW tables IN <YOUR_EXTERNAL_SCHEMA_NAME>; -- 返回结果如下: ALIYUN$xxx:employees ALIYUN$xxx:employees_pt OK重要如果查询失败,可以尝试登录RDS控制台检查MaxCompute的VPC和安全组是否已经添加至RDS白名单。安全组添加至白名单后至少需要等待5分钟才会生效。
查询外部Schema表明细。
-- 查询非分区表。 SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.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 <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='HR'; -- 返回结果。 +------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 8 | Emily | 27 | HR | | 9 | Michael | 33 | HR | | 10 | Chris | 26 | HR | +------------+------------+------------+------------+
步骤六:向Hadoop数据源添加新数据
登录使用EMR创建的集群主节点,向Hive分区表插入新分区数据:
INSERT INTO employees_pt PARTITION (department='Computer') VALUES(11, 'Cily', 29),(12, 'Miky', 35); -- Hive侧查询分区表。 hive> SELECT * FROM employees_pt; -- 查询结果。 OK 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客户端,在MaxCompute侧查询新增分区数据:
SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.employees_pt WHERE department='Computer'; -- 返回结果。 +------------+------------+------------+------------+ | id | name | age | department | +------------+------------+------------+------------+ | 11 | Cily | 29 | Computer | | 12 | Miky | 35 | Computer | +------------+------------+------------+------------+
步骤七:将联邦外表的数据复制入数仓
-- 将联邦外表的数据复制到数仓中。
CREATE TABLE employees_copy AS SELECT * FROM <YOUR_EXTERNAL_SCHEMA_NAME>.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 |
+------------+------------+------------+-------------+