数据复制

本文介绍如何在开源大数据平台 EMR(E-MapReduce)集群上,使用Spark3表格存储中一张表的数据复制到另一张表中,全程使用SQL语句实现表的创建以及数据的复制操作。

前提条件

  • 已创建EMR集群。具体操作,请参见创建EMR集群

    重要
    • 创建集群时,请确保打开Master节点组的挂载公网开关,将集群挂载到公网,用于远程登录。

    • 不开启"挂载公网",创建后只能通过内网访问。创建后如果您需要公网访问,请前往ECS挂载EIP

  • 已创建表格存储数据表,且目标表的主键列应和需要复制的源表主键列保持一致(包括主键顺序和名称)。具体操作,请参见通过控制台创建数据表通过SDK创建数据表

  • 已创建RAM用户,并授予RAM用户管理表格存储服务的权限(AliyunOTSFullAccess)。具体操作,请参见配置RAM用户权限

    重要

    由于配置时需要填写访问密钥AccessKey(AK)信息来执行授权,为避免阿里云账号泄露AccessKey带来的安全风险,建议您通过RAM用户来完成授权和AccessKey的创建。

  • 已获取AccessKey(包括AccessKey IDAccessKey Secret),用于进行签名认证。具体操作,请参见获取AccessKey

步骤一:启动Spark SQL CLI

  1. 远程登录EMR集群的Master节点。具体操作,请参见远程登录Master节点

  2. 执行如下命令启动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
    image.png

步骤二:创建Spark

以两张表格存储数据表source_pettarget_pet为例,表结构如下,其中name为主键。

name

owner

species

sex

birth

death

  1. 创建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 IDAccessKey Secret。获取方式请参见创建AccessKey

    access.key.secret

    instance.name

    表格存储实例名称。

    table.name

    表格存储的数据表名称。

    catalog

    表格存储数据表的Schema定义。

  2. 创建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;