mesos运行spark框架

所在的团队需要引入mesos平台以便运行spark并行计算,花了几天时间部署并测试运行成功,将步骤及遇到的问题整理一下。

1、mesos安装。

先是采用第三方的二进制包mesosphere安装,然后配置。这一个叫简单,下载到二进制包即可。

然后采用了源码编译的安装,安装步骤及遇到的问题如下说明:

1.1 下载meso源码包,链接:https://pan.baidu.com/s/1nwCwFih 密码:57oa

1.2 解压并 cd mesos,然后依次

./bootstra 

mkdir build && cd build   ## 创建单独的编译目录

../configure --prefix=/usr/app/mesos  ## 指定安装目录

make

make install

1.2 配置并启动mesos

cd /usr/app/mesos/etc/mesos  ##参见1.2中configure指定的安装目录,以下的配置均在此目录下进行

cat mesos-agent-env.sh.template > mesos-agent-env.sh

cat mesos-deploy-env.sh.template > mesos-deploy-env.sh

cat mesos-master-env.sh.template > mesos-master-env.sh

cat mesos-slave-env.sh.template > mesos-slave-env.sh

在mesos-master-env.sh添加配置,如果添加了zookeeper,也需要配置在此文件中

export MESOS_log_dir=/usr/app/mesos/log

export MESOS_work_dir=/usr/app/mesos/wk

配置mesos-agent-env.sh和mesos-slave-env.sh(两个文件的配置方法是一样的)

export MESOS_master=master:5050  ## master为/etc/hosts中指定的与ip的映射
export MESOS_log_dir=/usr/app/mesos/log  ## 手动创建的目录
export MESOS_work_dir=/usr/app/mesos/wkagent  ## 手动创建的目录用于存储slave端的资料

export MESOS_isolation=cgroups

添加masters文件并经master信息加进去:

echo master > masters   ## 注意需要在 /etc/hosts中进行映射的配置

添加slaves信息

vim slaves   ## 我在master上也启动了一个slave

master  
slave1

slave2

修改mesos-daemon.sh,将ulimit -n 8192修改为ulimit -n 1024,这条指令是在向服务器索要资源,但是 通过ulimit -a查看可以看出-n为1024,系统要求这个数不能更大,因此把8192更改为1024即可,当然也可以将系统中的inode调大

将mesos整个文件夹拷贝到node1及node2

scp /usr/app/mesos [email protected]://usr/app/,scp /usr/app/mesos [email protected]://usr/app/

启动集群:(我的三个虚拟机没有配置免密登录,使用的是如下方式启动)

在master机器上启动master,注意需要以后台方式启动:nohup /usr/app/mesos/sbin/mesos-master --ip=172.19.37.35 --work_dir=/usr/app/mesos/wk/ &

分别在slaves端启动agent:nohup /usr/app/mesos/sbin/mesos-agent --master=172.19.37.35:5050 --work_dir=/usr/app/mesos/wkagent/ &

启动成功后在浏览器输入:http://172.19.37.35:5050,可打开mesos的web ui如下所示:

mesos运行spark框架

此处有疑问:slave向master提交的可用资源是怎么计算的,如我的一个slave显示的内存信息为
              total        used        free      shared  buff/cache   available
Mem:           992M        105M         80M        6.8M        806M        725M
Swap:          2.0G          0B        2.0G
但是master端采集的mem为481M

编译的时候常见问题及解决

1、no mesos in java.library.path | ava.lang.UnsatisfiedLinkError

需要设置环境变量:LD_LIBRARY_PATH ,添加mesos的lib路径如export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/app/mesos/lib/libmesos.so 

Caused by: java.util.concurrent.TimeoutException: Futures timed out after [10 seconds]
似乎是超时导致了spark停止运行,client模式,在webui上看不到framework信息




/opt/spark-2.2.0-bin-hadoop2.7
之前部署的是2.2,有引入了2.1,但是在启动2.1版的dispatcher时总是失败,提示启动的是2.2版本下的dispather,将2.2版本下的


配置也修改为mesos方式


集群方式启动mesos上的spark是报错:(启动方式应该为./start-mesos-dispatcher.sh --master mesos://172.19.37.35:5050)
failed to launch: nice -n 0 /opt/spark-2.2.0-bin-hadoop2.7/bin/spark-class 


org.apache.spark.deploy.mesos.MesosClusterDispatcher --host master --port 7077 mesos://172.19.37.35:5050




启动spark的dispatcher服务后,集群方式启动spark包如下问题:(客户端方式启动正常)
Unable to connect to server mesos://172.19.37.35:7070.


start-mesos-dispatcher.sh启动之后就在mesos的webui找那个显示了spark的framework信息


问题,spark的driver我申请了500M,但是mesos分配了532M,其它的32M是用于spark的那个啥应用?(资源都会多分配一些)


在mesos上运行spark,任务宕掉了怎么定位问题????????????????????


同样的3台虚拟机,同样的资源配置,使用saprk的standalone提交,可以正常运行,但是通过mesos提交(mesos中统计的资源已经很


少了)就无法运行,必须降低资源配置


因为资源不足导致sch批处理失败


重新启动mesos集群前,最好先清空agent以及master上一次启动时指定的目录


如果在启动mesos的master或agent的时候使用了master、node等映射,需要在启动mesos的webui的机器上配置hosts,在Windows上的


路径为C:\Windows\System32\drivers\etc\hosts




出现如下的错误:---------------------------------------------------------------------------------------
根据网上的帖子说明应该是重复启动了spark相关的服务,端口被占用了。将虚拟机停掉后,重新启动mesos以及spark的dispatcher服


务,可以正常执行sch批处理
Error initializing SparkContext.
java.net.BindException: Cannot assign requested address: Service 'sparkDriver' failed after 16 retries (on a random 


free port)! 
Consider explicitly setting the appropriate binding address for the service 'sparkDriver' (for example 


spark.driver.bindAddress for SparkDriver) to the correct binding address.
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:127)
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:501)
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1218)
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:496)
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:481)
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:965)
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:210)
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:353)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:399)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:446)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:131)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)
at java.lang.Thread.run(Thread.java:748)

-----------------------------------------------------------------------------------------------------------------


mesos运行spark框架

-classcom.navinfo.had.spark.sch.App \

--mastermesos://172.19.37.35:7077 \

--deploy-modecluster \

--supervise\

--driver-cores2 \

--driver-memory850m \

--total-executor-cores2 \

--executor-memory1g \

以上配置资源分配截图,可以看出node1根本没有使用。两个executor均在node2上执行(但是两个executor共需要2Gmem,node2上只分配了1.4G就可以开始两个executor的运行???);driver