我只有一台机器,并希望使用mesos集群模式运行spark作业。使用节点集群运行可能更有意义,但我主要想首先测试mesos以检查它是否能够更有效地利用资源(在没有静态分区的情况下同时运行多个spark作业)。我尝试了很多方法但没有成功。这是我做的:
构建mesos并运行mesos master和slave(同一台机器中的2个slave)。
sudo ./bin/mesos-master.sh --ip=127.0.0.1 --work_dir=/var/lib/mesos
sudo ./bin/mesos-slave.sh --master=127.0.0.1:5050 --port=5051 --work_dir=/tmp/mesos1
sudo ./bin/mesos-slave.sh --master=127.0.0.1:5050 --port=5052 --work_dir=/tmp/mesos2
运行spark-mesos-dispatcher
sudo ./sbin/start-mesos-dispatcher.sh --master mesos://localhost:5050
使用调度程序作为主URL提交应用程序。
spark-submit --master mesos://localhost:7077 <other-config> <jar file>
但它不起作用:
E0925 17:30:30.158846 807608320 socket.hpp:174] Shutdown failed on fd=61: Socket is not connected [57]
E0925 17:30:30.159545 807608320 socket.hpp:174] Shutdown failed on fd=62: Socket is not connected [57]
如果我使用spark-submit --deploy-mode集群,那么我收到另一条错误消息:
Exception in thread "main" org.apache.spark.deploy.rest.SubmitRestConnectionException: Unable to connect to server
如果我不使用调度程序但直接使用mesos master url,那么它可以正常工作: - master mesos:// localhost:5050(客户端模式)。根据{{3}},Mesos群集不支持群集模式,但它们为群集模式documentation提供了另一条指令。这有点令人困惑吗?我的问题是:
感谢。
答案 0 :(得分:1)
我使用你的场景尝试,它可能是工作。 有一点不同,我使用ip地址而不是“localhost”和“127.0.0.1” 所以,再试一次,检查http://your_dispatcher:8081(在浏览器上)是否存在。
这是我的spark-submit命令:
$spark-submit --deploy-mode cluster --master mesos://192.168.11.79:7077 --class "SimpleApp" SimpleAppV2.jar
如果成功,您可以看到如下
{
"action" : "CreateSubmissionResponse",
"serverSparkVersion" : "1.5.0",
"submissionId" : "driver-20151006164749-0001",
"success" : true
}
当我收到您的错误日志时,我重启机器并重试您的步骤。它也有效。
答案 1 :(得分:1)
似乎有两件事令人困惑:在群集中启动Spark应用程序(而不是本地)并将驱动程序启动到群集中。
从Submitting Applications的顶部开始:
Spark的bin目录中的spark-submit脚本用于在集群上启动应用程序。它可以通过统一的界面使用Spark支持的所有集群管理器,因此您不必为每个集成管理器专门配置应用程序。
因此,Mesos是受支持的集群管理器之一,因此您可以run Spark apps on a Mesos cluster。
编写时不支持的Mesos是将驱动程序启动到集群中,这是--deploy-mode
的命令行参数./bin/spark-submit
指定的内容。由于--deploy-mode
的默认值为client
,您可以省略它,或者如果您想明确指定它,请使用:
./bin/spark-submit --deploy-mode client ...
答案 2 :(得分:1)
尝试使用6066端口而不是7077.较新版本的Spark更喜欢使用REST API来提交作业。