本文介绍如何在开源大数据平台 EMR(E-MapReduce)集群上,使用Spark3将表格存储中一张表的数据复制到另一张表中,全程使用SQL语句实现表的创建以及数据的复制操作。
前提条件
已创建EMR集群。具体操作,请参见创建EMR集群。
重要创建集群时,请确保打开Master节点组的挂载公网开关,将集群挂载到公网,用于远程登录。
不开启"挂载公网",创建后只能通过内网访问。创建后如果您需要公网访问,请前往ECS挂载EIP。
已创建表格存储数据表,且目标表的主键列应和需要复制的源表主键列保持一致(包括主键顺序和名称)。具体操作,请参见通过控制台创建数据表或通过SDK创建数据表。
已创建RAM用户,并授予RAM用户管理表格存储服务的权限(AliyunOTSFullAccess)。具体操作,请参见配置RAM用户权限。
重要由于配置时需要填写访问密钥AccessKey(AK)信息来执行授权,为避免阿里云账号泄露AccessKey带来的安全风险,建议您通过RAM用户来完成授权和AccessKey的创建。
已获取AccessKey(包括AccessKey ID和AccessKey Secret),用于进行签名认证。具体操作,请参见获取AccessKey。
步骤一:启动Spark SQL CLI
远程登录EMR集群的Master节点。具体操作,请参见远程登录Master节点。
执行如下命令启动Spark SQL CLI,用于Spark表创建和后续的SQL操作。
spark-sql --jars /opt/apps/SPARK-EXTENSION/spark-extension-current/spark3-emrsdk/*,/opt/apps/HADOOP-COMMON/hadoop-common-current/share/hadoop/common/lib/commons-net-3.6.jar
步骤二:创建Spark表
以两张表格存储数据表source_pet和target_pet为例,表结构如下,其中name为主键。
name | owner | species | sex | birth | death |
创建source_pet外表。
CREATE TABLE source_pet USING tablestore OPTIONS(endpoint = "https://xxx.cn-hangzhou.vpc.tablestore.aliyuncs.com", access.key.id = "xxx", access.key.secret = "xxx", table.name = "source_pet", instance.name = "test_instance", catalog = '{"columns":{"name":{"col":"name","type":"string"},"owner":{"col":"owner","type":"string"},"species":{"col":"species","type":"string"},"sex":{"col":"sex","type":"string"},"birth":{"col":"birth","type":"string"},"death":{"col":"death","type":"string"}}}' );
具体参数说明请参见下表。
参数
说明
endpoint
表格存储实例访问地址,建议使用VPC地址。使用VPC时,请确保EMR集群和表格存储实例之间的网络可连通。更多信息,请参见服务地址。
说明如果要实现跨账号、跨地域数据复制,请通过云企业网连通VPC进行操作。关于使用云企业网的具体操作,请参见云企业网快速入门。
access.key.id
阿里云账号或者RAM用户的AccessKey ID和AccessKey Secret。获取方式请参见创建AccessKey。
access.key.secret
instance.name
表格存储实例名称。
table.name
表格存储的数据表名称。
catalog
表格存储数据表的Schema定义。
创建target_pet外表。
CREATE TABLE target_pet USING tablestore OPTIONS(endpoint = "https://xxx.cn-hangzhou.vpc.tablestore.aliyuncs.com", access.key.id = "xxx", access.key.secret = "xxx", table.name = "target_pet", instance.name = "test_instance", catalog = '{"columns":{"name":{"col":"name","type":"string"},"owner":{"col":"owner","type":"string"},"species":{"col":"species","type":"string"},"sex":{"col":"sex","type":"string"},"birth":{"col":"birth","type":"string"},"death":{"col":"death","type":"string"}}}' );
创建target_pet外表与创建source_pet外表的参数设置中只有
table.name
字段有差别,其他参数设置均相同。说明如果要实现跨账号、跨地域数据复制,请通过云企业网连通VPC进行操作。关于使用云企业网的具体操作,请参见云企业网快速入门。
步骤三:复制数据
将source_pet表中数据复制到target_pet表中。
INSERT INTO target_pet SELECT * FROM source_pet;