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 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

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章