远程提交作业到 Spark EC2 集群
Submitting jobs to Spark EC2 cluster remotely
我已经使用 Spark 设置了 EC2 集群。一切正常,所有 master/slaves 都已启动并且 运行.
我正在尝试提交示例作业 (SparkPi)。当我 ssh 到集群并从那里提交时 - 一切正常。但是,当在远程主机(我的笔记本电脑)上创建驱动程序时,它不起作用。我已经为 --deploy-mode
:
尝试了两种模式
--deploy-mode=client
:
来自我的笔记本电脑:
./bin/spark-submit --master spark://ec2-52-10-82-218.us-west-2.compute.amazonaws.com:7077 --class SparkPi ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
导致以下不确定 warnings/errors:
WARN TaskSchedulerImpl: Initial job has not accepted any resources;
check your cluster UI to ensure that workers are registered and have
sufficient memory 15/02/22 18:30:45
ERROR SparkDeploySchedulerBackend: Asked to remove non-existent executor 0 15/02/22 18:30:45
ERROR SparkDeploySchedulerBackend: Asked to remove non-existent executor 1
...和失败的驱动程序 - 在 Spark Web UI "Completed Drivers" 中出现 "State=ERROR"。
我试图通过核心和内存限制来提交脚本,但没有帮助...
--deploy-mode=cluster
:
来自我的笔记本电脑:
./bin/spark-submit --master spark://ec2-52-10-82-218.us-west-2.compute.amazonaws.com:7077 --deploy-mode cluster --class SparkPi ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
结果是:
.... Driver successfully submitted as driver-20150223023734-0007 ...
waiting before polling master for driver state ... polling master for
driver state State of driver-20150223023734-0007 is ERROR Exception
from cluster was: java.io.FileNotFoundException: File
file:/home/oleg/spark/spark12/ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
does not exist. java.io.FileNotFoundException: File
file:/home/oleg/spark/spark12/ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
does not exist. at
org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:397)
at
org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:251)
at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:329) at
org.apache.spark.deploy.worker.DriverRunner.org$apache$spark$deploy$worker$DriverRunner$$downloadUserJar(DriverRunner.scala:150)
at
org.apache.spark.deploy.worker.DriverRunner$$anon.run(DriverRunner.scala:75)
因此,如果您能提供有关问题所在的任何指示以及如何从远程客户端部署作业的一些指导,我将不胜感激。谢谢。
更新:
因此对于集群模式下的第二个问题,文件必须对每个集群节点全局可见,因此它必须位于可访问的位置。这解决了 IOException 但导致了与客户端模式相同的问题。
文档位于:
http://spark.apache.org/docs/latest/security.html#configuring-ports-for-network-security
列出了 Spark 集群中使用的所有不同通信通道。如您所见,有一堆连接是从执行器到驱动程序的。当您 运行 和 --deploy-mode=client
时,驱动程序 运行 在您的笔记本电脑上,因此执行程序将尝试与您的笔记本电脑建立连接。如果您的执行者 运行 下的 AWS 安全组阻止了到您笔记本电脑的出站流量(Spark EC2 脚本创建的默认安全组不会),或者您落后于 router/firewall(更有可能),他们无法连接,您会看到您看到的错误。
所以要解决它,您必须将所有必要的端口转发到您的笔记本电脑,或者重新配置您的防火墙以允许连接到这些端口。看到一堆端口是随机选择的,这意味着如果不是所有端口,也可以打开范围广泛的端口。所以可能使用集群中的 --deploy-mode=cluster
或 client
不那么痛苦。
我建议不要使用端口打开策略远程提交 spark 作业,因为它会产生安全问题,而且根据我的经验,麻烦得不偿失,尤其是因为必须对通信层进行故障排除。
备选方案:
1) Livy - 现在是 Apache 项目! http://livy.io or http://livy.incubator.apache.org/
2) Spark 作业服务器 - https://github.com/spark-jobserver/spark-jobserver
我已经使用 Spark 设置了 EC2 集群。一切正常,所有 master/slaves 都已启动并且 运行.
我正在尝试提交示例作业 (SparkPi)。当我 ssh 到集群并从那里提交时 - 一切正常。但是,当在远程主机(我的笔记本电脑)上创建驱动程序时,它不起作用。我已经为 --deploy-mode
:
--deploy-mode=client
:
来自我的笔记本电脑:
./bin/spark-submit --master spark://ec2-52-10-82-218.us-west-2.compute.amazonaws.com:7077 --class SparkPi ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
导致以下不确定 warnings/errors:
WARN TaskSchedulerImpl: Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory 15/02/22 18:30:45
ERROR SparkDeploySchedulerBackend: Asked to remove non-existent executor 0 15/02/22 18:30:45
ERROR SparkDeploySchedulerBackend: Asked to remove non-existent executor 1
...和失败的驱动程序 - 在 Spark Web UI "Completed Drivers" 中出现 "State=ERROR"。
我试图通过核心和内存限制来提交脚本,但没有帮助...
--deploy-mode=cluster
:
来自我的笔记本电脑:
./bin/spark-submit --master spark://ec2-52-10-82-218.us-west-2.compute.amazonaws.com:7077 --deploy-mode cluster --class SparkPi ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar
结果是:
.... Driver successfully submitted as driver-20150223023734-0007 ... waiting before polling master for driver state ... polling master for driver state State of driver-20150223023734-0007 is ERROR Exception from cluster was: java.io.FileNotFoundException: File file:/home/oleg/spark/spark12/ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar does not exist. java.io.FileNotFoundException: File file:/home/oleg/spark/spark12/ec2test/target/scala-2.10/ec2test_2.10-0.0.1.jar does not exist. at org.apache.hadoop.fs.RawLocalFileSystem.getFileStatus(RawLocalFileSystem.java:397) at org.apache.hadoop.fs.FilterFileSystem.getFileStatus(FilterFileSystem.java:251) at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:329) at org.apache.spark.deploy.worker.DriverRunner.org$apache$spark$deploy$worker$DriverRunner$$downloadUserJar(DriverRunner.scala:150) at org.apache.spark.deploy.worker.DriverRunner$$anon.run(DriverRunner.scala:75)
因此,如果您能提供有关问题所在的任何指示以及如何从远程客户端部署作业的一些指导,我将不胜感激。谢谢。
更新: 因此对于集群模式下的第二个问题,文件必须对每个集群节点全局可见,因此它必须位于可访问的位置。这解决了 IOException 但导致了与客户端模式相同的问题。
文档位于:
http://spark.apache.org/docs/latest/security.html#configuring-ports-for-network-security
列出了 Spark 集群中使用的所有不同通信通道。如您所见,有一堆连接是从执行器到驱动程序的。当您 运行 和 --deploy-mode=client
时,驱动程序 运行 在您的笔记本电脑上,因此执行程序将尝试与您的笔记本电脑建立连接。如果您的执行者 运行 下的 AWS 安全组阻止了到您笔记本电脑的出站流量(Spark EC2 脚本创建的默认安全组不会),或者您落后于 router/firewall(更有可能),他们无法连接,您会看到您看到的错误。
所以要解决它,您必须将所有必要的端口转发到您的笔记本电脑,或者重新配置您的防火墙以允许连接到这些端口。看到一堆端口是随机选择的,这意味着如果不是所有端口,也可以打开范围广泛的端口。所以可能使用集群中的 --deploy-mode=cluster
或 client
不那么痛苦。
我建议不要使用端口打开策略远程提交 spark 作业,因为它会产生安全问题,而且根据我的经验,麻烦得不偿失,尤其是因为必须对通信层进行故障排除。
备选方案:
1) Livy - 现在是 Apache 项目! http://livy.io or http://livy.incubator.apache.org/
2) Spark 作业服务器 - https://github.com/spark-jobserver/spark-jobserver