使用數(shù)人云運(yùn)行 Spark 集群

Spark 是 UC Berkeley AMP lab 開源的類 Hadoop MapReduce 的通用的并行計(jì)算框架辰妙,Spark 基于 map reduce 算法實(shí)現(xiàn)的分布式計(jì)算,擁有 Hadoop MapReduce 所具有的優(yōu)點(diǎn)架曹,并且 能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的 map reduce 的算法榔至。本文詳細(xì)介紹了基于Mesos 進(jìn)行集群資源調(diào)度的數(shù)人云抵赢,如何部署Spark集群。

Spark 支持三種分布式部署方式唧取,分別是 Standalone瓣俯、Spark on Yarn 以及 Spark on Mesos。其中 Spark on Mesos 模式是很多公司采用的模式兵怯,并且 Spark 官方也推薦這種模式彩匕。正是由于 Spark 開發(fā)之初就考慮到支持 Mesos,因此媒区,目前而言驼仪,Spark 運(yùn)行在 Mesos 上會(huì)比運(yùn)行在 Yarn 上更加靈活,更加自然袜漩。數(shù)人云集群正是通過 Mesos 進(jìn)行集群資源調(diào)度绪爸,因此,數(shù)人云部署 Spark 集群宙攻,有著天然的優(yōu)勢奠货。

接下來,我們就來體驗(yàn)一下用數(shù)人云部署 Spark 集群吧座掘。

<h3 id="step1">第一步 制作鏡像</h3>

首先递惋,我們需要在 Docker 環(huán)境下制作 Spark 的 Docker 鏡像柔滔,并推送至可訪問的 Docker 鏡像倉庫。

1. 編寫如下配置文件

(1) mesos-site.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    
    <configuration>
        
      <property>
        <name>mesos.hdfs.namenode.cpus</name>
        <value>0.25</value>
      </property>
    
      <property>
        <name>mesos.hdfs.datanode.cpus</name>
        <value>0.25</value>
      </property>
        
      <property>
        <name>mesos.hdfs.journalnode.cpus</name>
        <value>0.25</value>
      </property>
        
      <property>
        <name>mesos.hdfs.executor.cpus</name>
        <value>0.1</value>
      </property>
        
      <property>
        <name>mesos.hdfs.data.dir</name>
        <description>The primary data directory in HDFS</description>
        <value>/var/lib/hdfs/data</value>
      </property>
    
      <property>
        <name>mesos.hdfs.framework.mnt.path</name>
        <value>/opt/mesosphere</value>
        <description>This is the default for all DCOS installs</description>
      </property>
    
      <property>
        <name>mesos.hdfs.state.zk</name>
        <value>master.mesos:2181</value>
        <description>See the Mesos DNS config file for explanation for this</description>
      </property>
    
      <property>
        <name>mesos.master.uri</name>
        <value>zk://master.mesos:2181/mesos</value>
        <description>See the Mesos DNS config file for explanation for this</description>
      </property>
    
      <property>
        <name>mesos.hdfs.zkfc.ha.zookeeper.quorum</name>
        <value>master.mesos:2181</value>
        <description>See the Mesos DNS config file for explanation for this</description>
      </property>
    
      <property>
        <name>mesos.hdfs.mesosdns</name>
          <value>true</value>
        <description>All DCOS installs come with mesos DNS to maintain static configurations</description>
      </property>
    
      <property>
        <name>mesos.hdfs.native-hadoop-binaries</name>
        <value>true</value>
        <description>DCOS comes with pre-distributed HDFS binaries in a single-tenant environment</description>
      </property>
    
      <property>
        <name>mesos.native.library</name>
        <value>/opt/mesosphere/lib/libmesos.so</value>
      </property>
      
      <property>
        <name>mesos.hdfs.ld-library-path</name>
        <value>/opt/mesosphere/lib</value>
      </property>
    </configuration>

(2) hdfs-site.xml

    <configuration>
      <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
      </property>
    
      <property>
        <name>dfs.nameservice.id</name>
        <value>hdfs</value>
      </property>
    
      <property>
        <name>dfs.nameservices</name>
        <value>hdfs</value>
      </property>
    
      <property>
        <name>dfs.ha.namenodes.hdfs</name>
        <value>nn1,nn2</value>
      </property>
    
      <property>
        <name>dfs.namenode.rpc-address.hdfs.nn1</name>
        <value>namenode1.hdfs.mesos:50071</value>
      </property>
    
      <property>
        <name>dfs.namenode.http-address.hdfs.nn1</name>
        <value>namenode1.hdfs.mesos:50070</value>
      </property>
    
      <property>
        <name>dfs.namenode.rpc-address.hdfs.nn2</name>
        <value>namenode2.hdfs.mesos:50071</value>
      </property>
    
      <property>
        <name>dfs.namenode.http-address.hdfs.nn2</name>
        <value>namenode2.hdfs.mesos:50070</value>
      </property>
    
      <property>
        <name>dfs.client.failover.proxy.provider.hdfs</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
      </property>
    </configuration>

注:對接 HDFS 時(shí)萍虽,需要將 dfs.namenode.http-address.hdfs.nn1 配置為 HDFS Namenode 地址睛廊;

(3) core-site.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    
    <configuration>
      <property>
        <name>fs.default.name</name>
        <value>hdfs://hdfs</value>
      </property>
      <property>
        <name>hadoop.proxyuser.hue.hosts</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.hue.groups</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.root.hosts</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.root.groups</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.httpfs.hosts</name>
        <value>*</value>
      </property>
      <property>
        <name>hadoop.proxyuser.httpfs.groups</name>
        <value>*</value>
      </property>
    </configuration>

(4) spark-env.sh

  export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:jre/bin/java::")
  export MASTER=mesos://zk://${ZOOKEEPER_ADDRESS}/mesos
  export SPARK_HOME=/opt/spark/dist
  export SPARK_LOCAL_IP=`ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`
  export SPARK_LOCAL_HOSTNAME=`ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`
  export LIBPROCESS_IP=`ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'`

注1:數(shù)人云已經(jīng)在 Master 節(jié)點(diǎn)預(yù)裝了 Zookeeper,因此 MASTER 需要配置為數(shù)人云集群的zookeeper 地址杉编;
注2:SPARK_LOCAL_IP超全、SPARK_LOCAL_HOSTNAME、LIBPROCESS_IP取值都為主機(jī) IP邓馒,如果該主機(jī)使用的網(wǎng)卡不是 eth0 的話嘶朱,注意修改這里的網(wǎng)卡名;

(5) spark-default.conf

  spark.mesos.coarse=true
  spark.mesos.executor.home /opt/spark/dist
  spark.mesos.executor.docker.image your.registry.site/spark:1.5.0-hadoop2.6.0

其中光酣,spark.mesos.executor.docker.image 需要配置為 Spark 鏡像在鏡像倉庫的地址疏遏;數(shù)人云已將該鏡像推送至測試倉庫 index.shurenyun.com

2. 編寫 Dockerfile

    FROM mesosphere/mesos:0.23.0-1.0.ubuntu1404
    
    # Set environment variables.
    ENV DEBIAN_FRONTEND "noninteractive"
    ENV DEBCONF_NONINTERACTIVE_SEEN "true"
    
    # Upgrade package index and install basic commands.
    RUN apt-get update && \
        apt-get install -y openjdk-7-jdk curl
    
    ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
    
    ENV MESOS_NATIVE_JAVA_LIBRARY /usr/local/lib/libmesos.so
    
    ADD . /opt/spark/dist
    
    ADD hdfs-site.xml /etc/hadoop/hdfs-site.xml
    ADD core-site.xml /etc/hadoop/core-site.xml
    ADD mesos-site.xml /etc/hadoop/mesos-site.xml
    ADD spark-env.sh /opt/spark/dist/conf/spark-env.sh
    ADD spark-default.conf /opt/spark/dist/conf/spark-default.conf
    
    RUN ln -sf /usr/lib/libmesos.so /usr/lib/libmesos-0.23.1.so
    
    WORKDIR /opt/spark/dist

3. 創(chuàng)建并上傳 Docker image:

    docker build -t your.registry.site/spark:1.5.0-hadoop2.6.0   
    docker push your.registry.site/spark:1.5.0-hadoop2.6.0  

需把 your.registry.site 換成你的鏡像倉庫地址挂疆;數(shù)人云已將該鏡像推送至測試倉庫 index.shurenyun.com改览。

<h3 id="step2">第二步 建立集群</h3>

請參見 創(chuàng)建/刪除集群 來創(chuàng)建你的集群。

<h3 id="step3">第三步 發(fā)布應(yīng)用</h3>

部署 Spark on Mesos 的架構(gòu)圖如下所示:

spark-cluster.png

其中缤言,Cluster Manager 角色由 Mesos 承擔(dān)宝当,也就是數(shù)人云集群的 Master;Driver Program 用于下發(fā) Spark 計(jì)算任務(wù)胆萧,需要在數(shù)人云集群內(nèi)網(wǎng)的某個(gè)節(jié)點(diǎn)上手動(dòng)啟動(dòng)庆揩,該節(jié)點(diǎn)可以是 Master 或 Slave,或者與數(shù)人云集群相通的內(nèi)網(wǎng)機(jī)器跌穗;Woker Node 由 Mesos slave 承擔(dān)订晌,也就是數(shù)人云集群的 Slave。

登錄到需要啟動(dòng) Driver Program 的主機(jī)上蚌吸,啟動(dòng) Spark container:

docker run -it --net host -e ZOOKEEPER_ADDRESS=10.3.10.29:2181,10.3.10.63:2181,10.3.10.51:2181 index.shurenyun.com/spark:1.5.0-hadoop2.6.0 bash 

注1:Spark 啟動(dòng)需要足夠的資源锈拨,建議 CPU 數(shù)最小為1,內(nèi)存最低1G羹唠;
注2:Spark 節(jié)點(diǎn)間需要通信奕枢,所以選擇 HOST 模式部署,避免端口隱射導(dǎo)致而節(jié)點(diǎn)間無法通信佩微;
注3:請將ZOOKEEPER_ADDRESS的取值換成你的數(shù)人云集群的 Master 地址缝彬,端口為2181。

<h3 id="step4">第四步 測試</h3>

啟動(dòng)Spark shell

  bin/spark-shell

運(yùn)行demo

  sc.parallelize(1 to 1000) count

若看到名為 test 的 keyspace 已經(jīng)添加成功哺眯,如下圖所示:

spark2.png

恭喜谷浅,現(xiàn)在你的 Spark 集群已經(jīng)正常運(yùn)作了!如果覺得這種方式使用 Spark 仍覺得不方便,想要更直觀的方法一疯,比如在瀏覽器上編寫和測試 Spark 算法撼玄,可以嘗試使用 Zeppelin 編寫和運(yùn)行 Spark 任務(wù),稍后數(shù)人云會(huì)為您提供在數(shù)人云上玩轉(zhuǎn) Zeppelin 的最佳實(shí)踐违施,敬請期待互纯!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑟幕,一起剝皮案震驚了整個(gè)濱河市磕蒲,隨后出現(xiàn)的幾起案子只盹,更是在濱河造成了極大的恐慌辣往,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殖卑,死亡現(xiàn)場離奇詭異站削,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)孵稽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門许起,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菩鲜,你說我怎么就攤上這事园细。” “怎么了接校?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵猛频,是天一觀的道長。 經(jīng)常有香客問我蛛勉,道長鹿寻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任诽凌,我火速辦了婚禮毡熏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘侣诵。我一直安慰自己痢法,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布窝趣。 她就那樣靜靜地躺著疯暑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哑舒。 梳的紋絲不亂的頭發(fā)上妇拯,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼越锈。 笑死仗嗦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的甘凭。 我是一名探鬼主播稀拐,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹弱!你這毒婦竟也來了德撬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躲胳,失蹤者是張志新(化名)和其女友劉穎蜓洪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坯苹,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡隆檀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粹湃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恐仑。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖为鳄,靈堂內(nèi)的尸體忽然破棺而出裳仆,到底是詐尸還是另有隱情,我是刑警寧澤济赎,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布鉴逞,位于F島的核電站,受9級特大地震影響司训,放射性物質(zhì)發(fā)生泄漏构捡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一壳猜、第九天 我趴在偏房一處隱蔽的房頂上張望勾徽。 院中可真熱鬧,春花似錦统扳、人聲如沸喘帚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吹由。三九已至,卻和暖如春朱嘴,著一層夾襖步出監(jiān)牢的瞬間倾鲫,已是汗流浹背粗合。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乌昔,地道東北人隙疚。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像磕道,于是被迫代替她去往敵國和親供屉。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容