所在的團隊需要引入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 root@node1://usr/app/,scp /usr/app/mesos root@node2://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