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