利用docker快速搭建Spark集群

作者: RavenZZ | 来源:发表于2017-04-10 23:30 被阅读8492次

    适用人群

    • 正在使用spark的开发者
    • 正在学习docker或者spark的开发者

    准备工作

    1. 安装docker
    2. (可选)下载java和spark with hadoop

    Spark集群

    Spark运行时架构图

    Spark Cluster(Spark集群).png

    如上图: Spark集群由以下两个部分组成

    1. 集群管理器(Mesos, Yarn或者standalone Mode)
    2. 工作节点(worker)

    如何docker化(本例使用Standalone模式)

    1. 将spark集群拆分
    • base(基础镜像)
    • master(主节点镜像)
    • worker(工作镜像)
    1. 编写base Dockerfile

    注: 为方便切换版本基础镜像选择的是centos, 所以要下载java和spark, 方便调试, 可以下载好安装文件后本地搭建一个静态文件服务器, 使用Node.js 的http-server可以快速搞定,命令如下

      npm install http-server -g
      http-server -p 54321 ~/Downloads
    

    正式开始写Dockerfile

    FROM centos:7
    MAINTAINER RavenZZ <raven.zhu@outlook.com>
    
    # 安装系统工具
    RUN yum update -y
    RUN yum upgrade -y
    RUN yum install -y byobu curl htop man unzip nano wget
    RUN yum clean all
    
    # 安装 Java
    ENV JDK_VERSION 8u11
    ENV JDK_BUILD_VERSION b12
    # 如果网速快,可以直接从源站下载
    #RUN curl -LO "http://download.oracle.com/otn-pub/java/jdk/$JDK_VERSION-$JDK_BUILD_VERSION/jdk-$JDK_VERSION-linux-x64.rpm" -H 'Cookie: oraclelicense=accept-securebackup-cookie' && rpm -i jdk-$JDK_VERSION-linux-x64.rpm; rm -f jdk-$JDK_VERSION-linux-x64.rpm;
    RUN curl -LO "http://192.168.199.102:54321/jdk-8u11-linux-x64.rpm" && rpm -i jdk-$JDK_VERSION-linux-x64.rpm; rm -f jdk-$JDK_VERSION-linux-x64.rpm;
    ENV JAVA_HOME /usr/java/default
    RUN yum remove curl;  yum clean all
    WORKDIR spark
    
    RUN \
      curl -LO 'http://192.168.199.102:54321/spark-2.1.0-bin-hadoop2.7.tgz' && \
      tar zxf spark-2.1.0-bin-hadoop2.7.tgz
    
    RUN rm -rf spark-2.1.0-bin-hadoop2.7.tgz
    RUN mv spark-2.1.0-bin-hadoop2.7/* ./
    
    ENV SPARK_HOME /spark
    ENV PATH /spark/bin:$PATH
    ENV PATH /spark/sbin:$PATH
    
    1. 编写master Dockerfile
    FROM ravenzz/spark-hadoop
    
    MAINTAINER RavenZZ <raven.zhu@outlook.com>
    
    COPY master.sh /
    
    ENV SPARK_MASTER_PORT 7077
    ENV SPARK_MASTER_WEBUI_PORT 8080
    ENV SPARK_MASTER_LOG /spark/logs
    
    EXPOSE 8080 7077 6066
    
    CMD ["/bin/bash","/master.sh"]
    
    1. 编写worker Dockerfile
      FROM ravenzz/spark-hadoop
    
      MAINTAINER RavenZZ <raven.zhu@outlook.com> 
      COPY worker.sh /
      
      ENV SPARK_WORKER_WEBUI_PORT 8081
      ENV SPARK_WORKER_LOG /spark/logs
      ENV SPARK_MASTER "spark://spark-master:32769"
      
      EXPOSE 8081
      
      CMD ["/bin/bash","/worker.sh"]
    
    1. docker-compose
      version: '3'
    
    services:
      spark-master:
        build:
          context: ./master
          dockerfile: Dockerfile
        ports:
          - "50001:6066"
          - "50002:7077"   # SPARK_MASTER_PORT
          - "50003:8080"   # SPARK_MASTER_WEBUI_PORT
        expose:
          - 7077
    
      spark-worker1:
        build:
          context: ./worker
          dockerfile: Dockerfile
        ports:
          - "50004:8081"
        links:
          - spark-master
        environment:
          - SPARK_MASTER=spark://spark-master:7077
    
      spark-worker2:
        build:
          context: ./worker
          dockerfile: Dockerfile
        ports:
          - "50005:8081"
        links:
          - spark-master
        environment:
          - SPARK_MASTER=spark://spark-master:7077
    
    1. 测试集群
      docker-compose up
    

    访问http://localhost:50003/ 结果如图

    Paste_Image.png

    参考链接

    本例源代码
    参考源代码

    本文仅供参考, 希望读者能够按照思路自己编译需要的Spark版本和各种依赖

    相关文章

      网友评论

      • 阿群1986:应该用Dockerfile的COPY命令取代http://192.168.199.102:54321
      • 杨威_3878:怎么向集群提交作业呢?
      • 你好不见:初学者, “COPY master.sh /” 这个master.sh是个什么👻,用做什么的
        RavenZZ:集群的话, 可以试试看这个k8s的方式https://github.com/kubernetes/examples/blob/master/staging/spark/README.md
        RavenZZ:https://github.com/big-data-europe/docker-spark/blob/master/master/master.sh
      • styshoo:太赞了,根据你的,我做了稍微的修改,就能使用最新的spark和hadoop版本了。非常感谢。
      • MoRenYaoJing:你这个跨机器吗
        9d22fb3e02ea:真心想问下怎么跨机器部署,compose版本2似乎不支持overlay,如果我想用overlay部署spark该怎么设置网络呢?
        MoRenYaoJing:我在两台机器装的容器,直接用映射做的,最后datanode有启动,namenode启动不了,没有解决,希望有机会你帮我看看什么问题
        RavenZZ:稍微改一下可以跨的
      • 天地玄黄一路向南:跨主机集群,动态指定节点数创建spark集群,多套spark集群,有什么思路么?
        天地玄黄一路向南:@RavenZZ swarmmode实现跨主机的集群,应该用哪种网络呢?
        RavenZZ:因为spark集群是有状态的, worker要等master起来之后才能起来, 用的swarm的话, 也是一样, 先执行`docker service create master`, 再create worker
      • 406f2c94819a:Step 15/18 : RUN mv spark-2.1.0-bin-hadoop2.7/* ./
        ---> Running in a4a9d2efe9fd
        mv: cannot create hard link './bin/load-spark-env.cmd' to './R/lib': Operation not permitted
        mv: cannot create hard link './bin/sparkR.cmd' to './R/lib/SparkR': Operation not permitted
        mv: cannot create hard link './bin/run-example.cmd' to './R/lib/SparkR/worker': Operation not permitted
        ...
        afe0c94b582c:在获取镜像时,报Step 1 : FROM ravenzz/spark-hadoop
        Trying to pull repository docker.io/ravenzz/spark-hadoop ...
        unauthorized: authentication required
        RavenZZ:@EricChang1015 pretty good:+1:
        406f2c94819a:This is an AUFS limitation, where a move between layers fails.
        To fixed this permission problem, you can use following command

        RUN curl -LO 'http://192.168.56.105:54321/spark-2.1.0-bin-hadoop2.7.tgz' && tar zxf spark-2.1.0-bin-hadoop2.7.tgz -C ./ --strip-components=1
      • 开发者头条_程序员必装的App:感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/g4d1us 欢迎点赞支持!
        欢迎订阅《服务架构》https://toutiao.io/subject/23627

      本文标题:利用docker快速搭建Spark集群

      本文链接:https://www.haomeiwen.com/subject/svwyottx.html