如何通过远程计算机或边缘节点将 Spark 作业提交到 Amazon EMR 集群?

上次更新日期:2021 年 8 月 25 日

我想要通过远程计算机将 Apache Spark 作业提交到 Amazon EMR 集群,如 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

简短描述

您可以从远程计算机或边缘节点运行 Spark 作业,而无需登录 Amazon EMR 集群节点。Spark 支持两种类型的部署模式,包括客户端模式和集群模式。如果未将部署模式指定为集群,则远程计算机或边缘节点的 Spark 作业将在客户端模式下运行。

要通过远程计算机将 Spark 作业提交到 EMR 集群,必须满足以下条件:

  • 允许网络流量从远程计算机传输到所有集群节点。
  • 所有远程计算机上均安装了 Spark 和 Hadoop 二进制文件。
  • 远程计算机上的配置文件指向 EMR 集群。

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

解决方法

确认允许网络流量从远程计算机传输到所有集群节点

  • 如果您使用 Amazon EC2 实例作为远程计算机或边缘节点:允许入站流量从该实例的安全组传输到每个集群节点的安全组。
  • 如果您使用的是自己的计算机:允许入站流量从您计算机的 IP 地址传输到每个集群节点的安全组。

在远程计算机上安装 Spark 和其他从属二进制文件

要安装二进制文件,请复制 EMR 集群的主节点中的文件,如下列步骤所述。这是最简单的方法,可确保 EMR 集群和远程计算机上安装了相同的版本。

1.    运行以下命令,以在远程计算机上创建文件夹结构:

sudo mkdir -p /var/aws/emr/
sudo mkdir -p /etc/hadoop/conf
sudo mkdir -p /etc/spark/conf
sudo mkdir -p /var/log/spark/user/
sudo mkdir /mnt1
sudo chmod 777 -R /var/log/spark/
sudo chmod 777 /mnt /mnt1

2.    运行以下命令将存储库文件和公有密钥文件从 EMR 集群的主节点复制到远程计算机。请勿更改文件夹结构或文件名。

注意:务必将 yours3bucket 替换为想要使用的 S3 存储桶的名称。

对于 Amazon EMR 5.29 及更早版本:

在 EMR 集群中:

aws s3 cp /etc/yum.repos.d/emr-apps.repo s3://yours3bucket/path/to/copy/repo/
aws s3 cp /var/aws/emr/repoPublicKey.txt s3://yours3bucket/path/to/copy/key/

在 Amazon EC2 实例中:

sudo aws s3 cp s3://yours3bucket/path/to/copy/repo/emr-apps.repo /etc/yum.repos.d/
sudo aws s3 cp s3://yours3bucket/path/to/copy/key/repoPublicKey.txt /var/aws/emr/repoPublicKey.txt

对于 Amazon EMR 5.30 及更高版本:

在 EMR 集群中:

aws s3 cp /etc/yum.repos.d/ s3://yours3bucket/path/to/copy/repo/ --recursive
aws s3 cp /var/aws/emr/repoPublicKey.txt s3://yours3bucket/path/to/copy/key/

在 Amazon EC2 实例中:

sudo aws s3 cp s3://yours3bucket/path/to/copy/repo/ /etc/yum.repos.d/ --recursive
sudo aws s3 cp s3://yours3bucket/path/to/copy/key/repoPublicKey.txt /var/aws/emr/repoPublicKey.txt

3.    运行以下命令,以在 Amazon EC2 实例中安装 Spark 和 Hadoop 二进制文件:

sudo yum install -y hadoop-client
sudo yum install -y hadoop-hdfs
sudo yum install -y spark-core
sudo yum install -y java-1.8.0-openjdk

对于 Amazon EMR 5.33 和 6.3 版本,请同时运行以下命令:

sudo useradd hadoop -g hadoop
sudo yum install -y hadoop

创建配置文件并将它们指向 EMR 集群

注意:您也可以使用诸如 rsync 之类的工具将配置文件从 EMR 主节点复制到远程实例。

1.    在 EMR 集群主节点上运行以下命令,以便将配置文件复制到 Amazon Simple Storage Service (Amazon S3)。将 yours3bucket 替换为想要使用的存储桶的名称。

aws s3 cp /etc/spark/conf s3://yours3bucket/path/to/copy/spark/ --recursive
aws s3 cp /etc/hadoop/conf s3://yours3bucket/path/to/copy/hadoop/ --recursive
aws s3 cp /usr/share/aws/ s3://yours3bucket/path/to/copy/usr_share_aws/ --recursive
aws s3 cp /usr/lib/spark/jars s3://yours3bucket/path/to/copy/lib_spark_jars/ --recursive
aws s3 cp /usr/lib/hadoop-lzo s3://yours3bucket/path/to/copy/lib_hadoop_lzo/ --recursive

2.    在核心和任务节点上运行以下命令,以便将配置文件从 S3 存储桶下载到远程计算机上。将 yours3bucket 替换为在上一步中使用的存储桶的名称。

sudo aws s3 cp s3://yours3bucket/path/to/copy/spark/ /etc/spark/conf  --recursive
sudo aws s3 cp s3://yours3bucket/path/to/copy/hadoop/ /etc/hadoop/conf  --recursive
sudo aws s3 cp s3://yours3bucket/path/to/copy/usr_share_aws/ /usr/share/aws/ --recursive
sudo aws s3 cp s3://yours3bucket/path/to/copy/lib_spark_jars/ /usr/lib/spark/jars/ --recursive
sudo aws s3 cp s3://yours3bucket/path/to/copy/lib_hadoop_lzo/ /usr/lib/hadoop-lzo/ --recursive

3.    通过运行以下命令将 Hadoop 用户添加到远程计算机中:

sudo useradd hadoop -g hadoop

注意:如果您使用的是不同的 Hadoop 用户名和组名,请确保它们存在于 EMR 集群中。

远程计算机现已准备就绪,可供提交 Spark 作业。

提交 Spark 作业

将用户切换到 Hadoop。然后,运行以下命令,以提交 Spark 作业到 EMR 集群。

请务必在命令中替换以下值:

  • org.apache.spark.examples.SparkPi:充当作业入口点的类
  • /usr/lib/spark/examples/jars/spark-examples.jar:Java .jar 文件的路径

要将部署模式指定为集群,请运行以下命令:

spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

要将部署模式指定为客户端,请运行以下命令:

spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples.jar

您还可以使用 hdfs 命令从远程计算机访问 HDFS 数据。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?