当前位置: 首页 > 知识库问答 >
问题:

如何从Docker容器中启动Spark-Mesos作业?

凌和悦
2023-03-14

是否可以从一个Docker容器中提交一个Mesos上的Spark作业,其中有一个Mesos master(没有Zookeeper)和一个Mesos agent,每个都在独立的Docker容器中运行(目前在同一主机上)?在http://Mesos.apache.org/documentation/latest/container-image/上描述的Mesos容器化器似乎适用于Mesos应用程序只是封装在Docker容器中并运行的情况。我的Docker应用程序与基于用户输入在运行时实例化的多个PySpark Mesos作业的交互性更强。Docker容器中的驱动程序本身并不作为Mesos应用程序运行。只有用户发起的作业请求才作为PySpark Mesos应用程序处理。

我有3个基于Centos:7 linux的Docker容器,目前运行在同一台主机上:

运行Mesos代理的容器“代理”。

安装了Spark和Mesos的容器“test”,在此运行bash shell并从命令行启动以下PySpark测试程序。

from pyspark import SparkContext, SparkConf
from operator import add

# Configure Spark                                               
sp_conf = SparkConf()
sp_conf.setAppName("spark_test")
sp_conf.set("spark.scheduler.mode", "FAIR")
sp_conf.set("spark.dynamicAllocation.enabled", "false")
sp_conf.set("spark.driver.memory", "500m")
sp_conf.set("spark.executor.memory", "500m")
sp_conf.set("spark.executor.cores", 1)
sp_conf.set("spark.cores.max", 1)
sp_conf.set("spark.mesos.executor.home", "/usr/local/spark-2.1.0")
sp_conf.set("spark.executor.uri", "file://usr/local/spark-2.1.0-bin-without-hadoop.tgz")
sc = SparkContext(conf=sp_conf)

# Simple computation
x = [(1.5,100.),(1.5,200.),(1.5,300.),(2.5,150.)]
rdd = sc.parallelize(x,1)
tot = rdd.foldByKey(0,add).collect()
cnt = rdd.countByKey()
time = [t[0] for t in tot]
avg = [t[1]/cnt[t[0]] for t in tot]
print 'tot=', tot
print 'cnt=', cnt
print 't=', time
print 'avg=', avg

我正在使用的相关软件版本如下:

    null

使用Spark的Master=Mesos://127.0.0.1:5050,当我从测试容器中启动我的PySpark测试程序时,Mesos主程序和代理程序的日志中都有活动,在失败前的几秒钟,Mesos UI会显示为作业分配的资源,这些资源完全在可用的范围内。但是,PySpark测试程序随后失败:WARN Scheduler.taskSchedulerImpl:Initial job没有接受任何资源;检查您的群集UI,以确保工作人员已注册并且有足够的资源。

我遵循的步骤如下。

docker run -it --net=host -p 5050:5050 the_master

大师日志的相关摘录显示:

docker run -it --net=host -e MESOS_AGENT_PORT=5051 the_agent

对于Mesos主服务器和代理服务器,我都得到以下警告,但忽略它,因为我目前正在同一台主机上运行所有内容:

绑定到环回接口的主/代理!无法与远程计划程序或代理程序通信。您可能需要将'--IP'标志设置为可路由IP地址。

事实上,我通过分配一个可路由IP地址而不是127.0.0.1进行的测试未能改变我在这里描述的任何行为。

docker run -it --net=host the_test /bin/bash
/usr/local/mesos-1.2.0/build/src/examples/python/test-framework 127.0.0.1:5050

I0417 21:28:36.912542 20 sched.cpp:232]版本:1.2.0
I0417 21:28:36.920013 62 sched.cpp:336]在master@127.0.0.1:5050
I0417 21:28:36.920472 62 sched.cpp:352]未提供凭据。试图在没有身份验证的情况下注册
I0417 21:28:36.924165 62 sched.cpp:759]用be89e739-be8D-430e-b1e9-3fe55fa18459-0000注册的框架
用Framework ID be89e739-be8D-430e-b1e9-3fe55fa18459-0000注册的框架
收到了带有CPU的be89e739-be8d-430e-b1e9-3fe55fa18459-O0的报价:16.0和MEM:119640.0
发射任务0使用offer BE89E739-BE8D-430E-B1E9-3FE55FA18459-O0
发射任务1使用offer BE89E739-BE8D-430E-B1E9-3FE55FA18459-O0
发射任务2使用offer BE89E739-BE8D-430E-B1E9-3FE55FA18459-O0
发射任务3使用offer BE89E739-B1E9-430E-B1E9-430E-B1E9-3FE55FA18459-O0
发射任务4使用offer E9-3FE55FA18459-O0
任务0处于状态task_running
任务1处于状态task_running
任务2处于状态task_running
任务3处于状态task_running
任务4处于状态task_running
任务0处于状态task_finish
任务1处于状态task_finish
任务2处于状态task_finished
任务3处于状态task_finished
任务4处于状态task_finished
所有任务已完成,等待最终框架消息
接收消息:“具有\x00字节的数据”
接收消息:“具有\x00字节的数据”
接收消息:“具有\x00字节的数据”
接收消息:“具有\x00字节的数据”
接收消息:“具有\x00字节的数据”
所有任务已完成,所有消息已接收,退出

从测试容器内部运行PySpark测试程序:

python spark_test.py 

这将产生以下日志输出:

17/04/17 21:29:18警告Util.NativeCodeLoader:无法为您的平台加载native-hadoop库...在适用的情况下使用builtin-java类
I0417 21:29:19.187747 205 sched.cpp:232]版本:1.2.0
I0417 21:29:19.196535 188 sched.cpp:336]在master@127.0.0.1:5050
I0417 21:29:19.197453 188 sched.cpp:352]未提供凭据。试图未经身份验证注册
I0417 21:29:19.201884 195sched.cpp:759]框架注册到be89e739-be8d-430e-b1e9-3fe55fa18459-0001
17/04/17 21:29:34警告scheduler.taskschedulerimpl:初始作业没有接受任何资源;检查群集UI以确保工人已注册并且有足够的资源

我在internet上搜索了这个错误,但我找到的每个页面都表明这是一个由分配给Mesos代理的资源不足造成的常见错误。正如我提到的,Mesos UI表明有足够的资源。请回应,如果你有任何想法,为什么我的火花工作是不接受资源从Mesos或如果你有任何建议的事情,我可以尝试。

谢谢你的帮助。

共有1个答案

梁宪
2023-03-14

此错误现已解决。如果有人遇到类似的问题,我想在我的案例中指出,这是由于Mesos主容器和代理容器中没有设置HADOOP类路径造成的。一旦设置,一切都按预期工作。

 类似资料:
  • 问题内容: 我使用以下命令创建了容器: 以下是命令: 真的没有太多要说的,我希望容器能启动并保持正常运行。这是日志: 问题答案: 您正在尝试运行,它是需要tty 才能运行的交互式外壳。使用,在“分离”模式下运行此命令实际上没有任何意义,但是您可以通过添加到命令行来做到这一点,以确保容器具有与其关联的有效tty并保持连接状态: 在启动分离的容器时,您通常会运行某种长期存在的非交互式进程(例如,或We

  • 本文向大家介绍Docker如何进入启动容器,包括了Docker如何进入启动容器的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。 1、at

  • 问题内容: 要启动容器,我输入以下命令: 但我想在此容器中打开外壳以键入mongo命令。我应该运行什么命令来执行相同的操作? 问题答案: 您可以通过运行以下命令来运行交互式mongo shell: 否则,如果您的容器已经在运行,则可以使用以下命令:

  • 问题内容: 我正在尝试创建一个将自动启动apache的Dockerfile。没事。但是,如果我登录到容器并运行它就可以了。为什么我不能从Dockerfile运行该命令? 问题答案: 问题出在这里:执行此命令时,进程将与外壳分离。但是Docker仅在主进程处于活动状态时才能工作。 解决方案是在 前台 运行Apache 。必须看起来像这样:(仅更改了最后一行)。

  • 问题内容: 这个问题的答案不起作用。 在我可以接受或不接受该标志之前,docker容器始终会退出。我可以列出所有尝试过的命令,但这是 各种标志和的组合。 如何将现有的容器启动到bash中?为什么这么难?这是对Docker的“不当”使用吗? 编辑:我用创建了容器。有关容器的信息: 问题答案: 首先,容器不是虚拟机。容器是用于运行进程的隔离环境。容器的生命周期与内部运行的进程绑定在一起。当进程退出时,