亚马逊AWS官方博客

Amazon SageMaker Studio集成EMR打通大数据与机器学习开发平台

1. 前言

本文讲详细介绍SageMaker Studio 集成 EMR的原理,并带您一步步搭建Amazon SageMaker Studio集成EMR打通大数据与机器学习的开发平台。使用SageMaker Studio集成EMR一站式开发平台的数据科学家、机器学习工程师可以使用统一的IDE环境完成大规模的数据分析、数据准备、模型训练和部署。

2. SageMaker Studio集成EMR原理分析

2.1 SageMaker 控制面原理分析

Amazon SageMaker 可以分为控制面运行时。其中控制面用于使用SageMaker的用户对SageMaker环境进行配置,SageMaker控制面包括SageMaker Domain、User profile、Studio 、Users、IAM Role、网络配置和组织。

  • SageMaker Domain

SageMaker Domain是用户操作SageMaker控制面的一组资源的集合,关联资源包括Amazon EFS、User profile、Studio 、Users、IAM Role、网络配置;Domain是基于特定配置的机器学习的基础环境,一个AWS 账户下的一个Region只能有一个Domain存在(目前Sagemaker最新已经支持一个Region创建多个Domain)。

  • SageMaker User profile

User profile与Domain是多对一的关系,一个Domain下可用配置多个User。SageMaker的用户使用User作为Sagemaker Studio的使用者,一个User profile包含用户可以使用Studio操作AWS资源的权限、也代表用户使用Studio运行应用程序,相当于Sagemaker Studio中的租户。各个User拥有和使用的资源是互相隔离的。

  • SageMaker Studio

SageMaker Studio是AWS云上机器学习的IDE,它集成Sagemaker几乎所有的功能特性,为开发者提供了可视化一站式的开发环境。如下图所示。一个User对应一个Studio运行环境,这个环境包括唯一一个JupyterServer App和多个 KernelGateway App。JupyterServer App运行Studio的管理客户端、KernelGateway App对应用户使用Studio完成SageMaker任务启用的Sagemaker Image Container。

  • SageMaker Notebook

这里提到的SageMaker Notebook与SageMaker Studio中运行的Notebook不同,它是独立于SageMaker Domain的资源,在功能上它是SageMaker Studio的一个子集。所以推荐使用SageMaker Studio来开发您的机器学习项目。

2.2  SageMaker控制面组件间的关系

如下图是SageMaker Domain下各个资源之间的关系

  • 控制面Studio运行Jupyter应用时,启用的EC2处于Sagemaker托管服务的AWS 账号中而非客户自己的账户中,所以这些EC2我们在客户自己的账户中是看不到。
  • Studio或者Notebook使用的EC2可以位于客户指定的VPC中,也可以处于SageMaker托管服务专有的AWS账户中,这与我们配置Domain选择的VPC模式有关
  • Studio使用的Amazon EFS位于客户指定的VPC中。

2.3 SageMaker  控制面配置分析

SageMaker Domain的网络模式决定了在用户使用Studio时,如何与AWS 内部服务和Internet通讯。在创建Sagemaker Domain的网络配置有两个模式可供选择,如下图所示分别为Public Internet Only模式和VPC only。选择的客户资源包括 VPC、VPC下的子网和安全组。这里选择客户的VPC的用作为Studio使用的Amazon EFS提供VPC网络。接下来我们着重分析下这两种模式的原理与应用场景。

2.3.1 Public Internet Only模式

如下图所示为通过API获取的SageMaker Domain的详细信息:

{
    "HomeEfsFileSystemId": "fs-085a81cce274fd282",
    "AppNetworkAccessType": "PublicInternetOnly",
    "DomainId": "DomainId",
    "VpcId": "vpc-0e24b7370a024c9e1",
    "DomainName": "default-1653534318780",
    "DefaultUserSettings": {
        "ExecutionRole": "arn:aws:iam::{AccountId}:role/service-role/AmazonSageMaker-ExecutionRole-20220217T224589",
        "SharingSettings": {
            "NotebookOutputOption": "Allowed",
            "S3OutputPath": "s3://sagemaker-studio-{AcconutId}-6zf42r1x1hv/sharing"
        }
    },
    "SubnetIds": [
        "subnet-02c217653fbdbc9a3"
    ],
    "DomainArn": "arn:aws:sagemaker:us-east-1:{AccountId}:domain/d-afzfhih3tkjn",
    "Url": "https://DomainId.studio.us-east-1.sagemaker.aws",
    "AuthMode": "IAM"
}

如下图所示为Public Internet Only模式下SageMaker Studio访问AWS内部服务和互联网的架构。

如下对如上的架构图做如下说明:

  1. SageMaker Service Managed VPC :该VPC的Owner是SageMaker服务,在Public Internet Only模式下,SageMaker Studio及其在该Studio上启动的Notebook都位于该VPC中。
  2. Customer Account VPC:该VPC的Owner是客户自己的AWS Account,在Public Internet Only模式下,这个VPC是用来放置SageMaker Studio共享的Amazon EFS。
  3. SageMaker Studio要访问AWS服务如S3等,是通过Internet访问。
  4. SageMaker Studio访问共享的EFS是通过ENI来完成的,在创建SageMaker Domain时就已经预置了。

SageMaker Service Managed并共享给Customer Account的资源包括:SageMaker Service Managed VPC、Subnet 和IGW。我们在Customer AWS Account中可以查看这些资源和资源上的OwnerID。

  • Customer Account VPC

从下图可以看出,这里VPC的Owner是Customer AWS Account。

  • SageMaker Service Managed VPC

  • Sagemaker Service Managed VPC关联的Subnet

  • Sagemaker Service Managed VPC关联的IGW:提供Sagemaker Domain下资源如Studio互联网访问能力

  • Public Internet Only模式Amazon EFS位于选定的 Customer VPC下对应的子网中

  • SageMaker Studio ENI(JupyterServer APP所在的EC2

该ENI是SageMaker Studio用于与SageMaker Domain中的外部资源与EFS进行通讯的网络接口,在Public Internet Only位于Customer VPC中。

  • Public Internet Only模式下SageMaker Studio与外部服务资源交互的方式如下图所示

2.3.2 VPC only模式

如下图所示为通过API获取的SageMaker Domain的详细信息:

{
    "HomeEfsFileSystemId": "fs-02a590156bc88b40d",
    "AppNetworkAccessType": "VpcOnly",
    "DomainId": "DomainId",
    "VpcId": "vpc-0b4cd1e283a3474c0",
    "DomainName": "StudioDomain",
    "DefaultUserSettings": {
        "SecurityGroups": [
            "sg-0dacf65c996fd4b23"
        ],
        "ExecutionRole": "arn:aws:iam::{AccountId}:role/SagemakerEMRNoAuthProductWi-SageMakerExecutionRole-1MJZQFEZF84A2"
    },
    "SubnetIds": [
        "subnet-044a93fee6745ded6"
    ],
    "DomainArn": "arn:aws:sagemaker:ap-northeast-1:{AccountId}:domain/d-pnflgo2aifdh",
    "Url": "https://DomainId.studio.ap-northeast-1.sagemaker.aws",
    "AuthMode": "IAM"
}

如下图所示为VPC Only模式下SageMaker Studio访问AWS内部服务和互联网的架构。

在VPC Only模式下,SageMaker控制面的资源SageMaker Domain、Sagemaker Domain User、SageMaker Studio、包括在Studio中启动的Jupyter Notebook都位于Customer VPC的子网中。Studio中的计算资源是Owner 是Sagemaker Service AWS Account,而非客户自己的AWS Account,所以Studio中的资源在客户的AWS Account中是无法看到的。

  1. SageMaker Service Managed VPC :该模式下没有SageMaker Service Managed VPC。
  2. Customer Account VPC:该VPC的Owner是客户自己的AWS Account,在Only模式下Studio的资源都在Customer Account VPC下的子网中。
  3. SageMaker Studio中的资源要访问AWS服务如S3等,是通过 VPC Endpoint走AWS内部网络。
  • Customer Account VPC

SageMaker Domain下的资源,以及SageMaker Studio共享的文件系统EFS都放在这个VPC中。

  • Customer Account VPC 下使用的子网

  • VPC Only模式Amazon EFS位于选定的 Customer VPC下对应的子网中

如下图可以看到,这里使用的子网与Customer Account VPC 使用的子网是一样。

  • SecurityGroups/sg-0dacf65c996fd4b23 (安全组)

用来控制SageMaker Studio中Notebook资源访问外部资源。

  • SageMaker Studio访问AWS服务的VPC Endpoint

  • SageMaker Studio ENI (JupyterServer APP所在的EC2

注意在SageMaker Domain中每个User会分配一个独立的Sagemaker Studio的环境,这个Studio与其他User的Studio是隔离的,并且在SageMaker Domain选择 VPC only的模式下,该Studio通过在客户的VPC中创建一个ENI,并将这个ENI与SageMaker所运行的实例关联的方式来打通Studio所管理的资源与Internet或者AWS内部S3、CloudWatch等资源进行网络连通。在VPC only模式下Sagemaker Studio所管理的资源位于一个私有网络,相比暴露在公共互联网中,这种方式能提供更好的安全性。但如果需要访问Internet或者AWS内部的服务,则需要考虑网络的配置和安全组的设置。比如需要访问Internet,建议通过NAT Gateway。访问AWS其他的服务如S3,可以配合VPC Endpoint。

如下图我们看下这个ENI的详细信息:

  1. Owner:该ENI属于Customer Account
  2. Instance owner:该ENI关联的Instance属于 SageMaker托管服务Account
  3. Security groups:该ENI关联的Instance 属于SageMaker托管服务 Account
  4. Description:ENI managed by SageMaker for Studio Domain(d-pnflgo2aifdh)
  5. Tag:从Tag可以看出,这个是我们在studio中启动一个kernel是创建的。

  • VPC Only模式下SageMaker Studio Notebook访问外部资源的方式如下图所示

2.4 SageMaker Studio与EMR原理分析

2.4.1 SageMaker Studio集成EMR架构说明

如下图所示为SageMaker Studio集成EMR的架构图,这一架构的最终目的是机器学习的开发者使用SageMaker Studio IDE就可以在不切换工具与环境的情况下完成机器学习项目的数据处理和模型训练和部署。开发者可以在SageMaker Studio Notebook中查看、创建、删除EMR集群,使用EMR集群来进行数据的预处理。

要搭建上图所示的架构需要满足如下的条件:

  • SageMaker Studio要操作EMR,SageMaker Domain必须选择VPC only模式

这是因为SageMaker Domain VPC only模式 SageMaker Studio中使用的Notebook位于客户自己的VPC中,这样才能与EMR所在VPC进行打通。而SageMaker Domain Public Internet Only模式, SageMaker Studio中的Notebook位于 SageMaker Service Managed Account的VPC中,这个VPC对客户来说不可见,我们不能将该改VPC与EMR所在的网络进行打通。

  • SageMaker Studio要查看Service Catalog中的模板,查看EMR集群需要调用这些服务的API,所以SageMaker Studio所在的网络需要通过NAT Gateway与Internet进行打通。
  • SageMaker Studio Notebook与EMR都有相应的安全组,需要让SageMaker Studio与EMR的安全组放开互相访问。

2.4.2 SageMaker Studio集成EMR使用流程

如下图所示是SageMaker Studio集成EMR的操作与开发流程。

2.4.3 SageMaker Studio与EMR 网络连通分析

SageMaker Studio集成EMR的网络打通分为两个部分:

  1. SageMaker Studio 连通部署在EMR上的资源如Spark。
  2. SageMaker Studio可以调用EMR Service API 和 ServiceCatalog API分别进行EMR集群和ServiceCatalog 的增删改查。
2.4.3.1 SageMaker Studio 连通部署在EMR上的资源如Spark

在2.4.1所示的架构图中,EMR资源与SageMaker Studio资源位于同一个子网中,子网级别的网络是通的,如下图所示:

  • SageMaker Studio和EMR的子网信息(删掉非关键信息)

SageMaker Studio所在的子网

{
    "AppNetworkAccessType": "VpcOnly",
    "DomainId": "d-pnflgo2aifdh",
    "VpcId": "vpc-0b4cd1e283a3474c0",
    "DefaultUserSettings": {
        "SecurityGroups": [
            "sg-0dacf65c996fd4b23"
        ],
        "ExecutionRole": "arn:aws:iam::{AccountID}:role/SagemakerEMRNoAuthProductWi-SageMakerExecutionRole-1MJZQFEZF84A2"
    },
    "SubnetIds": [
        "subnet-044a93fee6745ded6"
    ]
}
  • EMR 所在的子网

  • SageMaker Studio和EMR安全组信息

SageMaker Studio Security group:放开所以出站的流量

EMR Security group:Security groups for Master: 如下图所示,允许SageMaker Studio Security group访问EMR

2.4.3.2 SageMaker Studio 调用 AWS Service API的网络

SageMaker Studio通过公网访问AWS Service API来调用 AWS Service API,一是Studio所在的子网添加NAT Gateway的路由,其次SageMaker Studio的安全组放行所以的出站流量。

2.4.4 SageMaker Studio集成EMR权限说明

  • SageMaker Studio执行角色需要具备操作EMR的权限
  • Service Catalog 需要有创建EMR的权限

详细权限说明参照下面章节中的3.2.2 创建执行IAM Role和3.4 创建AWS Service Catalog中所需的Constraints中的说明。

3. SageMaker Studio集成EMR实验操作

3.1 前置条件

  • 已创建VPC,VPC内包含至少1个公有子网以及1个私有子网
  • 私有子网的路由表包含出公网的路由,能通过NAT Gateway访问到公网
  • 已创建EMR的默认IAM Role

3.1.1 VPC部分

创建VPC请参考:

https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC

创建NAT Gateway请参考文档:

https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#nat-gateway-working-with
NAT Gateway应创建在一个公有子网内。创建好后,目标私有子网路由应类似于:

3.1.2 EMR 默认IAM Role 部分

若是之前从未在账号下创建过EMR 集群,则不会有默认EMR的IAM Role:EMR_EC2_DefaultRole 与EMR_DefaultRole。

这种情况下有2个办法:

3.2 创建SageMaker Studio环境

3.2.1. Launch SageMaker Studio

点击“Set up SageMaker Domain”:

使用Standard 模式启动,网络配置选择VPC only,必须选私网地址(且私网中必须要有NAT能连接到外网)

其中安全组必须有一条允许所有来自自身流量的规则,例如:

3.2.2 创建执行IAM Role

创建一个包含AmazonSageMakerFullAccess 权限的Role。这个IAM Role会在后续被SageMaker用户所使用。在IAM界面创建一个Role,信任实体选择SageMaker:

Permission为AmazonSageMakerFullAccess:

最后在step3 命一个任意角色名即可:

3.2.3. 创建SageMaker Studio User

Studio创建完毕后,新建用户,此用户为登陆到SageMaker Studio的用户:

指定Default execution role为前面创建的SageMaker执行Role,这个IAM Role即为当前用户所用的Role。:

剩下的全部“next ”即可。

3.2.4. 进入Studio

在user 创建完毕后,点击Launch app =》 Studio 进入Studio界面:

界面如下:

3.3 创建EMR 启动的模板

在通过SageMaker Studio管理、创建EMR集群之前,需要在AWS Service Catalog中定义一个EMR启动模板。这个EMR启动模板可以定义启动EMR时的配置,例如节点数、节点类型、安全组、启动脚本等等。

首先进入Service Catalog的页面,并进入到Portfolio。

3.3.1.   创建Portfolio


3.3.2 创建EMR启动CloudFormation 模板

Step1:保存下面的示例模板,请务必修改Ec2SubnetId 内容,与SageMaker Studio 所处的VPC子网为同一个。

AWSTemplateFormatVersion: 2010-09-09
 
Parameters:
  ClusterName:
    Type: "String"
    Default:  "Example_Two_Node_Cluster"
  EmrRelease:
    Type: "String"
    Default: "emr-6.3.0"
    AllowedValues:
    - "emr-6.3.0"
    - "emr-5.33.1"
  MasterInstanceType:
    Type: "String"
    Description: "Instance type of the  EMR master node."
    Default: "m5.xlarge"
    AllowedValues:
    - "m5.xlarge"
    - "m5.2xlarge"
  CoreInstanceType:
    Type: "String"
    Description: "Instance type of the  EMR core node."
    Default: "m5.xlarge"
    AllowedValues:
    - "m5.xlarge"
    - "m5.2xlarge"
    - "m5.4xlarge"
  CoreInstanceCount:
    Type: "String"
    Description: "Number of core  instances in the EMR cluster"
    Default: 2
    AllowedValues:
    - 2
    - 5
    - 10
  SageMakerProjectName:
    Type: "String"
    Description: "Name of the  project"
  SageMakerProjectId:
    Type: "String"
    Description: "Service generated Id  of the project"
 
Resources:
  EmrCluster:
    Type: AWS::EMR::Cluster
    Properties:
      Applications:
      - Name: Spark
      - Name: Livy
      - Name: JupyterEnterpriseGateway
      - Name: Hive
      BootstrapActions:
      - Name: Dummy bootstrap action
        ScriptBootstrapAction:
          Args:
          - dummy
          - parameter
          Path: s3://xxxxx/emr_scripts/installpylibs.sh
      Configurations:
      - Classification: livy-conf
        ConfigurationProperties:
          livy.server.session.timeout: 2h
      EbsRootVolumeSize: '10’
      Name: !Ref ClusterName
      JobFlowRole: EMR_EC2_DefaultRole
      ServiceRole: EMR_DefaultRole
      ReleaseLabel: !Ref EmrRelease
      VisibleToAllUsers: true
      LogUri: 
        Fn::Sub:  's3://aws-logs-${AWS::AccountId}-${AWS::Region}/elasticmapreduce/'
      Instances:
        TerminationProtected: false
        Ec2SubnetId: 'subnet-01bfb19b3bee01da6'
        MasterInstanceGroup:
          InstanceCount: 1
          InstanceType: !Ref  MasterInstanceType
        CoreInstanceGroup:
          InstanceCount: !Ref  CoreInstanceCount
          InstanceType: !Ref CoreInstanceType
          Market: ON_DEMAND
          Name: Core
Outputs:
  ClusterId:
    Value:
      Ref: EmrCluster
    Description: The ID of the EMR Cluster

其中BootstrapActions是指定EMR集群启动时运行的脚本,会在启动的每个节点上均会运行这个脚本。在这个例子里,此脚本会在EMR集群的所有节点里运行,安装一些依赖。这个脚本必须放在S3,例如保存为 s3://xxxxx/emr_scripts/installpylibs.sh。脚本内容为:

#!/bin/bash
sudo  yum install -y python3-devel
sudo  yum install -y libtiff-devel libjpeg-devel libzip-devel freetype-devel  lcms2-devel libwebp-devel tcl-devel tk-devel
 
#install  python modules
sudo  /usr/bin/python3 -m pip install -U cython==0.29.24
sudo  /usr/bin/python3 -m pip install -U setuptools==58.1.0
sudo  /usr/bin/python3 -m pip install -U numpy==1.21.2
sudo  /usr/bin/python3 -m pip install -U matplotlib==3.4.3
sudo  /usr/bin/python3 -m pip install -U requests==2.26.0
sudo  /usr/bin/python3 -m pip install -U boto3==1.18.63
sudo  /usr/bin/python3 -m pip install -U pandas==1.2.5

Step2在AWS Service Catalog中创建一个新的product:

Step3上传保存后的template后,点击create:

Step4创建product完毕后,将Product 绑定到前面创建的Portfolio中:

Step4最后在创建的这个Product中,增加一个Tag:

Tag 内容为:sagemaker:studio-visibility:emr       true:

3.4 创建AWS Service Catalog中所需的Constraints

Constraint 表示的是launch 一个 product 时,使用的权限。首先创建一个IAM Role,指定信任实体为Service Catalog:

绑定AmazonElasticMapReduceFullAccess, AWSCloudFormationReadOnlyAccess这2个policy,并创建这个role:

回到Service Catalog界面,为Portfolios绑定Constraints:

选择product,以及Constraint Type为Launch:

并指定前面创建的constraint role,并创建:

为Portfolios添加在步骤3.1.2里创建的role:

3.5 在SageMaker Studio中启动EMR集群

3.5.1. 启动集群

回到SageMaker Studio 界面,在最下面的Resource标签栏内。选中“Clusters”,并点击“Create cluster”,即可看到我们在Service Catalog中创建的emr集群启动模板:

选择模板并启动:

3.5.2 赋予SageMaker查看、管理EMR的权限

在IAM Policy中,创建以下策略,命名为AllowSagemakerProjectManagement(注意替换里面的region以及账户id):

{
    "Version":  "2012-10-17",
    "Statement": [
        {
            "Sid":  "AllowPresignedUrl",
            "Effect":  "Allow",
            "Action": [
                "elasticmapreduce:DescribeCluster",
                 "elasticmapreduce:ListInstanceGroups",
                 "elasticmapreduce:CreatePersistentAppUI",
                 "elasticmapreduce:DescribePersistentAppUI",
                 "elasticmapreduce:GetPersistentAppUIPresignedURL",
                 "elasticmapreduce:GetOnClusterAppUIPresignedURL",
"elasticmapreduce:ListInstances"
            ],
            "Resource": [
                 "arn:aws:elasticmapreduce:<region>:<account-id>:cluster/*"
            ]
        },
        {
            "Sid":  "AllowClusterDetailsDiscovery",
            "Effect":  "Allow",
            "Action": [
                 "elasticmapreduce:DescribeCluster",
                 "elasticmapreduce:ListInstanceGroups"
            ],
            "Resource": [
                 "arn:aws:elasticmapreduce:<region>:<account-id>:cluster/*"
            ]
        },
        {
            "Sid":  "AllowClusterDiscovery",
            "Effect":  "Allow",
            "Action": [
                "elasticmapreduce:ListClusters"
            ],
            "Resource":  "*"
        },
        {
            "Sid":  "AllowSagemakerProjectManagement",
            "Effect":  "Allow",
            "Action": [
                 "sagemaker:CreateProject",
                 "sagemaker:DeleteProject"
            ],
            "Resource":  "arn:aws:sagemaker:<region>:<account-id>:project/*"
        },
        {
            "Sid":  "AllowEMRTemplateDiscovery",
            "Effect": "Allow",
            "Action": [
               "servicecatalog:SearchProducts"
            ],
            "Resource":  "*"
        }
    ]
}

并将此policy以及AmazonS3FullAccess绑定到于步骤3.2.2.中创建的role上

而后刷新SageMaker Studio Cluster 页面,即可看到创建和已有的集群:

3.6 使用Sagemaker Studio 调用EMR Spark执行任务

3.6.1. 调用现有EMR Spark

创建一个新的Notebook,Image 选择SparkMagic:

输入以下代码即可连接到指定EMR集群:

%load_ext  sagemaker_studio_analytics_extension.magics
%sm_analytics  emr connect —cluster-id j-xxxx —auth-type None —language python

若是遇到报错:

{"namespace": "sagemaker-analytics", "cluster_id": "j-3R8BQTPL6GQI4", "error_message": "Cannot connect to livy service: ip-10-0-1-65.ap-northeast-1.compute.internal:8998", "success": false, "service": "emr", "operation": "connect"}

则需要在EMR的主节点安全组中加上允许Sagemaker安全组的访问规则,例如:

之后即可正常连接到EMR集群的livy session:

或者直接点击Cluster,即可选择:

3.7 使用CF模板创建环境

创建环境也可以直接使用下面blog里提供的CloudFormation模板:

https://aws.amazon.com/blogs/machine-learning/part-1-create-and-manage-amazon-emr-clusters-from-sagemaker-studio-to-run-interactive-spark-and-ml-workloads/

4.参考资料

https://catalog.workshops.aws/sagemaker-studio-emr/en-US

https://aws.amazon.com/cn/blogs/machine-learning/perform-interactive-data-engineering-and-data-science-workflows-from-amazon-sagemaker-studio-notebooks/

https://aws.amazon.com/cn/blogs/machine-learning/understanding-amazon-sagemaker-notebook-instance-networking-configurations-and-advanced-routing-options/

https://mkai.org/securing-amazon-sagemaker-studio-internet-traffic-using-aws-network-firewall/?utm_source=rss&utm_medium=rss&utm_campaign=securing-amazon-sagemaker-studio-internet-traffic-using-aws-network-firewall

https://github.com/aws-samples/secure-data-science-reference-architecture

本篇作者

孙进华

亚马逊云科技资深解决方案架构师,负责帮助客户进行上云架构的设计和咨询。加入亚马逊云科技前自主创业负责电商平台搭建和车企电商平台整体架构设计。曾就职于全球领先的通讯设备公司,担任高级工程师,负责LTE设备系统的多个子系统的开发与架构设计。在高并发、高可用系统架构设计、微服务架构设计、数据库、中间件、IOT 等方面有着丰富的经验。

汤市建

亚马逊云科技数据分析解决方案架构师,负责客户大数据解决方案的咨询与架构设计。