1.-XX:ParallelGCThreads=cpus
2.-XX:ConcGCThreads=cpus/2
CMS是常見的收集器,它設置并行度的時候是取機器的核數(shù)來計算的。如果給容器分配2個CPU,JVM仍然按照宿主機的核數(shù)初始化這些線程數(shù)量,GC的回收效率會降低。想規(guī)避這個問題有兩點,第一點是掛載假的Proc文件系統(tǒng),比如Lxcfs。第二種是使用類似Hyper的基于Hypervisor的容器。
Mesos容器化要求關注兩類參數(shù):配置參數(shù)和run參數(shù)。
3.需要關注的配置參數(shù)
1.MESOS_systemd_enable_support
2.MESOS_docker_mesos_image
3.MESOS_docker_socket
4.GLOG_max_log_size
5.GLOG_stop_logging_if_full_disk
Mesos是配置參數(shù)最多的。在物理機上,Mesos默認使用系統(tǒng)的Systemd管理任務,如果把Mesos通過Docker run的方式啟動起來,用戶就要關systemd_Enable_support,防止Mesos Slave拉取容器運行時數(shù)據(jù)造成混亂。
第二個是Docker_Mesos_Image,這個配置告訴Mesos Slave,當前是運行在容器內(nèi)的。在物理機環(huán)境下,Mesos Slave進程宕掉重啟,、就會根據(jù)executor進程/容器的名字做recovery動作。但是在容器內(nèi),宕機后executor全部回收了,重啟容器,Slave認為是一個新環(huán)境,跳過覆蓋動作并自動下發(fā)任務,所以任務有可能會發(fā)重。
Docker_Socket會告訴Mesos,Docker指定的遠端地址或本地文件,是默認掛到Mesos容器里的。用戶如果直接執(zhí)行文件,會導致文件錯誤,消息調(diào)取失敗。這個時候推薦一個簡單的辦法:把當前物理機的目錄掛到容器中并單獨命名,相當于在容器內(nèi)直接訪問整個物理機的路徑,再重新指定它的地址,這樣每次一有變動Mesos就能夠發(fā)現(xiàn),做自己的指令。
后面兩個是Mesos Logging配置,調(diào)整生成logging文件的一些行為。
需要關注的run參數(shù)
1.–pid=host
2.–privileged
3.–net=host (optional)
4.root user
啟動Slave容器的時候最好不加Pid Namespace,因為容器內(nèi)Pid=1的進程一般都是你的應用程序,易導致子進程都無法回收,或者采用tini一類的進程啟動應用達到相同的目的。–privileged和root user主要是針對Mesos的持久化卷功能,否則無法mount到容器內(nèi),–net=host是出于網(wǎng)絡效率的考慮,畢竟源生的bridge模式效率比較低。
圖4:去哪兒數(shù)據(jù)平臺部署流程圖
基于Marathon的Streaming調(diào)度
拿Spark>
圖5:替代Spark Mesos Dispatcher
不過還是有一些問題存在:
Checkpoint & Block
1.動態(tài)預留 & 持久化卷
2.setJars
3.清理無效的卷
關于Checkpoint&Block,通過動態(tài)預留的功能可以把這個任務直接“釘死”在這臺機器上,如果它掛的話可以直接在原機器上重啟,并掛載volume繼續(xù)工作。如果不用它預留的話,可能調(diào)度到其他機器上,找不到數(shù)據(jù)Block,造成數(shù)據(jù)的丟失或者重復處理。
持久化卷是Mesos提供的功能,需要考慮它的數(shù)據(jù)永存,Mesos提供了一種方案:把本地磁盤升級成一個目錄,把這個轉移到Docker里。每次寫數(shù)據(jù)到本地時,能直接通過持久化卷來維護,免去手工維護的成本。但它目前有一個問題,如果任務已被回收,它持久化卷的數(shù)據(jù)是不會自己刪掉的,需要寫一個腳本定時輪巡并對應刪掉。
臨時文件
1.java.io.tmpdir=/mnt/mesos/sandbox
2.spark.local.dir=/mnt/mesos/sandbox
如果使用持久化卷,需要修改這兩個配置,把這一些臨時文件寫進去,比如shuffle文件等。如果配置持久化卷的話,用戶也可以寫持久化卷的路徑。
Coarse-Grained
Spark有兩種資源調(diào)度模式:細粒度和粗粒度。目前已經(jīng)不太推薦細粒度了,考慮到細粒度會盡可能的把所有資源占滿,容易導致Mesos資源被耗盡,所以這個時候更傾向選擇粗粒度模式。