本文为您介绍如何使用Spark on MaxCompute访问阿里云VPC内的用户实例。
直接访问VPC
Spark on MaxCompute可以访问阿里云VPC内的云服务器ECS(Elastic Compute Service)、云数据库HBase(Hadoop Database)和云关系型数据库RDS(Relational Database Service)等实例,同时还可以访问自定义私有域名。
访问VPC实例时,在spark-defaults.conf或者DataWorks的配置文件中添加spark.hadoop.odps.cupid.vpc.domain.list
参数,表明需要访问的一个或多个实例的网络情况。该参数值为JSON格式,配置时需要删除参数中多行文本之间的空格和换行符,合并JSON文本为一行。
spark.hadoop.odps.cupid.vpc.domain.list
参数取值请参见下文示例。您需要将示例中的RegionID、VPCID、实例域名和端口等替换为实际使用场景下的值。区域的RegionID请参见项目空间操作。
- 访问MongoDB示例
访问MongoDB时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。该MongoDB有主备2个实例。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "vpcId":"vpc-2zeaeq21mb1dmkqh0****", "zones":[ { "urls":[ { "domain":"dds-2ze3230cfea08****.mongodb.rds.aliyuncs.com", "port": 3717 }, { "domain":"dds-2ze3230cfea08****.mongodb.rds.aliyuncs.com", "port":3717 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh0****","zones":[{"urls":[{"domain":"dds-2ze3230cfea08****.mongodb.rds.aliyuncs.com","port": 3717},{"domain":"dds-2ze3230cfea08****.mongodb.rds.aliyuncs.com","port":3717}]}]}]}
- 访问RDS示例
访问RDS时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "vpcId":"vpc-2zeaeq21mb1dmkqh0****", "zones":[ { "urls":[ { "domain":"rm-2zem49k73c54z****.mysql.rds.aliyuncs.com", "port": 3306 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh0****","zones":[{"urls":[{"domain":"rm-2zem49k73c54z****.mysql.rds.aliyuncs.com","port": 3306}]}]}]}
- 访问HBase示例
访问HBase时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "vpcId":"vpc-2zeaeq21mb1dmkqh0exox", "zones":[ { "urls":[ { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":2181 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16000 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16020 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":2181 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16000 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16020 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":2181 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16000 }, { "domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com", "port":16020 }, { "domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com", "port":16020 }, { "domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com", "port":16020 }, { "domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com", "port":16020 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh0exox","zones":[{"urls":[{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":2181},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16000},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16020},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":2181},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16000},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16020},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":2181},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16000},{"domain":"hb-2zecxg2ltnpeg8me4-master*-***.hbase.rds.aliyuncs.com","port":16020},{"domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com","port":16020},{"domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com","port":16020},{"domain":"hb-2zecxg2ltnpeg8me4-cor*-***.hbase.rds.aliyuncs.com","port":16020}]}]}]}
- 访问Redis示例
当访问Redis时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "vpcId":"vpc-2zeaeq21mb1dmkqh0****", "zones":[ { "urls":[ { "domain":"r-2zebda0d3c05****.redis.rds.aliyuncs.com", "port":3717 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh0****","zones":[{"urls":[{"domain":"r-2zebda0d3c05****.redis.rds.aliyuncs.com","port":3717}]}]}]}
- 访问LogHub示例
访问LogHub时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "zones":[ { "urls":[ { "domain":"cn-beijing-intranet.log.aliyuncs.com", "port":80 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"zones":[{"urls":[{"domain":"cn-beijing-intranet.log.aliyuncs.com","port":80}]}]}]}
domain请使用LogHub Endpoint的经典网络或VPC网络服务入口,各Region对应的Endpoint请参见服务入口。
- 访问DataHub示例
访问DataHub时,
spark.hadoop.odps.cupid.vpc.domain.list
参数取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "zones":[ { "urls":[ { "domain":"dh-cn-beijing.aliyun-inc.com", "port":80 } ] } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"zones":[{"urls":[{"domain":"dh-cn-beijing.aliyun-inc.com","port":80}]}]}]}
domain请使用DataHub Endpoint的经典网络下的ECS Endpoint。Region对应的Endpoint请参见域名列表。
- 访问自定义域名示例
假设您在VPC内自定义了域名
example.aliyundoc.com
,Spark通过域名和端口example.aliyundoc.com:80
发起访问。您在使用前需要完成以下配置:- 在PrivateZone中将Zone关联至VPC。
- 单击一键授权,为MaxCompute赋予PrivateZone的只读权限。
- 在Spark节点配置里新增如下2个参数。
spark.hadoop.odps.cupid.pvtz.rolearn=acs:ram::xxxxxxxxxxx:role/aliyunodpsdefaultrole spark.hadoop.odps.cupid.vpc.usepvtz=true
spark.hadoop.odps.cupid.pvtz.rolearn
为用户的ARN信息,从RAM控制台可以获取。 - 在Spark的配置文件中新增
spark.hadoop.odps.cupid.vpc.domain.list
参数,取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId":"cn-beijing", "vpcs":[ { "vpcId":"vpc-2zeaeq21mb1dmkqh0****", "zones":[ { "urls":[ { "domain":"example.aliyundoc.com", "port":80 } ], "zoneId":"9b7ce89c6a6090e114e0f7c415ed****" } ] } ] }
{"regionId":"cn-beijing","vpcs":[{"vpcId":"vpc-2zeaeq21mb1dmkqh0****","zones":[{"urls":[{"domain":"example.aliyundoc.com","port":80}],"zoneId":"9b7ce89c6a6090e114e0f7c415ed****"}]}]}
- 访问文件存储HDFS示例
文件存储HDFS产品的使用,请参见开通文件存储HDFS版服务。
- 在Spark中使用文件存储HDFS需要新增hdfs-site.xml,内容如下所示。
<?xml version="1.0"?> <configuration> <property> <name>fs.defaultFS</name> <value>dfs://DfsMountpointDomainName:10290</value> </property> <property> <name>fs.dfs.impl</name> <value>com.alibaba.dfs.DistributedFileSystem</value> </property> <property> <name>fs.AbstractFileSystem.dfs.impl</name> <value>com.alibaba.dfs.DFS</value> </property> </configuration>
- 在Spark配置文件中新增
spark.hadoop.odps.cupid.vpc.domain.list
参数,取值如下。
合并示例中JSON文本为一行的结果如下。{ "regionId": "cn-shanghai", "vpcs": [{ "vpcId": "vpc-xxxxxx", "zones": [{ "urls": [{ "domain": "DfsMountpointDomainName", "port": 10290 }] }] }] }
{"regionId": "cn-shanghai","vpcs": [{"vpcId": "vpc-xxxxxx","zones": [{"urls": [{"domain": "DfsMountpointDomainName","port": 10290}]}]}]}
- 在Spark中使用文件存储HDFS需要新增hdfs-site.xml,内容如下所示。
ENI专线访问VPC
相比直接访问VPC方式,ENI专线方式更加稳定,性能更好,且具备外网访问能力。
- ENI专线可以打通一个VPC,如果用户作业需要同时访问多个VPC,则可以将已经通过ENI专线打通的VPC与其他VPC之间再做打通即可。
- Spark作业运行所在MaxCompute项目的阿里云账号的UID与目标VPC所属的阿里云账号的UID必须一致,否则作业运行时会提示报错信息:
You are not allowed to use this vpc - vpc owner and project owner must be the same person
。
- 授权
使用VPC实例所有者账号,在登录阿里云状态下单击授权,单击同意授权完成授权。
授权权限包括允许MaxCompute在VPC安全组内创建并绑定弹性网卡ENI。授权后,MaxCompute会自动在VPC网络内创建弹性网卡ENI。
- 配置安全组
在VPC实例下,创建独立安全组用于控制MaxCompute对VPC网络内的各种资源的访问权限。
- 登录专有网络管理控制台,单击目标VPC实例ID后,单击资源管理页签。
- 在资源管理页签的专有网络资源区域,将鼠标悬停至安全组数值上方后,单击添加,为MaxCompute创建独立安全组并记录安全组ID。
新建安全组为普通安全组,需要选择与连通服务相同的VPC网络。更多创建安全组操作,请参见创建安全组。
- 添加安全组
- 配置安全组
您可以按照默认配置添加安全组。
说明- 安全组为普通安全组,不是企业安全组。普通安全组的出口是默认开启的。企业安全组的出口是默认关闭的,会导致访问不了VPC内的任何服务。
- MaxCompute在后续的创建网络通路过程中会默认自动根据带宽需求创建2个ENI,不收取费用,由MaxCompute创建的ENI将位于这个安全组内。在HBase场景,如果用户的HBase无法对某个安全组开放网络权限,您可以将MaxCompute创建的ENI
IP添加至白名单即可。由于ENI IP可能会发生变化,推荐您添加VPC实例对应交换机的IP网段至白名单。
您可以在ECS管理控制台的左侧导航栏,单击弹性网卡,获取ENI IP。
- 添加安全组
- 登录专有网络管理控制台,单击目标VPC实例ID后,单击资源管理页签。
- 创建网络连接阿里云账号(主账号)或拥有tenant的Super_Administrator角色的RAM用户(子账号)可以在MaxCompute控制台创建MaxCompute与VPC网络之间的连接。具体操作如下所示:说明 tenant的Super_Administrator角色可以在MaxCompute控制台的用户管理页签授权。仅主账号或已经拥有tenant的Super_Administrator角色的子账号可以操作授权。详情请参见添加用户(账号级别)。
- 登录MaxCompute控制台。
- 在MaxCompute控制台的网络资源页签,单击新增网络连接。
- 在新增网络链接对话框,按下表填写参数后单击确定。
参数名称 说明 链接名称 自定义网络链接名称。格式如下: - 字母开头。
- 只能包含字母、下划线(_)和数字。
- 长度在1-63个字符。
类型 网络连接类型。默认为直通链接(passthrough)。 说明 直通链接对应的即是专有网络连接方案。区域 MaxCompute支持的通过专有网络连接方案开通网络连接的地域。详情请参见开通地域。 vpcid VPC实例ID。 获取方式如下:- 连接HBase、Hadoop集群时:您可以在对应控制台的网络连接信息处获取该信息。
- 其他情况:登录专有网络管理控制台,在专有网络页面即可获取VPC ID。
vSwitchID VPC网络绑定的交换机ID。 获取方式如下:- 连接HBase、Hadoop集群时:您可以在对应控制台的网络连接信息处获取该信息。
例如,当您连接阿里云HBase集群时,您可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击数据库连接,即可在右侧连接信息处获取交换机ID。
- 其他情况:登录专有网络管理控制台,在左侧导航栏单击交换机,即可在右侧通过VPC实例ID获取到交换机ID。
securityGroup 步骤2中记录的安全组ID。
- 配置目标服务的安全组。
- 配置Hadoop集群安全组。
为Hadoop集群的安全组配置如下信息,确保MaxCompute可以访问Hadoop集群。安全组配置内容如下:
- 配置Hadoop集群所在安全组的入方向访问规则。
- 授权对象为ENI所在的安全组,即步骤2中创建的安全组。
- HiveMetaStore端口:9083。
- HDFS NameNode端口:8020。
- HDFS DataNode端口:50010。
例如,当您连接在阿里云E-MapReduce上创建的Hadoop集群时,您需要配置的安全组规则如下图所示。详细配置操作,请参见添加安全组规则。 - 配置HBase集群安全组。
将为MaxCompute创建的安全组或ENI IP加入HBase集群的安全组或IP白名单中。
例如,当您连接阿里云HBase集群时,可以登录HBase管理控制台,在集群列表页面单击目标集群名称后,在左侧导航栏单击访问控制,即可在安全组或白名单设置页签添加安全组或IP白名单。更多添加安全组或IP白名单操作,请参见设置白名单和安全组。
说明 如果不允许添加安全组,您可以在白名单设置页签添加MaxCompute创建的ENI IP。当MaxCompute配置变更时,ENI IP可能会发生变化,推荐您添加交换机ID的IP网段添加至白名单。 - 配置RDS安全组。
将为MaxCompute创建的安全组或ENI IP加入RDS安全组或IP白名单中。
例如,当您连接阿里云RDS时,可以登录RDS管理控制台,在实例列表页面单击目标实例名称后,在左侧导航栏单击数据安全性,即可在安全组或白名单设置页签添加安全组或IP白名单。更多添加安全组或IP白名单操作,请参见设置安全组或设置IP白名单。
说明 当MaxCompute配置变更时,ENI IP可能会发生变化,推荐您添加交换机ID的IP网段添加至白名单。
- 配置Hadoop集群安全组。
- 配置用户作业。
运行Spark作业,需要增加如下两个配置,即可使用ENI专线连通目标VPC内的服务。
regionid:vpcid为步骤3中创建网络连接时实际使用的Region和VPC实例ID。spark.hadoop.odps.cupid.eni.enable = true spark.hadoop.odps.cupid.eni.info = regionid:vpcid
原先Spark作业中的VPC如下操作和配置不再需要:spark.hadoop.odps.cupid.vpc.domain.list spark.hadoop.odps.cupid.smartnat.enable spark.hadoop.odps.cupid.pvtz.rolearn #(访问自定义域名) spark.hadoop.odps.cupid.vpc.usepvtz #(访问自定义域名)