摘要:方案二和也運行在中。新增刪除節(jié)點變更配置均需要手工介入。公司已有的大多都是容器形式部署在各個服務(wù)器上。目前我們在每個節(jié)點上部署了傳統(tǒng)的。在接下來的階段團隊也會對此做進一步的探索。
回想起第一次接觸Mesos, 當時有很多困惑: "這到底是用來做啥的?跟YARN比有什么優(yōu)勢?有哪些大公司在使用么?"。
然而現(xiàn)在技術(shù)日新月異地發(fā)展, Mesos這個生態(tài)圈也開始被越來越多的團隊熟悉關(guān)注, 像k8s,Swarm之類的重量級競品一個個地涌現(xiàn)。
在踩了或多或少的坑, 現(xiàn)在重新回到這個問題, 簡而言之:
Q1: 這到底是用來做啥的?
通俗地講, 就是把N臺機器當做1臺機器使用
Q2: 跟YARN比有什么優(yōu)勢?
更加通用, 不局限在數(shù)據(jù)分析領(lǐng)域
Q3: 有哪些大公司在使用么?
Mesos在團隊的變遷史做技術(shù)預(yù)研的時候因為看到蘋果在用, 心里倍兒踏實
我們的分析團隊一直都是在傳統(tǒng)的CDH上跑Hadoop生態(tài)。對新業(yè)務(wù)評估時決定擁抱Spark, 但CDH升級困難, Spark版本滯后, 使用起來也遠比Hadoop繁瑣。最后我們決定基于Mesos從頭構(gòu)建新的數(shù)據(jù)分析基礎(chǔ)環(huán)境。
但是Mesos上缺乏我們必須的HDFS和HBase。經(jīng)過討論我們決議了兩種方案。
方案一將HDFS,HBase和Mesos獨立部署在裸機上, 如下圖
(前期方案一)
但實際使用時會因為HDFS和HBase并非在Mesos的隔離環(huán)境下運行, 與Mesos會競爭系統(tǒng)資源。基于這樣的考慮,我們否決了這種方案。
方案二HDFS和HBase也運行在Mesos中。這種方案避免了上述問題, 但也意味著我們需要自己實現(xiàn)這兩個服務(wù)在Mesos中的部署。團隊的大神擔起了這個任務(wù), 制作了HDFS和HBase的Docker鏡像, 通過marathon部署在Mesos中。
(前期方案二)
基于這樣的部署形式, 團隊順利地過渡到Spark生態(tài), 讓我們的分析系統(tǒng)更加飛快地運轉(zhuǎn)。
(二) 好馬還需配好鞍, 這個鞍叫DC/OSDC/OS可謂Mesos生態(tài)里的Cloudera。但由于其商業(yè)收費, 對于我們這樣的初創(chuàng)團隊一直都是"可遠觀而不可褻玩"。
直到其開放了社區(qū)版, 我們才得以略窺一斑。
在沒有引入DC/OS之前, 對于管理Mesos集群我們碰到以下幾個痛點:
沒有自動化運維腳本。新增、刪除節(jié)點、變更配置均需要手工介入。
沒有直觀的可視化圖表來查看各項運行指標。Mesos自帶的界面相對比較簡單,體驗不佳。
沒有集中的日志管理。
安裝一些通用的服務(wù)比較繁瑣。
通過DC/OS管理Mesos集群, 可以輕松地使用Bootstrap節(jié)點方便地管理各個節(jié)點, 其服務(wù)也都通過systemd來管理依賴, 避免了手工管理的繁瑣。
通過官方的教程, 可以很方便地配置安裝節(jié)點, 以下是范例:
agent_list: - 10.10.11.48 - 10.10.11.29 - 10.10.11.56 - 10.10.10.188 - 10.10.11.57 - 10.10.11.88 - 10.10.11.89 - 10.10.10.113 - 10.10.10.168 # Use this bootstrap_url value unless you have moved the DC/OS installer assets. bootstrap_url: file:///opt/dcos_install_tmp cluster_name: maxleap exhibitor_storage_backend: zookeeper exhibitor_zk_hosts: 10.10.10.125:2181,10.10.10.149:2181,10.10.10.122:2181 exhibitor_zk_path: /dcos_uat log_directory: /genconf/logs master_discovery: static master_list: - 10.10.10.187 - 10.10.10.176 - 10.10.10.164 process_timeout: 600 resolvers: - 10.10.10.156 ssh_key_path: /genconf/ssh_key ssh_port: 22 ssh_user: root oauth_enabled: "false" telemetry_enabled: "false" #roles: slave_public #weights: slave_public=2
UI簡潔易用, 比較常用的一些功能大多都已包含。通過使用Universe的包管理器, 我們可以很方便地一鍵安裝各種常見服務(wù)。
(DC/OS圖示)
DC/OS默認也給我們安裝了mesos-dns, 我們可以使用DNS的A記錄輪詢來實現(xiàn)簡陋的服務(wù)發(fā)現(xiàn)。通過marathon部署服務(wù)現(xiàn)在可以直接使用服務(wù)名.marathon.mesos直接定位服務(wù)所在節(jié)點。
在某些場合下這已經(jīng)足夠好用。Universe集成的HDFS也使用了DNS來定位各類型的節(jié)點, 這樣帶來的很大的方便就是像core-site.xml,hdfs-site.xml這樣的配置文件就相對穩(wěn)定(之前我們使用主機hostname來管理, 當節(jié)點發(fā)生變動時需要所有程序變更配置文件)。
接下來我們開始嘗試改造之前的基礎(chǔ)服務(wù)。
HDFS綜上的幾個優(yōu)點, 我們將之前Spark的HDFS切換到Universe提供的版本, 這個版本的好處是其自己實現(xiàn)了一個Mesos的framework來實現(xiàn)HA, 其數(shù)據(jù)也使用了Mesos的持久化卷。美中不足的是其使用了mesos原生的隔離, 而沒有使用docker, 鑒于國內(nèi)的網(wǎng)絡(luò)環(huán)境, 其下載速度慘不忍睹。為此我們搭建了Universe私服, 改寫了所有的資源文件指向到內(nèi)網(wǎng), 加快了部署速度。官方的教程很詳細, 這里是傳送門。
HBase對于HBase, 我們也重新制作了docker鏡像。以下是Dockerfile:
# 基于debian的oracle-jdk8 FROM 10.10.10.160:8010/zero/java:8 MAINTAINER wcai wcai@maxleap.com ENV HBASE_VERSION="1.2.1" HADOOP_VERSION="2.5.2" HBASE_HOME="/hbase" HADOOP_CONF_DIR="/etc/hadoop" JAVA_LIBRARY_PATH="/usr/lib/hadoop" HBASE_CLASSPATH="/etc/hadoop" HBASE_MANAGES_ZK="false" RUN apt-get update -y && apt-get install curl -y && mkdir -p /var/log/hbase && curl -o /tmp/hbase.tar.gz http://mirrors.aliyun.com/apache/hbase/${HBASE_VERSION}/hbase-${HBASE_VERSION}-bin.tar.gz && tar xvzf /tmp/hbase.tar.gz -C /tmp/ && rm -f /tmp/hbase.tar.gz && mv /tmp/hbase* ${HBASE_HOME} && rm -rf ${HBASE_HOME}/docs ${HBASE_HOME}/bin/*.cmd ${HBASE_HOME}/conf/*.cmd ${HBASE_HOME}/*.txt && curl -o /tmp/hadoop.tar.gz http://mirrors.aliyun.com/apache/hadoop/core/hadoop-${HADOOP_VERSION}/hadoop-${HADOOP_VERSION}.tar.gz && tar xvzf /tmp/hadoop.tar.gz -C /tmp && rm -f /tmp/hadoop.tar.gz && mv /tmp/hadoop* /tmp/hadoop && mv /tmp/hadoop/lib/native /usr/lib/hadoop && rm -rf /tmp/hadoop && mkdir -p ${HADOOP_CONF_DIR} && apt-get remove curl -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* WORKDIR ${HBASE_HOME} # 默認集成的hdfs配置, 也可通過marathon的uris掛載進去。 COPY ./conf/* /etc/hadoop/ ENTRYPOINT [ "bin/hbase" ]
HMaster的marathon配置范例:
{ "id": "/hbase/master", "args": [ "master", "-Dhbase.master.port=6000", "-Dhbase.master.info.port=6010", "-Dhbase.zookeeper.quorum=master.mesos", "-Dzookeeper.znode.parent=/hbase", "-Dhbase.rootdir=hdfs:///hbase", "-Dhbase.cluster.distributed=true", "start" ], "instances": 1, "cpus": 1, "mem": 2048, "container": { "type": "DOCKER", "docker": { "image": "10.10.10.160:8010/zero/hbase:1.2.1", "forcePullImage": true, "network": "HOST" } } }
HRegion的marathon配置范例:
{ "id": "/hbase/region", "args": [ "regionserver", "-Dhbase.regionserver.port=6020", "-Dhbase.regionserver.info.port=6021", "-Dhbase.zookeeper.quorum=master.mesos", "-Dzookeeper.znode.parent=/hbase", "-Dhbase.rootdir=hdfs:///hbase", "-Dhbase.cluster.distributed=true", "start" ], "instances": 4, "constraints": [["hostname", "UNIQUE"]], "cpus": 1, "mem": 1024, "container": { "type": "DOCKER", "docker": { "image": "10.10.10.160:8010/zero/hbase:1.2.1", "forcePullImage": true, "network": "HOST" } } }
以上僅為范例, 其他類型的實例也可類似啟動, 如backup, thrift2, rest等, 在此略過。
另外可以進一步定制entrypoint, 啟動的端口可以通過marathon管理的PORT?來定義。甚至可以讓marathon給你隨機安排端口。
Spark雖然Universe自帶了Spark的dispatcher服務(wù),默認使用了dist-url的方式, 但我們想讓Spark運行時全部在docker中。(老板~ 再來幾串Dockerfile)
首先是mesos基礎(chǔ)鏡像
FROM 10.10.10.160:8010/zero/java:8 MAINTAINER wcai wcai@maxleap.com # 0.28.0-2.0.16.debian81 # 0.28.1-2.0.20.debian81 # 0.28.2-2.0.27.debian81 ENV MESOS_PACKAGE_VERSION="0.28.1-2.0.20.debian81" MESOS_NATIVE_LIBRARY="/usr/lib/libmesos.so" MESOS_NATIVE_JAVA_LIBRARY="/usr/lib/libmesos.so" # 順帶把hdfs的native-lib也集成進去 COPY lib/* /usr/lib/ RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E56151BF && echo "deb http://repos.mesosphere.com/debian jessie main" | tee /etc/apt/sources.list.d/mesosphere.list && apt-get update && apt-get install --no-install-recommends -y --force-yes mesos=${MESOS_PACKAGE_VERSION} && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* && ln -snf /opt/jdk/bin/java /etc/alternatives/java CMD [ "bash" ]
然后是Spark的
FROM 10.10.10.160:8010/zero/mesos:0.28.1 MAINTAINER wcai wcai@maxleap.com ENV SPARK_HOME="/opt/spark" SPARK_VERSION="2.0.0" HADOOP_VERSION="2.6" RUN apt-get update -y && apt-get install curl -y && curl -o /tmp/spark.tar.gz http://mirrors.aliyun.com/apache/spark/spark-${SPARK_VERSION}/spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}.tgz && tar xvzf /tmp/spark.tar.gz -C /opt && mv /opt/spark* /opt/spark && rm -rf /tmp/spark.tar.gz $SPARK_HOME/jars/*yarn*.jar $SPARK_HOME/bin/*.cmd $SPARK_HOME/data $SPARK_HOME/examples $SPARK_HOME/python $SPARK_HOME/yarn $SPARK_HOME/R $SPARK_HOME/licenses $SPARK_HOME/CHANGES.txt $SPARK_HOME/README.md $SPARK_HOME/NOTICE $SPARK_HOME/LICENSE $SPARK_HOME/conf/* && apt-get remove curl -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # 如果你想加入一些自己的配置 COPY ./spark-defaults.conf $SPARK_HOME/conf/spark-defaults.conf ENV TZ=Asia/Shanghai WORKDIR $SPARK_HOME CMD [ "bash" ]
最后是spark-mesos-dispatcher的
FROM 10.10.10.160:8010/zero/spark:2.0.0 MAINTAINER wcai wcai@maxleap.com ENV PORT0="8081" PORT1="7077" SPARK_DISPATCHER_NAME="spark" ZK="master.mesos:2181" ZK_MESOS_ROOT="mesos" COPY ./entrypoint.sh /usr/local/bin/entrypoint CMD [ "entrypoint" ]
其中的entrypoint腳本
#! /bin/sh export PATH=$PATH:$HADOOP_PREFIX/bin if [ -z ${LIBPROCESS_IP} ]; then export LIBPROCESS_IP=$(ip addr show eth0 | grep -Eo "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" | head -1) export SPARK_LOCAL_IP=${LIBPROCESS_IP} fi if [ -z ${LIBPROCESS_IP} ]; then echo "error: LIBPROCESS_IP is blank." exit 1 fi export MESOS_MASTER="mesos://zk://${ZK}/${ZK_MESOS_ROOT}" echo "************************************************************" echo "LIBPROCESS_IP: ${LIBPROCESS_IP}" echo "MASTER: ${MESOS_MASTER}" echo "WEBUI PORT: ${PORT0}" echo "RPC PORT: ${PORT1}" echo "************************************************************" $SPARK_HOME/bin/spark-class org.apache.spark.deploy.mesos.MesosClusterDispatcher --master ${MESOS_MASTER} --host ${LIBPROCESS_IP} --port ${PORT1} --webui-port ${PORT0} --name "${SPARK_DISPATCHER_NAME}" --zk ${ZK} --properties-file ${SPARK_HOME}/conf/spark-defaults.conf
大功告成, 只需要在marathon中啟動dispatcher。spark-submit時指定spark.mesos.executor.docker.image為spark的docker鏡像即可。你可以制作不同版本的spark鏡像, 隨意切換。(麻麻再也不用擔心我追不上spark官方的升級速度了)
(三) marathon-lb, 你值得擁有Mesos的資源專供數(shù)據(jù)分析團隊使用是相當浪費的。為此團隊開始嘗試將公司的其他服務(wù)陸續(xù)遷移進來。
公司已有的Rest API大多都是docker容器形式部署在各個服務(wù)器上。本來的計劃是通過marathon部署, 使用域名做服務(wù)發(fā)現(xiàn), 然后nginx反向代理到公網(wǎng)。但實際實施中踩了個坑。因為nginx的配置域名的upstream很成問題, 一旦指向的ip變動就會導(dǎo)致解析失敗。嘗試使用網(wǎng)上的各種方法(如配置resolver設(shè)置upstrem變量, 改用tengine的ngx_http_upstream_dynamic_module) 都無法完美解決這個問題。
最后團隊還是決定引入marathon-lb, 替代原先基于mesos-dns的服務(wù)發(fā)現(xiàn)。
marathon-lb其實是一個HAProxy的包裝, 它能動態(tài)地綁定marathon的服務(wù)。我們以internal形式部署, 某個服務(wù)如果需要做服務(wù)發(fā)現(xiàn)負載勻衡, 只需要加一個label為HAPROXY_GROUP: internal即可, 非常方便。這樣最終的形態(tài)就變成如下的架構(gòu):
(部署架構(gòu))
在小范圍的服務(wù)遷移測試穩(wěn)定之后, 團隊陸續(xù)將一些其他服務(wù)遷移過來, 也釋放了一些服務(wù)器資源, 將這些空閑的服務(wù)器也重新回收納入到我們的Mesos集群中。
在此之后, 維護這些服務(wù)變得簡單便捷, 泡杯咖啡, 點點鼠標就可以輕松搞定, 運維壓力減小了很多。
未來的愿景(補輪子篇)擁有了以上的這些基礎(chǔ)架構(gòu)服務(wù)之后, 一切都可以運轉(zhuǎn)起來。但總有一些痛點需要我們自己造輪子去解決。
作業(yè)管理當你有大量的Spark批處理作業(yè)時, 一個很頭疼的事情就是如何去調(diào)度這些作業(yè)。
以前我們通過chronos來做執(zhí)行管理, 但這個工具太過簡陋, 對于cluster-mode下的spark作業(yè), 如果你想定義依賴, 則需要使用它的異步回調(diào)來通知作業(yè)已完成, 這樣一來無可避免需要侵入業(yè)務(wù)代碼。(程序猿表示如果要妥協(xié)強行寫這些跟業(yè)務(wù)半點關(guān)系都沒有的代碼, 我選擇狗帶)
我們需要一個零侵入的Spark通用作業(yè)流程解決方案。為此我們自己實現(xiàn)了一個小項目(Armyant), 旨在解決這個問題。
整體架構(gòu)很簡單, 通過Activiti做流程引擎, Quartz做定時調(diào)度, Zookeeper來做狀態(tài)通知:
(armyant架構(gòu)圖)
外加一套易用的UI, 第一個版本就能順利跑起來。
(armyant圖示1)
后續(xù)又實現(xiàn)了一個mesos framework, 這樣也可以定義一些one-off形式的任意docker任務(wù)。接著再向上封裝一下, 包裝一層任意的Java服務(wù)也很方便。當然mesos生態(tài)圈其實也有很多專門為one-off形式的作業(yè)而生的工具, 如eremetic等等。
(armyant圖示2)
雖然DC/OS社區(qū)版可以查看當前的運行狀態(tài), 但它沒有監(jiān)控報警相關(guān)的功能(天下沒有免費的午餐)。目前我們在每個節(jié)點上部署了傳統(tǒng)的nagios。
在接下來的階段, 團隊也會對此做進一步的探索。
日志系統(tǒng)DC/OS再配合mesos自帶的日志其實已經(jīng)很大程度上方便了查看日志的需求。甚至DC/OS本身也可以接入ELK。但我們期望有更高級的日志分類收集, 這需要定制一些收集處理模塊。團隊的大神親自操刀正在實現(xiàn)這些高級的功能, 隨著業(yè)務(wù)的擴張,能有一個可以靈活定制的日志處理系統(tǒng)是很有好處的。我的Leader也常說, 大廠和小廠的東西, 區(qū)別就在于大廠的監(jiān)控報警運維系統(tǒng)做得非常完善易用。
文末最后, 作為一個初創(chuàng)小團隊, 筆者覺得Mesos對我們的利好是不言而喻的。也希望讓我們的集群更加穩(wěn)定健壯, 來支撐我們?nèi)找嬖鲩L的業(yè)務(wù)系統(tǒng)。
技術(shù)活動預(yù)告
主題:技術(shù)分享沙龍 | 知云善用,讓移動研發(fā)更快速簡單
時間:2016年8月28日 周日 14:00-17:00
地點:COCOSPACE北虹橋站·上海市嘉定區(qū)鶴望路679弄2號樓一層
報名鏈接:http://t.cn/Rt9ooRw
作者信息
本文系力譜宿云LeapCloud旗下MaxLeap團隊_數(shù)據(jù)分析組成員:蔡偉偉 【原創(chuàng)】
力譜宿云LeapCloud首發(fā)地址:https://blog.maxleap.cn/archi...
蔡偉偉,本科畢業(yè)于同濟大學(xué),從事Java開發(fā)多年,后端碼農(nóng)一枚。先后從事ETL、AdHoc報表、垂直爬蟲、App制作云服務(wù)、動態(tài)用戶分群等產(chǎn)品的設(shè)計研發(fā)工作。在互聯(lián)網(wǎng)領(lǐng)域混跡多年,各方面均有所涉獵。現(xiàn)任MaxLeap數(shù)據(jù)分析組開發(fā)人員,負責(zé)Hadoop、Spark相關(guān)的分析系統(tǒng)架構(gòu)設(shè)計與開發(fā)。
相關(guān)文章
微服務(wù)實戰(zhàn):從架構(gòu)到發(fā)布(一)
微服務(wù)實戰(zhàn):從架構(gòu)到發(fā)布(二)
移動云平臺的基礎(chǔ)架構(gòu)之旅(一):云應(yīng)用
從應(yīng)用到平臺 – 云服務(wù)架構(gòu)的演進過程
作者往期佳作_曾選登CSDN頭版
一個JAVA碼農(nóng)的Node之旅
對移動研發(fā)相關(guān)技術(shù)/活動感興趣的小伙伴,歡迎掃以下二維碼,關(guān)注微信公眾號:
活動預(yù)告
報名鏈接:http://t.cn/Rt9ooRw
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26673.html
摘要:納尼隔壁少林派表示自家金剛技壓群雄在座各位都是。。。納尼你覺得寫太繁瑣了你不喜歡我們還有或者等等一大堆工具呢。納尼沒有你還是覺得無法接受好吧那么筆者推薦類似這類更友好的工具你可以導(dǎo)入導(dǎo)出其他格式也可以使用其來撰寫。 說起微服務(wù), 想必現(xiàn)在的技術(shù)圈內(nèi)人士個個都能談笑風(fēng)云, 娓娓道來。的確, 技術(shù)變革日新月異, 各種工具框架雨后春筍般涌現(xiàn), 現(xiàn)在我們可以輕巧便捷地根據(jù)自己的業(yè)務(wù)需求, 構(gòu)建...
摘要:從這個結(jié)果來看,洛奇非常適合推薦給喜歡終結(jié)者的用戶的。你需要能夠深入了解所使用的評分方法才能建立起真正優(yōu)秀的推薦系統(tǒng)。使用,阿甘正傳的評分是,幾乎為。 聚合:找出喜歡這部電影的人們同時還喜歡哪些電影 ? ? ? ?假設(shè)你運營了一個電影網(wǎng)站,你有很多用戶,并且想知道如何推薦給這些用戶他們喜歡的電影。一個辦法是,把每個用戶作為一個文檔創(chuàng)建索引,如下所示(movies_liked被設(shè)置為被分...
摘要:由谷歌開發(fā),允許你在許多不同的主機上管理容器化應(yīng)用程序。它已經(jīng)被完全開源,谷歌在年首次宣布開發(fā)它,第一版在夏天的時候發(fā)布。除了最近幾年的收獲,本身也是基于谷歌內(nèi)部十多年使用容器技術(shù)的經(jīng)驗。 基于云的基礎(chǔ)設(shè)施,容器,微服務(wù)和新編程平臺在世界范圍占據(jù)了一大塊媒體領(lǐng)域,橫掃IT界。Docker、容器的使用在這幾個月內(nèi)呈爆炸式增長,已經(jīng)提交了20億的鏡像pulls;鏡像數(shù)在2015年11月就已...
摘要:今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享來自社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云肖德時。第二級調(diào)度由被稱作的組件組成。它們是最小的部署單元,由統(tǒng)一創(chuàng)建調(diào)度管理。 今天小數(shù)給大家?guī)硪黄夹g(shù)正能量滿滿的分享——來自KVM社區(qū)線上群分享的實錄,分享嘉賓是數(shù)人云CTO肖德時。 嘉賓介紹: 肖德時,數(shù)人云CTO 十五年計算機行業(yè)從業(yè)經(jīng)驗,曾為紅帽 Engineering Service ...
閱讀 711·2021-11-18 10:02
閱讀 2250·2021-11-15 18:13
閱讀 3179·2021-11-15 11:38
閱讀 2965·2021-09-22 15:55
閱讀 3686·2021-08-09 13:43
閱讀 2456·2021-07-25 14:19
閱讀 2464·2019-08-30 14:15
閱讀 3459·2019-08-30 14:15