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

上次更新时间:2020 年 3 月 2 日

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

简短描述

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

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

2.    所有远程计算机上均安装了 Spark 和 Hadoop 二进制文件。

3.    远程计算机上的配置文件指向 EMR 集群。

解决方法

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

  • 如果您使用的是 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 chmod 777 -R /var/log/spark/

2.    将以下文件从 EMR 集群的主节点复制到远程计算机。请勿更改文件夹结构或文件名。
/etc/yum.repos.d/emr-apps.repo
/var/aws/emr/repoPublicKey.txt

3.    运行以下命令,以安装 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

如果您想要结合使用 AWS Glue 数据目录与 Spark,请在远程计算机上运行以下命令,以安装 AWS Glue 库:

sudo yum install -y libgssglue

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

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

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

aws s3 cp /etc/spark/conf s3://yours3bucket/emrhadoop-conf/sparkconf/ --recursive
aws s3 cp /etc/hadoop/conf s3://yours3bucket/emrhadoop-conf/hadoopconf/ --recursive

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

sudo aws s3 cp s3://yours3bucket/emrhadoop-conf/hadoopconf/ /etc/hadoop/conf/ --recursive
sudo aws s3 cp s3://yours3bucket/emrhadoop-conf/sparkconf/ /etc/spark/conf/ --recursive

3.    对于将 Spark 作业提交到 EMR 集群的用户,请创建 HDFS 主目录。在以下命令中,将 sparkuser 替换为用户的名称。

hdfs dfs –mkdir /user/sparkuser
hdfs dfs -chown sparkuser:sparkuser /user/sparkuser

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

提交 Spark 作业

运行以下命令,以提交 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

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

常见错误

独立模式

Amazon EMR 不支持适用于 Spark 的独立模式。使用以下类似命令无法将 Spark 应用程序提交到远程 Amazon EMR 集群:

SparkConf conf = new
SparkConf().setMaster("spark://master_url:7077”).setAppName("Word Count");

相反,请按照本文前面所述,设置您的本地计算机。然后,使用 spark-submit 命令提交应用程序。

java.lang.UnsupportedClassVersionError

当远程 EC2 实例运行的是 Java 版本 1.7 且 EMR 集群运行的是 Java 1.8 时,将会发生以下错误:

Exception in thread "main" java.lang.UnsupportedClassVersionError:
org/apache/spark/launcher/Main : Unsupported major.minor version 52.0

要解决此错误,请运行以下命令,以升级 EC2 实例上的 Java 版本:

sudo yum install java-1.8.0
sudo yum remove java-1.7.0-openjdk

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?