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如下所示:
此处有疑问: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)
-----------------------------------------------------------------------------------------------------------------
-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