亚马逊AWS官方博客

通过 Amazon SageMaker R 内核访问数据源

Original URL: https://aws.amazon.com/cn/blogs/machine-learning/accessing-data-sources-from-amazon-sagemaker-r-kernels/

 

Amazon SageMaker notebooks 现已开箱即用支持R,且无需在实例上手动安装R内核。此外,这些notebooks还预装了 reticulate库,由其为Amazon SageMaker Python SDK提供R接口,并允许您从R脚本当中调用Python模块。大家可以使用Amazon SageMaker R内核轻松访问多个数据源,运行机器学习(ML)模型。目前,所有提供Amazon SageMaker服务的区域都已默认提供R内核。

R 是一种专为统计分析构建而成的编程语言,目前在数据科学界具有极高人气。在本文中,我们将一同了解如何使用Java数据库连接(JDBC)从Amazon SageMaker R内核接入以下数据源:

关于通过R使用Amazon SageMaker功能的更多详细信息,请参阅面向Amazon SageMaker的R用户指南

解决方案概述

构建这套解决方案,我们首先需要创建一个包含公共与私有子网的VPC,借此保证隔离网络内的各不同资源与数据源能够实现安全通信。接下来,我们使用必要配置在自定义VPC与notebook实例中创建数据源,并使用R访问各数据源。

为了确保数据源不暴露在公开互联网之下,我们需要保证各数据源完全驻留在VPC的私有子网当中。这里我们需要创建以下资源:

使用AWS Systems Manager Session Manager 连接私有子网内的Amazon EMR集群,而后创建Hive表。

要在Amazon SageMaker中使用R内核运行代码,大家还需要创建一个Amazon SageMaker notebook。请注意下载用于数据源的JDBC驱动程序。为包含R软件包安装脚本的notebook配置生命周期,并在创建及启动时将该生命周期配置附加至notebook以保证安装顺利完成。

最后,我们可以使用AWS管理控制台导航至notebook,使用R内核运行代码并访问来自各个数据源。您可以通过GitHub repo获取这套完整的解决方案。

解决方案架构

以下架构图展示了如何与各个数据源建立起连接,使用Amazon SageMaker通过R内核运行代码。大家也可以使用Amazon Redshift查询编辑器或者Amazon Athena查询编辑器以创建数据资源。您还需要使用 AWS Systems Manager中的会话管理器(Session Manager)通过SSH接入Amazo nEMR集群以创建Hive资源。

启动AWS CloudFormation模板

要自动创建资源,您可以运行一套AWS CloudFormation模板。该模板将帮助您指定需要自动创建的Amazon EMR集群、Amazon Redshift集群或者兼容MySQL的Amazon Aurora集群,而不必手动执行各个步骤。只需要几分钟,全部资源即可创建完毕。

  • 选择以下链接即可启动CloudFormation栈。该栈将创建实施本次解决方案的全部必要AWS资源:
  • Create stack页面上, 选择 Next
  • 输入栈名称。
  • 您可以对以下栈细节的默认值做出调整:
栈细节 默认值
选择B类网络地址作为VPC IP地址 (10.xxx.0.0/16) 0
SageMaker Jupyter Notebook实例类型 ml.t2.medium
是否自动创建EMR 集群? “Yes”
是否自动创建Redshift 集群? “Yes”
是否自动创建Aurora MySQL DB集群? “Yes”
  • 选择 Next
  • Configure stack options页面上, 选择 Next
  • 选择 I acknowledge that AWS CloudFormation might create IAM resources(我确认AWS CloudFormation可以创建IAM资源)。
  • 选择 Create stack

现在,您可以看到正在创建的栈,详见以下截屏。

在栈创建完毕之后,状态将显示为 CREATE_COMPLETE

  • Outputs选项卡中,记录各键及其对应的值。

在本文中,我们将陆续使用到以下键:

  • AuroraClusterDBName – Aurora集群数据库名称
  • AuroraClusterEndpointWithPort – Aurora集群端点地址与端口号
  • AuroraClusterSecret – Aurora集群凭证secret ARN
  • EMRClusterDNSAddress – EMR集群DNS名称
  • EMRMasterInstanceId – EMR集群主实例ID
  • PrivateSubnets – 私有子网
  • PublicSubnets – 公共子网
  • RedshiftClusterDBName – Amazon Redshift集群数据库名称
  • RedshiftClusterEndpointWithPort – Amazon Redshift集群端点地址与端口号
  • RedshiftClusterSecret – Amazon Redshift集群凭证secret ARN
  • SageMakerNotebookName – Amazon SageMaker notebook实例名称
  • SageMakerRS3BucketName – Amazon SageMaker S3数据存储桶
  • VPCandCIDR – VPC ID与CIDR地址块

使用必要的R软件包与JAR文件创建notebook实例

JDBC为面向Java编程语言的应用程序编程接口(API),负责定义对数据库的具体访问方式。RJDBC则是R中的一款软件包,可帮助大家使用JDBC接口接入各类数据源。CloudFormation模板创建的notebook实例,将保证为Hive、Presto、Amazon Athena、Amazon Redshift以及MySQL提供必要的JAR文件,由此建立起JDBC连接。

  • 在Amazon SageMaker控制台下的Notebook部分,选择 Notebook instances
  • 搜索与您之前记录的 SageMakerNotebookName键相匹配的notebook。
  • 选择该notebook实例。
  • 点击“Actions”之下的“Open Jupyter”,并定位至“jdbc”目录。

CloudFormation模板将在“jdbc”目录当中下载与HivePrestoAthenaAmazon Redshift以及 Amazon Aurora MySQL相兼容的JAR文件。

通过生命周期配置,我们可以在notebook实例上安装软件包或示例notebook,为其配置网络与安全性,或者使用Shell脚本进行自定义其他配置。生命周期配置负责在我们创建notebook实例或者启动此notebook时,提供需要配套运行的shell脚本。

  • Lifecycle configuration部分,选择View script以查看负责在Amazon SageMaker中设置R内核以通过R将JDBC连接指向数据源的生命周期配置脚本。

此生命周期配置,将在Amazon SageMaker notebook的Anaconda环境中安装RJDBC软件包与依赖项

接入Hive与Presto

Amazon EMR是一套行业领先的云大数据平台,可使用各类开源工具(例如Apache Spark, Apache Hive, Apache HBaseApache FlinkApache Hudi以及Presto)处理大量数据。

大家可以使用System Manager中的会话管理器(Session Manager)功能从AWS控制台登录至EMR主节点,由此在Hive当中创建测试表。通过Systems Manager,您可以查看并控制AWS上的基础设施。Systems Manager还提供统一的用户界面,供您统一查看来自多项AWS服务的管理数据,同时跨多种AWS资源自动执行管理任务。会话管理器是一项全托管Systems Manager功能,可帮助您通过基于浏览器的一键式交互shell或AWS命令行界面(AWS CLI),对Amazon Elastic Compute Cloud (Amazon EC2)实例、本地实例以及虚拟机加以管理。

您可以在此步骤中使用在AWS CloudFormation Outputs选项卡当中提供的以下值:

  • EMRClusterDNSAddress – EMR集群DNS名称
  • EMRMasterInstanceId – EMR集群主实例ID
  • SageMakerNotebookName – Amazon SageMaker notebook实例名称

 

  • Systems Manager控制台Instances & Nodes之下, 选择 Session Manager
  • 选择 Start Session
  •  使用EMRMasterInstanceId键的值作为实例IDSSHEMR主节点。

这项操作将启动基于浏览器的shell。

  • 运行以下SSH命令:
# change user to hadoop 
whoami
sudo su - hadoop
  • 登录到EMR主节点上,在Hive中创建一份测试表:
# Run on the EMR master node to create a table called students in Hive
hive -e "CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2));"

# Run on the EMR master node to insert data to students created above
hive -e "INSERT INTO TABLE students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);"

# Verify 
hive -e "SELECT * from students;"
exit
exit

以下截屏所示,为基于浏览器的shell中的视图示例。

  • 退出shell之后,关闭浏览器。

要使用Amazon SageMaker R内核对Amazon EMR中的数据进行查询,请打开之前由CloudFormation模板创建完成的notebook。

  • Amazon SageMaker控制台Notebook之下,选择Notebook instances
  • 找到由 SageMakerNotebookName键的值所指定的notebook。
  • 选择 Open Jupyter
  • 要演示Amazon SageMaker R内核中连接EMR, 选择 Upload并上传ipynb notebook。
    • 或者在New下拉菜单中, 选择 R以打开一个新notebook。
    • 输入“hive_connect.ipynb”中的代码,将 emr_dns值替换为 EMRClusterDNSAddress键提供的值:
  • 运行该notebook中的所有单元,使用Amazon SageMaker R控制台接入Amazon EMR上的Hive。

我们可以通过类似的步骤接入Presto:

  • Amazon SageMaker控制台上,打开我们之前创建的notebook。
  • 选择 Open Jupyter
  • 选择 Upload以上传ipynb notebook。
    • 或者,可以在New下拉菜单中选择R以打开一个新notebook。
    • 输入“presto_connect.ipynb”中的代码,将 emr_dns值替换为 EMRClusterDNSAddress键提供的值:
  • 运行该notebook中的所有单元,使用Amazon SageMaker R控制台接入Amazon EMR上的PrestoDB。

接入 Amazon Athena

Amazon Athena是一项交互式查询服务,可使用标准SQL轻松分析Amazon Simple Storage Service (Amazon S3)中的数据。Amazon Athena还具备无服务器属性,大家无需管理任何基础设施,只需要为实际运行的查询付费。要使用RJDBC从Amazon SageMaker R内核接入Amazon Athena,我们需要使用Amazon Athena JDBC驱动程序。此驱动程序已经通过生命周期配置脚本被下载至notebook实例当中。

大家还需要在Amazon S3中设置查询结果位置。关于更多详细信息,请参阅如何使用查询结果、输出文件与查询历史

  • Amazon Athena控制台上,选择 Get Started
  • 选择 Set up a query result location in Amazon S3(在Amazon S3中设置查询结果位置)
  • Query result location部分,输入由 SageMakerRS3BucketName键的值指定的Amazon S3位置。
  • 或者,您也可以直接添加前缀,例如 results
  • 选择 Save
  • 使用Amazon S3中的示例数据在Athena中创建数据库或schema及其对应表
  • 与接入Hive及Presto的方式类似,大家可以上传 ipynb notebook以通过R内核在Athena与Amazon SageMaker之间建立一条连接。
    • 或者,您可以打开一个新的notebook并输入“athena_connect.ipynb”中的代码,并将其中 s3_bucket的值替换为 SageMakerRS3BucketName键的值:
  • 运行notebook中的所有单元,借此由Amazon SageMaker R控制台接入至Amazon Athena。

接入Amazon Redshift

Amazon Redshift是一款速度表现出色的全托管云数据仓库,凭借标准SQL与您的现有商务智能(BI)工具实现简单且经济高效的数据分析能力。Redshift可以对TB乃至PB级别的大规模结构化数据执行查询,对复杂查询实现优化,可在高性能存储之上实现列式存储,并支持大规模并发查询执行功能。要使用RJDBC由Amazon SageMaker R内核接入Amazon Redshift,我们可以使用Amazon Redshift JDBC驱动程序,此驱动程序已通过生命周期配置脚本被下载至notebook实例当中。

您需要从AWS CloudFormation Outputs选项卡中获取以下键及其对应值:

  • RedshiftClusterDBName – Amazon Redshift集群数据库名称
  • RedshiftClusterEndpointWithPort – Amazon Redshift集群端点地址与端口号
  • RedshiftClusterSecret – Amazon Redshift集群凭证secret ARN

CloudFormation模板会在AWS Secrets Manager当中为Amazon Redshift集群创建一项secret,由此保护我们用于访问应用程序、服务以及各项IT资源的secrets。Secrets Manager还允许用户轻松轮替、管理并检索数据库凭证、API密钥乃至整个生命周期中的其他secrets。

  • AWS Secrets Manager控制台上,选择 Secrets
  • 选择由 RedshiftClusterSecret 键值表示的secret。
  • Secret value部分, 选择 Retrieve secret value以获取Amazon Redshift集群的用户名与密码。
  • Amazon Redshift控制台上,选择 Editor (在本质上为 Amazon Redshift查询编辑器)。
  • Database name部分,输入redshiftdb
  • Database password部分,输入您的密码。
  • 选择 Connect to database
  • 运行以下SQL语句,创建一份表并插入几条记录:
CREATE TABLE public.students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2));
INSERT INTO public.students VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32);
  • Amazon SageMaker控制台上,打开您的notebook。
  • 选择 Open Jupyter
  • 上传 ipynb notebook。
    • 或者,打一个新的notebook并输入“redshift_connect.ipynb”中的代码,注意替换其中RedshiftClusterEndpointWithPortRedshiftClusterDBName以及 RedshiftClusterSecret的值:
  • 运行notebook中的所有单元,由Amazon SageMaker R控制台接入Amazon Redshift。

接入MySQL兼容型Amazon Aurora

Amazon Aurora是一套专门面向云环境构建的MySQL兼容型关系数据库,能够将传统企业级数据库的性能与可用性,同开源数据库的便捷性与成本效益加以结合。要使用RJDBC由Amazon SageMaker R内核接入Amazon Aurora,我们需要用到MariaDB JDBC驱动程序,此驱动程序已通过生命周期配置脚本被下载至notebook实例当中。

大家需要使用AWS CloudFormation Outputs选项卡中提供的以下键及其对应值:

  • AuroraClusterDBName – Aurora集群数据库名称
  • AuroraClusterEndpointWithPort – Aurora集群端点地址及其端口号
  • AuroraClusterSecret – Aurora集群凭证secret ARN

CloudFormation模板将在Secrets Manager中为Aurora集群创建secret。

  • AWS Secrets Manager控制台上,找到由 AuroraClusterSecret键值表示的secret。
  • Secret value部分, 选择 Retrieve secret value以获取Aurora集群的用户名与密码。

要接入该集群,请遵循与其他服务类似的操作步骤。

  • Amazon SageMaker控制台上,打开您的notebook。
  • 选择 Open Jupyter
  • 上传 ipynb notebook。
    1. 或者,您可以打一个新的notebook并输入“aurora_connect.ipynb”中的代码,请注意替换AuroraClusterEndpointWithPort, AuroraClusterDBName以及 AuroraClusterSecret的值:
  • 运行notebook中的所有单元,以在Amazon SageMaker R控制台上接入Amazon Aurora。

总结

在本文中,我们演示了如何在您的运行环境中接入各类数据源,包括Amazon EMR上的Hive与PrestoDB、Amazon Athena、Amazon Redshift以及MySQL兼容型Amazon Aurora集群等,并借此经由Amazon SageMaker实现分析、剖析并运行统计计算。您也可以通过JDBC将同一方法扩展到其他数据源。

 

本篇作者

Kunal Ghosh

AWS公司解决方案架构师。他热衷于立足云端构建高效解决方案,特别是与分析、人工智能、数据科学以及机器学习相关的解决方案。在业余时间,除了陪伴家人之外,他还喜欢读书、游泳、骑自行车、看电影和享受美食。

Gagan Brahmi

Amazon Web Services公司大数据与分析专业解决方案架构师。Gagan在信息技术领域拥有超过15年的从业经历,帮助客户在AWS上构建具备高可扩展性、高性能与高安全性的云解决方案。