使用 Apache Hadoop 作为 AWS SCT 的源 - AWS Schema Conversion Tool

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Apache Hadoop 作为 AWS SCT 的源

您可使用 AWS SCT 命令行界面(CLI)从 Apache Hadoop 迁移到 Amazon EMR。AWS SCT 在迁移期间将 Amazon S3 存储桶作为数据的临时存储空间。

AWS SCT 支持作为源的 Apache Hadoop 版本 2.2.0 及更高版本。此外,AWS SCT 还支持 Apache Hive 版本 0.13.0 及更高版本。

AWS SCT 支持作为目标的 Amazon EMR 版本 6.3.0 及更高版本。此外,AWS SCT 还支持作为目标的 Apache Hadoop 版本 2.6.0 及更高版本以及 Apache Hive 0.13.0 及更高版本。

使用 Apache Hadoop 为源的先决条件

使用 AWS SCT CLI 连接到 Apache Hadoop 需要满足以下先决条件。

  • 创建 Amazon S3 存储桶以在迁移期间存储数据。然后,您可以将数据复制到 Amazon EMR HDFS 或使用 Amazon S3 作为 Hadoop 工作负载的数据存储库。有关更多信息,请参阅《Amazon S3 用户指南》中的创建存储桶

  • 使用 AmazonS3FullAccess 策略创建 AWS Identity and Access Management (IAM) 角色。AWS SCT 使用此 IAM 角色访问 Amazon S3 存储桶。

  • 记下您的 AWS 私有密钥和 AWS 秘密访问密钥。有关 AWS 访问密钥的更多信息,请参阅《IAM 用户指南》中的管理访问密钥

  • 创建和配置目标 Amazon EMR 集群。有关的更多信息,请参阅《Amazon EMR 管理指南》中的 Amazon EMR 入门

  • 在源 Apache Hadoop 集群上安装 distcp 实用程序。此外,在目标 Amazon EMR 集群上安装 s3-dist-cp 实用程序。确保数据库用户拥有运行这些实用程序的权限。

  • 将源 Hadoop 集群中的 core-site.xml 文件配置为使用 s3a 协议。为此,将 fs.s3a.aws.credentials.provider 参数设置为以下值之一。

    • org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider

    • org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider

    • org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider

    • org.apache.hadoop.fs.s3a.auth.AssumedRoleCredentialProvider

    您可以将以下代码示例添加到 core-site.xml 文件中。

    <property> <name>fs.s3a.aws.credentials.provider</name> <value>org.apache.hadoop.fs.s3a.SimpleAWSCredentialsProvider</value> </property>

    前面的示例显示了前面选项列表中的四个选项之一。如果您未在 core-site.xml 文件中设置 fs.s3a.aws.credentials.provider 参数,则 AWS SCT 会自动选择提供程序。

使用 Hive 作为源的权限

Hive 源用户所需的权限如下:

  • READ 访问源数据文件夹和源 Amazon S3 存储桶

  • READ+WRITE 访问中间 Amazon S3 存储桶和目标 Amazon S3 存储桶

为了提高迁移速度,建议您运行 ACID 事务源表压缩。

Amazon EMR Hive 目标用户所需的权限如下:

  • READ 访问目标 Amazon S3 存储桶。

  • READ+WRITE 访问中间 Amazon S3 存储桶

  • READ+WRITE 访问目标 HDFS 文件夹

使用 HDFS 作为源的权限

HDFS 作为源所需的权限如下:

  • EXECUTE 适用 NameNode

  • EXECUTE+READ 适用于迁移项目中包含的所有源文件夹和文件

  • READ+WRITE 适用于迁移到 Amazon S3 之前运行 Spark 作业和存储文件的 NameNode 中的 tmp 目录

在 HDFS 中,所有操作都需要遍历访问权限。遍历访问需要路径中所有现有组件的 EXECUTE 权限,但最终路径组件除外。例如,对于访问 /foo/bar/baz 的任何操作,您的用户都必须拥有 //foo/foo/barEXECUTE 权限。

以下代码示例演示如何授予源文件夹和文件 EXECUTE+READ 权限以及 tmp 目录的 READ+WRITE 权限。

hadoop fs –chmod –R 744 /user/hdfs-data hadoop fs –chmod –R 766 /tmp

使用 HDFS 作为目标的权限

将 Amazon EMR HDFS 作为目标所需的权限如下:

  • EXECUTE 用于目标 Amazon EMR 集群的 NameNode

  • READ+WRITE 用于迁移后存储数据的目标 HDFS 文件夹

连接到作为源的 Apache Hadoop

在 AWS SCT 1.0.670 或更高版本中,可以将 Apache Hadoop 作为源。您只能通过 AWS SCT 命令行界面(CLI)将 Hadoop 集群迁移到 Amazon EMR。在开始之前,请熟悉 AWS SCT 的命令行界面。有关更多信息,请参阅AWS SCT CLI 参考

在 AWS SCT CLI 中连接到 Apache Hadoop
  1. 创建新的 AWS SCT CLI 脚本或编辑现有场景模板。例如,您可以下载和编辑 HadoopMigrationTemplate.scts 模板。有关更多信息,请参阅获取 CLI 场景

  2. 配置 AWS SCT 应用程序设置,例如驱动程序位置和日志文件夹。

    下载所需的 JDBC 驱动程序并指定存储文件的位置。有关更多信息,请参阅下载所需的数据库驱动程序

    以下代码示例显示如何将路径添加到 Apache Hive 驱动程序。运行此代码示例后,AWS SCT 将日志文件存储在 c:\sct 文件夹中。

    SetGlobalSettings -save: 'true' -settings: '{ "hive_driver_file": "c:\\sct\\HiveJDBC42.jar", "log_folder": "c:\\sct", "console_log_folder": "c:\\sct" }' /

    你可以在 Windows 中使用此示例和以下示例。

  3. 创建新 AWS SCT 项目

    以下代码示例在 c:\sct 文件夹中创建 hadoop_emr 项目。

    CreateProject -name: 'hadoop_emr' -directory: 'c:\sct' /
  4. 将源 Hadoop 集群添加到项目中。

    使用 AddSourceCluster 命令连接到源 Hadoop 集群。请确保为以下必填参数提供值:namehostportuser。其他参数都是可选的。

    以下代码示例添加了源 Hadoop 集群。此示例将 HADOOP_SOURCE 设置为源集群的名称。使用此对象名称将 Hive 和 HDFS 服务添加到项目并创建映射规则。

    AddSourceCluster -name: 'HADOOP_SOURCE' -vendor: 'HADOOP' -host: 'hadoop_address' -port: '22' -user: 'hadoop_user' -password: 'hadoop_password' -useSSL: 'true' -privateKeyPath: 'c:\path\name.pem' -passPhrase: 'hadoop_passphrase' /

    在前面的示例中,将 hadoop_address 替换为 Hadoop 集群的 IP 地址。如果需要,请配置端口选项的值。接下来,将 hadoop_userhadoop_password 替换为 Hadoop 用户的名字和该用户的密码。在路径\名称中,输入源 Hadoop 集群的 PEM 文件的名称和路径。

  5. 保存 CLI 脚本。接下来,添加 Hive 和 HDFS 服务的连接信息。

连接到源 Hive 和 HDFS 服务

您可以使用 AWS SCT CLI 连接到源 Hive 和 HDFS 服务。要连接到 Apache Hive,请使用 Hive JDBC 驱动程序版本 2.3.4 或更高版本。有关更多信息,请参阅下载所需的数据库驱动程序

AWS SCT 通过 hadoop 集群用户连接到 Apache Hive。为此,请使用 AddSourceClusterHiveAddSourceClusterHDFS 命令。您可以使用以下方法之一。

  • 创建一个新的 SSH 隧道。

    对于 createTunnel,输入 true。对于 host,请输入源 Hive 或 HDFS 服务的内部 IP 地址。对于 port,请输入 Hive 或 HDFS 服务的服务端口。

    接下来,输入 userpassword 的 Hive 或 HDFS 凭证。有关 SSH 隧道的更多信息,请参阅《Amazon EMR 管理指南》中的使用本地端口转发设置到主节点的 SSH 隧道

  • 使用现有的 SSH 隧道。

    对于 host,输入 localhost。对于 port,从 SSH 隧道参数中输入本地端口。

  • 直接连接到 Hive 和 HDFS 服务。

    对于 host,请输入源 Hive 或 HDFS 服务的 IP 地址或主机名。对于 port,请输入 Hive 或 HDFS 服务的服务端口。接下来,输入 userpassword 的 Hive 或 HDFS 凭证。

在 AWS SCT CLI 中连接到 Hive 和 HDFS
  1. 打开包含源 Hadoop 集群连接信息的 CLI 脚本。确保使用您在上一步中定义的 Hadoop 集群的名称。

  2. 将源 Hive 服务添加到项目中。

    使用 AddSourceClusterHive 命令连接源 Hive 服务。请确保为以下必填参数提供值:userpasswordclusternameport。其他参数都是可选的。

    以下代码示例创建了一个用于 AWS SCT 与 Hive 服务配合使用的隧道。此源 Hive 服务与 AWS SCT 在同一台电脑上运行。此示例使用前一个示例中的 HADOOP_SOURCE 源集群。

    AddSourceClusterHive -cluster: 'HADOOP_SOURCE' -name: 'HIVE_SOURCE' -host: 'localhost' -port: '10005' -user: 'hive_user' -password: 'hive_password' -createTunnel: 'true' -localPort: '10005' -remoteHost: 'hive_remote_address' -remotePort: 'hive_port' /

    以下代码示例无需隧道即可连接到 Hive 服务。

    AddSourceClusterHive -cluster: 'HADOOP_SOURCE' -name: 'HIVE_SOURCE' -host: 'hive_address' -port: 'hive_port' -user: 'hive_user' -password: 'hive_password' /

    在前面的示例中,将 hive_userhive_password 替换为 Hive 用户名和该用户的密码。

    接下来,将 hive_addresshive_port 替换为源 Hadoop 集群的 NameNode IP 地址和端口。

    对于 hive_remote_address,您可以使用源 Hive 服务的默认值 127.0.0.1 或 NameNode IP 地址。

  3. 将源 HDFS 服务添加到项目中。

    使用 AddSourceClusterHDFS 命令连接源 HDFS 服务。请确保为以下必填参数提供值:userpasswordclusternameport。其他参数都是可选的。

    确保您的用户具有从源 HDFS 服务迁移数据所需的权限。有关更多信息,请参阅使用 Hive 作为源的权限

    以下代码示例创建了一个用于 AWS SCT 与 Apache HDFS 服务配合使用的隧道。此示例使用您之前创建的 HADOOP_SOURCE 源集群。

    AddSourceClusterHDFS -cluster: 'HADOOP_SOURCE' -name: 'HDFS_SOURCE' -host: 'localhost' -port: '9005' -user: 'hdfs_user' -password: 'hdfs_password' -createTunnel: 'true' -localPort: '9005' -remoteHost: 'hdfs_remote_address' -remotePort: 'hdfs_port' /

    以下代码无需隧道即可连接到 Apache HDFS 服务。

    AddSourceClusterHDFS -cluster: 'HADOOP_SOURCE' -name: 'HDFS_SOURCE' -host: 'hdfs_address' -port: 'hdfs_port' -user: 'hdfs_user' -password: 'hdfs_password' /

    在前面的示例中,将 hdfs_userhdfs_password 替换为 HDFS 用户的名称和该用户的密码。

    接下来,将 hdfs_addresshdfs_port 替换为源 Hadoop 集群的 NameNode IP 地址和端口。

    对于 hdfs_remote_address,您可以使用源 Hive 服务的默认值 127.0.0.1 或 NameNode IP 地址。

  4. 保存 CLI 脚本。接下来,添加目标 Amazon EMR 集群的连接信息以及迁移命令。

连接到作为目标的 Amazon EMR

您可以使用 AWS SCT CLI 连接到目标 Amazon EMR 集群。为此,您需要授权入站流量并使用 SSH。在本例中,AWS SCT 拥有使用 Amazon EMR 集群所需的所有权限。有关更多信息,请参阅《Amazon EMR 管理指南》中的 连接之前使用 SSH 连接到主节点

AWS SCT 通过 hadoop 集群用户连接到 Amazon EMR Hive。要连接 Amazon EMR Hive,请使用 Hive JDBC 驱动程序版本 2.6.2.1002 或更高版本。有关更多信息,请参阅下载所需的数据库驱动程序

在 AWS SCT CLI 中连接到 Amazon EMR
  1. 打开包含源 Hadoop 集群连接信息的 CLI 脚本。将目标 Amazon EMR 凭证添加到此文件中。

  2. 将目标 Amazon EMR 集群添加到项目中。

    以下代码示例添加了目标 Amazon EMR 集群。此示例将 HADOOP_TARGET 设置为目标集群的名称。使用此对象名称将 Hive 和 HDFS 服务以及 Amazon S3 存储桶文件夹添加到项目中,并创建映射规则。

    AddTargetCluster -name: 'HADOOP_TARGET' -vendor: 'AMAZON_EMR' -host: 'ec2-44-44-55-66.eu-west-1.EXAMPLE.amazonaws.com' -port: '22' -user: 'emr_user' -password: 'emr_password' -useSSL: 'true' -privateKeyPath: 'c:\path\name.pem' -passPhrase: '1234567890abcdef0!' -s3Name: 'S3_TARGET' -accessKey: 'AKIAIOSFODNN7EXAMPLE' -secretKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' -region: 'eu-west-1' -s3Path: 'doc-example-bucket/example-folder' /

    在前面的示例中,输入 AWS 资源名称和 Amazon EMR 连接信息。这包括您的 Amazon EMR 集群的 IP 地址、AWS 访问密钥、AWS 秘密访问密钥和 Amazon S3 存储桶。如果需要,请配置端口变量的值。接下来,将 emr_useremr_password 替换为 Amazon EMR 用户名和该用户的密码。在路径\名称中,输入目标 Amazon EMR 集群的 PEM 文件的名称和路径。有关更多信息,请参阅下载用于 EMR 集群访问的 PEM 文件

  3. 将目标 Amazon S3 存储桶添加到项目中。

    以下代码示例添加目标 Amazon S3 存储桶。此示例使用您之前创建的 HADOOP_TARGET 集群。

    AddTargetClusterS3 -cluster: 'HADOOP_TARGET' -Name: 'S3_TARGET' -accessKey: 'AKIAIOSFODNN7EXAMPLE' -secretKey: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' -region: 'eu-west-1' -s3Path: 'doc-example-bucket/example-folder' /

    在前面的示例中,输入您的 AWS 访问密钥、AWS 秘密访问密钥和 Amazon S3 存储桶。

  4. 将目标 Hive 服务添加到项目中。

    以下代码示例为 AWS SCT 创建了一个隧道,以便与目标 Hive 服务配合使用。此示例使用您之前创建的 HADOOP_TARGET 目标集群。

    AddTargetClusterHive -cluster: 'HADOOP_TARGET' -name: 'HIVE_TARGET' -host: 'localhost' -port: '10006' -user: 'hive_user' -password: 'hive_password' -createTunnel: 'true' -localPort: '10006' -remoteHost: 'hive_address' -remotePort: 'hive_port' /

    在前面的示例中,将 hive_userhive_password 替换为 Hive 用户名和该用户的密码。

    接下来,将 hive_address 替换为默认值 127.0.0.1 或目标 Hive 服务的 NameNode IP 地址。接下来,将 hive_port 替换为目标 Hive 服务的端口。

  5. 将目标 HDFS 服务添加到项目中。

    以下代码示例创建了一个用于 AWS SCT 与 Apache HDFS 服务配合使用的隧道。此示例使用您之前创建的 HADOOP_TARGET 目标集群。

    AddTargetClusterHDFS -cluster: 'HADOOP_TARGET' -name: 'HDFS_TARGET' -host: 'localhost' -port: '8025' -user: 'hdfs_user' -password: 'hdfs_password' -createTunnel: 'true' -localPort: '8025' -remoteHost: 'hdfs_address' -remotePort: 'hdfs_port' /

    在前面的示例中,将 hdfs_userhdfs_password 替换为 HDFS 用户的名称和该用户的密码。

    接下来,将 hdfs_addresshdfs_port 替换为目标 HDFS 服务的 NameNode 的私有 IP 地址和端口。

  6. 保存 CLI 脚本。接下来,添加映射规则和迁移命令。有关更多信息,请参阅将 Apache Hadoop 迁移到 Amazon EMR