如何通过远程计算机或边缘节点将 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 数据。