使用数人云运行 Spark 集群

Spark 是 UC Berkeley AMP lab 开源的类 Hadoop MapReduce 的通用的并行计算框架,Spark 基于 map reduce 算法实现的分布式计算,拥有 Hadoop MapReduce 所具有的优点,并且 能更好地适用于数据挖掘与机器学习等需要迭代的 map reduce 的算法。本文详细介绍了基于Mesos 进行集群资源调度的数人云,如何部署Spark集群。

Spark 支持三种分布式部署方式,分别是 Standalone、Spark on Yarn 以及 Spark on Mesos。其中 Spark on Mesos 模式是很多公司采用的模式,并且 Spark 官方也推荐这种模式。正是由于 Spark 开发之初就考虑到支持 Mesos,因此,目前而言,Spark 运行在 Mesos 上会比运行在 Yarn 上更加灵活,更加自然。数人云集群正是通过 Mesos 进行集群资源调度,因此,数人云部署 Spark 集群,有着天然的优势。

接下来,我们就来体验一下用数人云部署 Spark 集群吧。

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

首先,我们需要在 Docker 环境下制作 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 时,需要将 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:数人云已经在 Master 节点预装了 Zookeeper,因此 MASTER 需要配置为数人云集群的zookeeper 地址;
注2:SPARK_LOCAL_IP、SPARK_LOCAL_HOSTNAME、LIBPROCESS_IP取值都为主机 IP,如果该主机使用的网卡不是 eth0 的话,注意修改这里的网卡名;

(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 镜像在镜像仓库的地址;数人云已将该镜像推送至测试仓库 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. 创建并上传 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 换成你的镜像仓库地址;数人云已将该镜像推送至测试仓库 index.shurenyun.com

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

请参见 创建/删除集群 来创建你的集群。

<h3 id="step3">第三步 发布应用</h3>

部署 Spark on Mesos 的架构图如下所示:

spark-cluster.png

其中,Cluster Manager 角色由 Mesos 承担,也就是数人云集群的 Master;Driver Program 用于下发 Spark 计算任务,需要在数人云集群内网的某个节点上手动启动,该节点可以是 Master 或 Slave,或者与数人云集群相通的内网机器;Woker Node 由 Mesos slave 承担,也就是数人云集群的 Slave。

登录到需要启动 Driver Program 的主机上,启动 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 启动需要足够的资源,建议 CPU 数最小为1,内存最低1G;
注2:Spark 节点间需要通信,所以选择 HOST 模式部署,避免端口隐射导致而节点间无法通信;
注3:请将ZOOKEEPER_ADDRESS的取值换成你的数人云集群的 Master 地址,端口为2181。

<h3 id="step4">第四步 测试</h3>

启动Spark shell

  bin/spark-shell

运行demo

  sc.parallelize(1 to 1000) count

若看到名为 test 的 keyspace 已经添加成功,如下图所示:

spark2.png

恭喜,现在你的 Spark 集群已经正常运作了!如果觉得这种方式使用 Spark 仍觉得不方便,想要更直观的方法,比如在浏览器上编写和测试 Spark 算法,可以尝试使用 Zeppelin 编写和运行 Spark 任务,稍后数人云会为您提供在数人云上玩转 Zeppelin 的最佳实践,敬请期待!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容