在AWS上部署PySpark的最佳实践是什么?

如何在AWS上部署PySpark的最佳实践?

介绍

在大数据和高级分析领域,PySpark已成为处理大型数据集和分析分布式数据的强大工具。在云上部署PySpark应用程序可以改变游戏规则,为数据密集型任务提供可扩展性和灵活性。亚马逊网络服务(AWS)为此类部署提供了理想的平台,当与Docker容器结合使用时,可以实现无缝高效的解决方案。

然而,在云基础架构上部署PySpark可能会非常复杂和令人生畏。建立分布式计算环境、配置Spark集群和管理资源的复杂性通常会让许多人望而却步,无法充分发挥其潜力。

学习目标

  • 学习PySpark、AWS和Docker的基本概念,确保在云上部署PySpark集群的坚实基础。
  • 按照全面的、一步一步的指南设置使用Docker在AWS上部署PySpark,包括配置AWS、准备Docker镜像和管理Spark集群。
  • 探索在AWS上优化PySpark性能的策略,包括监视、扩展和遵循最佳实践,以充分利用数据处理工作流。

本文是“数据科学博文马拉松”的一部分。

先决条件

在使用Docker在AWS上部署PySpark之前,请确保已经具备以下先决条件:

🚀 本地PySpark安装:为了开发和测试PySpark应用程序,必须在本地计算机上安装PySpark。可以按照操作系统的官方文档安装PySpark。本地安装将作为开发环境,允许您在部署到AWS之前编写和测试PySpark代码。

🌐 AWS账户:您需要一个活跃的AWS(亚马逊网络服务)账户,以访问部署PySpark所需的云基础架构和服务。如果您还没有AWS账户,可以在AWS官网上注册。请准备好您的付款信息,尽管AWS为新用户提供有限资源的免费层。

🐳 Docker安装:Docker是此部署过程中的重要组件。请按照Ubuntu操作系统的安装说明在本地计算机上安装Docker。Docker容器将允许您一致地封装和部署PySpark应用程序。

Windows

  1. 访问。
  2. 下载Windows Docker桌面版安装程序。
  3. 双击安装程序运行。
  4. 按照安装向导的说明进行安装。
  5. 安装完成后,从应用程序中启动Docker桌面版。

macOS

  1. 前往。
  2. 下载Mac Docker桌面版安装程序。
  3. 双击安装程序打开。
  4. 将Docker图标拖动到您的应用程序文件夹中。
  5. 从应用程序启动Docker。

Linux(Ubuntu)

1. 打开终端并更新软件包管理器:

sudo apt-get update

2. 安装必要的依赖项:

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

3. 添加Docker官方的GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg |  sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. 设置Docker仓库:

echo "deb [signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 再次更新软件包索引:

sudo apt-get update

6. 安装Docker:

sudo apt-get install -y docker-ce docker-ce-cli containerd.io

7. 启动并启用Docker服务:

sudo systemctl start dockersudo systemctl enable docker

8. 验证安装情况:

sudo docker --version

**** 在一行中添加分隔符号

观看有关Docker安装的视频教程

设置AWS

Amazon Web Services(AWS)是我们PySpark部署的基础,我们将使用两个重要的服务,弹性容器注册表(ECR)和弹性计算云(EC2),创建一个动态的云环境。

AWS帐户注册

如果尚未注册,前往AWS注册页面创建帐户。请按照注册过程提供必要的信息,并准备好支付详细信息,以便能够探索AWS Free Tier之外的内容。

AWS Free Tier

对于AWS新手,利用AWS Free Tier,该服务在12个月内提供有限的资源和服务免费使用。这是探索AWS而不产生费用的绝佳方式。

AWS访问密钥和秘密密钥

您需要访问密钥ID和密钥以与AWS进行编程交互。按照以下步骤生成它们:

  • 登录AWS管理控制台。
  • 导航到“身份和访问管理(IAM)”服务。
  • 在左侧导航窗格中单击“用户”。
  • 创建新用户或选择现有用户。
  • 在“安全凭证”选项卡下生成访问密钥。
  • 记下访问密钥ID和秘密访问密钥,稍后将使用它们
  • 点击用户后

弹性容器注册表(ECR)

ECR是由AWS提供的托管Docker容器注册表服务。它将成为我们存储Docker镜像的仓库。您可以按照以下步骤设置您的ECR:

  • 在AWS管理控制台中,导航到Amazon ECR服务。
  • 创建一个新的存储库,为其指定一个名称,并配置存储库设置。
  • 记下您的ECR存储库的URI;您将需要它进行Docker镜像推送。

弹性计算云(EC2)

EC2在云中提供可扩展的计算能力,并将托管您的PySpark应用程序。要设置一个EC2实例:

  • 在AWS管理控制台中,导航到EC2服务。
  • 启动一个新的EC2实例,选择适合您工作负载的实例类型。
  • 配置实例详细信息和存储选项。
  • 创建或选择现有的密钥对以安全连接到您的EC2实例。

在附有安全组之后,“““”在此之后。”

观看视频教程

存储您的AWS设置值以供以后使用

AWS_ACCESS_KEY_ID: YOURSAMPLEACCESSKEYAWS_ECR_LOGIN_URI: 123456789012.dkr.ecr.region.amazonaws.comAWS_REGION: us-east-1AWS_SECRET_ACCESS_KEY: YOURSAMPLESECRETACCESSKEY12345ECR_REPOSITORY_NAME: 您的ecr仓库名称

设置GitHub Secrets和Variables

现在,您已经准备好了AWS设置值,是时候使用GitHub secrets和variables在您的GitHub存储库中安全地配置它们了。这为您的PySpark部署过程增加了额外的安全性和便利性。

按照以下步骤设置您的AWS值:

访问您的GitHub存储库

  • 您可以导航到您的GitHub存储库,您在其中托管您的PySpark项目。

访问存储库设置

  • 在您的存储库中,点击“设置”选项卡。

管理Secrets

  • 在左侧边栏中,您会找到一个名为“Secrets”的选项。点击它以访问GitHub secrets管理界面。

添加新的Secret

  • 在这里,您可以将AWS设置值作为secrets添加。
  • 点击“New Repository Secret”以创建一个新的secret。
  • 对于每个AWS值,使用与该值目的相对应的名称创建一个secret(例如,“AWS_ACCESS_KEY_ID”,“AWS_SECRET_ACCESS_KEY”,“AWS_REGION”等)。
  • 在“Value”字段中输入实际值。

保存您的Secrets

  • 对于每个值,点击“Add secret”按钮将其保存为GitHub secret。

使用安全存储在GitHub中的AWS secrets,您可以在GitHub Actions工作流程中轻松引用它们,并在部署过程中安全访问AWS服务。

最佳实践

  • GitHub secrets已加密,只能由具有必要权限的授权用户访问。这确保了您敏感的AWS值的安全性。
  • 通过使用GitHub secrets,您避免将敏感信息直接暴露在代码或配置文件中,提高了项目的安全性。

您的AWS设置值现已安全配置在您的GitHub存储库中,使它们在您的PySpark部署工作流程中可用。

理解代码结构

要有效地使用Docker在AWS上部署PySpark,了解项目代码的结构至关重要。让我们拆解构成代码库的组件:

├── .github│   ├── workflows│   │   ├── build.yml├── airflow├── configs├── consumerComplaint│   ├── cloud_storage│   ├── components│   ├── config│   │   ├── py_sparkmanager.py│   ├── constants│   ├── data_access│   ├── entity│   ├── exceptions│   ├── logger│   ├── ml│   ├── pipeline│   ├── utils├── output│   ├── .png├── prediction_data├── research│   ├── jupyter_notebooks├── saved_models│   ├── model.pkl├── tests├── venv├── Dockerfile├── app.py├── requirements.txt├── .gitignore├── .dockerignore

应用程序代码(app.py)

  • app.py是您主要的Python脚本,负责运行PySpark应用程序。
  • 它是您的PySpark作业的入口点,并作为应用程序的核心。
  • 您可以自定义此脚本以定义数据处理流水线、作业调度等。

Dockerfile

  • Dockerfile包含构建PySpark应用程序的Docker镜像的指令。
  • 它指定了基本镜像,添加所需的依赖项,将应用程序代码复制到容器中,并设置运行环境。
  • 此文件在将应用程序容器化以实现无缝部署方面起着关键作用。

依赖项(requirements.txt)

  • requirements.txt列出了您的PySpark应用程序所需的Python包和依赖项。
  • 这些包将在Docker容器内安装,以确保您的应用程序正常运行。

GitHub Actions工作流程

  • GitHub Actions工作流程在项目存储库的.github/workflows/中定义。
  • 它们自动化构建、测试和部署过程。
  • 工作流程文件(如main.yml)概述了发生特定事件时要执行的步骤,如代码推送或拉取请求。

构建 py_sparkmanager.py

import osfrom dotenv import load_dotenvfrom pyspark.sql import SparkSession# 从 .env 文件加载环境变量load_dotenv()access_key_id = os.getenv("AWS_ACCESS_KEY_ID")secret_access_key = os.getenv("AWS_SECRET_ACCESS_KEY")# 初始化 SparkSessionspark_session = SparkSession.builder.master('local[*]').appName('consumer_complaint') \    .config("spark.executor.instances", "1") \    .config("spark.executor.memory", "6g") \    .config("spark.driver.memory", "6g") \    .config("spark.executor.memoryOverhead", "8g") \    .config('spark.jars.packages', "com.amazonaws:aws-java-sdk:1.7.4,  org.apache.hadoop:hadoop-aws:2.7.3") \    .getOrCreate()# 为AWS S3访问配置 SparkSessionspark_session._jsc.hadoopConfiguration().set("fs.s3a.awsAccessKeyId", access_key_id)spark_session._jsc.hadoopConfiguration().set("fs.s3a.awsSecretAccessKey", secret_access_key)spark_session._jsc.hadoopConfiguration().set("fs.s3a.impl",               "org.apache.hadoop.fs.s3a.S3AFileSystem")spark_session._jsc.hadoopConfiguration().set("com.amazonaws.services.s3.enableV4", "true")spark_session._jsc.hadoopConfiguration().set("fs.s3a.aws.credentials.provider",              "org.apache.hadoop.fs.s3a.BasicAWSCredentialsProvider")spark_session._jsc.hadoopConfiguration().set("fs.s3a.endpoint", "ap-south-1.amazonaws.com")spark_session._jsc.hadoopConfiguration().set("fs.s3.buffer.dir", "tmp")

此代码设置了SparkSession,为其配置了AWS S3访问,并从环境变量中加载AWS凭据,使您可以在PySpark应用程序中无缝使用AWS服务。

准备PySpark Docker镜像(重要)

本节将探讨如何创建Docker镜像,将您的PySpark应用程序封装起来,使其具有可移植性、可伸缩性,并准备好在AWS上部署。Docker容器为您的PySpark应用程序提供了一致的环境,确保在不同的设置中无缝执行。

Dockerfile

构建PySpark的Docker镜像的关键是一个定义明确的Dockerfile。该文件指定了设置容器环境的指令,包括Python和PySpark的依赖项。

从python:3.8.5-slim-buster镜像开始 # 使用Ubuntu基本镜像FROM ubuntu:20.04 # 设置JAVA_HOME并安装OpenJDK 8ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/RUN apt-get update -y \    && apt-get install -y openjdk-8-jdk \    && apt-get install python3-pip -y \    && apt-get clean \    && rm -rf /var/lib/apt/lists/*# 设置应用程序的环境变量ENV AIRFLOW_HOME="/app/airflow"ENV PYSPARK_PYTHON=/usr/bin/python3ENV PYSPARK_DRIVER_PYTHON=/usr/bin/python3# 创建一个目录用于您的应用程序,并将其设置为工作目录WORKDIR /app# 将当前目录的内容复制到容器中的工作目录COPY . /app# 从requirements.txt安装Python依赖项RUN pip3 install -r requirements.txt# 设置入口点以运行您的app.py脚本CMD ["python3", "app.py"]

构建Docker镜像

在准备好Dockerfile后,可以使用以下命令构建Docker镜像:

docker build -t your-image-name

your-image-name替换为所需的Docker镜像名称和版本。

验证本地镜像

构建镜像后,可以使用以下命令列出本地Docker镜像:

docker images docker ps -a docker system df

在Docker中运行PySpark

准备好Docker镜像后,可以在Docker容器中运行PySpark应用程序。使用以下命令:

docker run -your-image-name

““”有时候docker run命令不起作用,请按照下面的命令进行操作。“““

docker run 80:8080 your-image-name docker run 8080:8080 your-image-name

在AWS上部署PySpark

本节将介绍如何使用Docker容器在AWS上部署PySpark应用程序。此部署将涉及启动Amazon Elastic Compute Cloud (EC2)实例来创建一个PySpark集群。

启动EC2实例

  • 在EC2仪表板中,点击“启动实例”。
  • 您可以选择适合您需求的Amazon Machine Image(AMI),通常是基于Linux的。
  • 根据工作负载选择实例类型(例如,m5.large, c5.xlarge)。
  • 配置实例详情,包括集群中的实例数量。
  • 根据需要添加存储、标签和安全组。

这就是我上面提到的内容。

连接到EC2实例

  • 实例运行之后,您可以通过SSH连接到它们来管理PySpark集群。

编写以下命令

下载Docker安装脚本

curl -fsSL https://get.docker.com -o get-docker.sh

以root权限运行Docker安装脚本

sudo sh get-docker.sh

将当前用户添加到docker组(将’ubuntu’替换为您的用户名)

sudo usermod -aG docker ubuntu

通过运行新的shell会话或使用’newgrp’来激活更改

newgrp docker

构建GitHub自托管Runner

我们将为GitHub Actions设置一个自托管Runner,负责执行您的CI/CD工作流。自托管Runner在您的基础设施上运行,并且在运行需要特定配置或访问本地资源的工作流时是一个很好的选择。

设置自托管Runner

  • 点击设置
  • 点击操作 -> Runner

  • 点击新的自托管Runner

在EC2机器上写下面的命令

  • 创建一个文件夹:这个命令创建一个名为actions-runner的目录,并将当前目录更改为这个新创建的文件夹。
$ mkdir actions-runner && cd actions-runner
  • 下载最新的Runner安装包:这个命令下载Linux x64的GitHub Actions Runner安装包。它指定了要下载的包的URL并将其以文件名actions-runner-linux-x64-2.309.0.tar.gz保存。
$ curl -o actions-runner-linux-x64-2.309.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.309.0/actions-runner-linux-x64-2.309.0.tar.gz
  • 可选:验证哈希值:这个命令通过验证哈希值来检查下载包的完整性。它计算已下载包的SHA-256哈希值,并将其与已知的预期哈希值进行比较。如果它们匹配,那么该包被认为是有效的。
$ echo "2974243bab2a282349ac833475d241d5273605d3628f0685bd07fb5530f9bb1a  actions-runner-linux-x64-2.309.0.tar.gz" | shasum -a 256 -c
  • 解压安装程序:这个命令解压已下载包的内容,该包是一个tarball(压缩存档)。
$ tar xzf ./actions-runner-linux-x64-2.309.0.tar.gz
  • 最后一步,运行它:这个命令使用提供的配置设置启动Runner。它设置Runner以执行指定存储库的GitHub Actions工作流。
$ ./run.sh

持续集成和持续交付(CICD)工作流配置

在CI/CD流水线中,build.yaml文件在定义构建和部署应用程序所需步骤方面至关重要。这个配置文件指定了CI/CD流程的工作流,包括代码的构建、测试和部署。让我们深入了解build.yaml配置和其重要性的关键方面:

工作流概述

build.yaml文件概述了CI/CD流水线中执行的任务。它定义了持续集成的步骤,其中包括构建和测试应用程序以及持续交付,即将应用程序部署到各种环境。

持续集成(CI)

这个阶段通常包括代码编译、单元测试和代码质量检查等任务。build.yaml文件指定了执行这些任务所需的工具、脚本和命令。例如,它可能触发执行单元测试以确保代码质量。

持续交付(CD)

在成功进行CI后,CD阶段涉及将应用程序部署到不同的环境,如预发布或生产环境。build.yaml文件指定了部署应该如何进行,包括何时在何处部署以及使用哪些配置。

依赖管理

build.yaml文件通常包含有关项目依赖项的详细信息。它定义了从哪里获取外部库或依赖项,这对于成功构建和部署应用程序非常重要。

环境变量

CI/CD工作流通常需要特定于环境的配置,例如API密钥或连接字符串。build.yaml文件可以定义如何为每个流水线阶段设置这些环境变量。

通知和警报

在CI/CD过程中出现故障或问题时,通知和警报非常重要。build.yaml文件可以配置如何以及向谁发送这些警报,确保及时解决问题。

构建成果和输出

根据CI/CD工作流程的不同,build.yaml文件可以指定应生成哪些构建成果或输出,并指定它们应存储在何处。这些构建成果可以用于部署或进一步测试。

通过了解build.yaml文件及其组成部分,您可以有效地管理和定制CI/CD工作流程,以满足项目的需求。它是整个自动化过程的蓝图,从代码更改到生产部署。

CI/CD流水线

您可以根据build.yaml配置的具体细节以及它在您的CI/CD流水线中的适应情况进一步自定义内容。

name: workflowon:  push:    branches:      - main    paths-ignore:      - 'README.md'permissions:  id-token: write  contents: readjobs:  integration:    name: 持续集成    runs-on: ubuntu-latest    steps:      - name: 检查代码        uses: actions/checkout@v3      - name: 代码检查        run: echo "正在进行代码检查"      - name: 运行单元测试        run: echo "运行单元测试"build-and-push-ecr-image:    name: 连续交付    needs: integration    runs-on: ubuntu-latest    steps:      - name: 检查代码        uses: actions/checkout@v3      - name: 安装工具        run: |          sudo apt-get update          sudo apt-get install -y jq unzip      - name: 配置AWS凭证        uses: aws-actions/configure-aws-credentials@v1        with:          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}          aws-region: ${{ secrets.AWS_REGION }}      - name: 登录到Amazon ECR        id: login-ecr        uses: aws-actions/amazon-ecr-login@v1      - name: 构建、标记和推送镜像到Amazon ECR        id: build-image        env:          ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}          ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}          IMAGE_TAG: latest        run: |          # 构建Docker容器,并将其推送到ECR,以便可以部署到ECS。          docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .          docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG          echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY            :$IMAGE_TAG"                      Continuous-Deployment:    needs: build-and-push-ecr-image    runs-on: self-hosted    steps:      - name: 检查        uses: actions/checkout@v3      - name: 配置AWS凭证        uses: aws-actions/configure-aws-credentials@v1        with:          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}          aws-region: ${{ secrets.AWS_REGION }}      - name: 登录到Amazon ECR        id: login-ecr        uses: aws-actions/amazon-ecr-login@v1                  - name: 拉取最新镜像        run: |         docker pull ${{secrets.AWS_ECR_LOGIN_URI}}/${{ secrets.         ECR_REPOSITORY_NAME }}:latest      - name: 如果正在运行,则停止并删除sensor容器        run: |         docker ps -q --filter "name=sensor" | grep -q . && docker stop sensor         && docker rm -fv sensor             - name: 运行Docker镜像以提供用户服务        run: |         docker run -d -p 80:8080 --name=sensor -e 'AWS_ACCESS_KEY_ID=                  ${{ secrets.AWS_ACCESS_KEY_ID }}       ' -e 'AWS_SECRET_ACCESS_KEY=${{ secrets.AWS_SECRET_ACCESS_KEY }}'       -e 'AWS_REGION=${{ secrets.AWS_REGION }}'  ${{secrets.AWS_ECR_LOGIN_URI}}/      ${{ secrets.ECR_REPOSITORY_NAME }}:latest      - name: 清理先前的镜像和容器        run: |         docker system prune -f

注意: 所有的分割线都合并为一行如果出现任何问题,请按照我上次提到的GitHub存储库进行操作。

持续部署工作:

  • 此工作依赖于“构建和推送ECR映像工作”,并配置为在自托管运行器上运行。
  • 它检出代码并配置AWS凭据。
  • 它登录到Amazon ECR。
  • 它从指定的ECR存储库中拉取最新的Docker映像。
  • 如果名为“sensor”的Docker容器正在运行,则停止并删除它。
  • 它使用之前拉取的Docker映像以指定的设置、环境变量和名称为“sensor”的Docker容器运行。
  • 最后,使用docker system prune清理以前的Docker映像和容器。

自动化代码更改上的工作流执行

为了使整个CI/CD过程与代码更改无缝响应,您可以配置仓库以自动触发工作流程,无论是代码提交还是推送。每当您保存并推送更改到仓库时,CI/CD管道都会开始发挥其作用。

通过自动化工作流程的执行,您可以确保应用程序始终与最新更改保持同步,无需手动干预。这种自动化可以显着提高开发效率,并提供有关代码更改的快速反馈,使得更早地捕获和解决问题更加容易。

要设置在代码更改上自动执行工作流程,请按照以下步骤操作:

git add .git commit -m "message"git push origin main

结论

在这个全面的指南中,我们已经为您介绍了如何使用EC2和ECR在AWS上部署PySpark的复杂过程。利用容器化和持续集成和交付,这种方法为管理大规模数据分析和处理任务提供了一个强大而适应性强的解决方案。通过按照本博客中概述的步骤操作,您可以在云环境中充分发挥PySpark的强大功能,利用AWS提供的可扩展性和灵活性。

需要注意的是,AWS提供了多种部署选项,从EC2和ECR到像EMR这样的专用服务。方法的选择取决于项目的特定需求。无论您是选择本文演示的容器化方法,还是选择其他AWS服务,关键是在数据驱动的应用程序中有效地利用PySpark的功能。作为您的平台,AWS让您充分发挥PySpark的潜力,迎接数据分析和处理的新时代。如果EMR等服务更符合您的特定用例和偏好,请探索AWS提供的多样化工具包,以满足项目的独特需求。

要点总结

  • 使用Docker在AWS上部署PySpark可以简化大数据处理,提供可扩展性和自动化。
  • GitHub Actions简化了CI/CD管道,实现了无缝代码部署。
  • 利用EC2和ECR等AWS服务可以确保强大的PySpark集群管理。
  • 本教程使您能够利用云计算的强大功能来处理数据密集型任务。

常见问题

进一步学习资源

  • GitHub存储库:Consumer Complaint Dispute Prediction GitHub仓库上访问本教程中使用的完整源代码和配置。
  • Docker文档:通过官方Docker文档进一步了解Docker和容器化。您将找到全面的指南、最佳实践和技巧,以掌握Docker。
  • GitHub Actions文档:请参阅GitHub Actions文档,充分发挥GitHub Actions的全部功能。这个资源将帮助您创建、自定义和自动化您的工作流。
  • PySpark官方文档:深入了解PySpark的知识,您可以在官方PySpark文档中进行探索。了解大数据处理的API、函数和库。

本文中显示的媒体不归Analytics Vidhya所有,仅由作者自行决定使用。