精华内容
下载资源
问答
  • windows下基于Docker的Spark集群搭建 目录windows下基于Docker的Spark集群搭建1、实验目的2、实验平台3、实验内容和要求3.1 docker环境安装3.1.1 开启Hyper-V3.2 根据已有的docker文件创建镜像3.3 基于docker创建...

    Windows家庭版下基于Docker的hadoop、Spark集群搭建


    1、实验目的

    (1)掌握在docker的安装方法;
    (2)熟悉docker基本命令;
    (3)基于Docker创建spark集群。


    2、实验平台

    操作系统:可以使windows或者Linux
    Spark版本:2.4.5;
    Hadoop版本:2.7。


    3、实验内容和要求

    3.1 docker环境安装

    3.1.1 开启Hyper-V

    新建hyperv.cmd文件,内容如下:

    pushd "%~dp0"
    
    dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
    
    for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
    
    del hyper-v.txt
    
    Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
    
    

    如下
    在这里插入图片描述
    然后以管理员身份执行hyperv.cmd文件,若需重启即重启。
    然后打开控制面板——程序——启用或关闭Windows功能,如下

    在这里插入图片描述


    3.1.2 伪装成win10专业版

    以管理员身份打开cmd
    执行如下命令:

    REG ADD "HKEY_LOCAL_MACHINE\software\Microsoft\Windows NT\CurrentVersion" /v EditionId /T REG_EXPAND_SZ /d Professional /F
    

    3.1.3 下载Docker for Windows

    我用的是百度网盘里的,直接下载安装,完成后桌面上会有如下图标:
    在这里插入图片描述
    打开右下角会有小鲸鱼标志,进入setting可进行镜像源以及其他的配置
    在这里插入图片描述

    显示已经安装完成。


    3.2 基于docker创建spark集群

    3.2.1 拉取centos镜像

    我拉的是centos8

    docker pull daocloud.io/library/centos:latest
    

    接下来查看一下拉的镜像

    docker images
    

    看到如下:

    在这里插入图片描述


    3.2.2 ip设置

    按顺序启动masterslave1slave2,这样不会造成ip紊乱。


    3.2.3 创建容器

    执行如下代码,创建容器masterslave1slave2

    docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name master -h master -p 50070:50070 -p 8080:8080 -p 7077:7077 -p 18088:18088 daocloud.io/library/centos /usr/sbin/init
    

    上面是创建master容器,创建slave容器时只需将master替换成容器名并删去端口部分代码即可。例如创建slave1代码如下

    docker run -d --privileged -ti -v /sys/fs/cgroup:/sys/fs/cgroup --name slave1 -h slave1  daocloud.io/library/centos /usr/sbin/init
    

    创建完后,输入命令

    docker ps -a
    

    可以看到创建的三个容器以及他们的容器名、状态,如下
    在这里插入图片描述
    可以输入不同的容器id来进入容器,具体命令如下

    docker exec -it 容器id /bin/bash 
    

    想要退出的话按Ctrl+P+Q即可。
    例如进入master容器,如下

    在这里插入图片描述


    3.2.4 配置ssh实现节点间免密登陆

    先换yum源,执行如下命令

    yum -y install wget
    
    mv /etc/yum.repos.d/CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo.backup
    
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
    
    yum makecache
    

    安装openssh

    yum -y install openssh openssh-server openssh-clients
    systemctl start sshd
    

    修改配置文件,使得master设置ssh登录自动添加known_hosts,ssh自动接收新的密钥

    vi /etc/ssh/ssh_config
    

    将原来的StrictHostKeyChecking ask设置StrictHostKeyChecking为no,再执行

    systemctl restart sshd
    

    对于slave节点,只安装,不修改配置文件
    slave节点执行如下命令

    yum -y install openssh openssh-server openssh-clients
    systemctl start sshd
    

    三个节点修改hosts文件

    vi /etc/hosts
    

    如下
    修改hosts文件
    公钥的互相分发
    在三个节点上执行如下命令

    ssh-keygen -t rsa
    

    只需一路按回车

    cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
    

    然后将各自 ~/.ssh/authorized_keys文件中的秘钥复制到其他两个节点的 ~/.ssh/authorized_keys文件中去(进入容器,修改 ~/.ssh/authorized_keys文件)
    图上为三个节点的密钥
    master执行

    ssh root@slave1
    ssh root@slave2
    

    可登陆两个slave节点,输入exit退回master节点。


    3.2.5 Ansible安装

    下载镜像源和Ansible

    yum -y install epel-release
    yum -y install ansible
    

    编辑host文件

    vi /etc/ansible/hosts
    

    内容如下:

    [cluster]
    master
    slave1
    slave2
    
    [master]
    master
    
    [slaves]
    slave1
    slave2
    

    3.2.6 修改docker的hosts文件

    由于 /etc/hosts 文件在容器启动时被重写,直接修改内容在容器重启后不能保留,为了让容器在重启之后获取集群 hosts,使用了一种启动容器后重写hosts的方法。需要在修改 ~/.bashrc 文件,在末尾追加以下指令

    :>/etc/hosts
    cat >>/etc/hosts<<EOF
    127.0.0.1 localhost
    172.17.0.2 master
    172.17.0.3 slave1
    172.17.0.4 slave2
    EOF
    

    然后执行命令

    source ~/.bashrc
    cat /etc/hosts
    

    查看
    可看到重写的内容
    然后用ansible分发 .bashrc 至集群slave

    ansible cluster -m copy -a "src=~/.bashrc dest=~/"
    

    出现success表明成功

    slave节点执行

    source ~/.bashrc
    cat /etc/hosts
    

    3.2.7 使用ansible在在集群中安装openjdk

    进入master,执行

    ansible cluster -m yum -a "name=java-1.8.0-openjdk,java-1.8.0-openjdk-devel state=latest"
    

    出现如下情况,表示成功。
    在这里插入图片描述


    3.2.8 修改hadoop配置文件

    我将本地的hadoop2.7.4的压缩包传到masteropt目录下

    docker cp F:/hadoop-2.7.4.tar.gz 97c444c90ca7:/opt
    

    上面hadoop压缩包的路径必须是绝对路径。
    进入opt,解压

    tar -xzvf hadoop-2.7.4.tar.gz
    

    执行

    ls /usr/lib/jvm/
    

    查看openjdk的完整版本

    在这里插入图片描述
    配置javahadoop环境变量

    vi ~/.bashrc
    

    注意 ~/.bashrc 文件,后续还要在里面添加spark等环境变量。
    在末尾添加

    # hadoop
    export HADOOP_HOME=/opt/hadoop-2.7.4
    export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    
    #java
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el8_2.x86_64
    export PATH=$JAVA_HOME/bin:$PATH
    

    再执行

    source ~/.bashrc
    

    在三个节点依次执行

    依次执行

    yum install which -y
    

    再分别执行

    java -version
    hadoop version
    

    可打印出版本如下

    在这里插入图片描述

    进入hadoop-2.7.4/etc/hadoop目录

    修改 core-site.xml

    <configuration>
        <property>
            <name>hadoop.tmp.dir</name>
            <value>/home/hadoop/tmp</value>
            <description>A base for other temporary directories.</description>
        </property>
        <!-- file system properties -->
        <property>
            <name>fs.default.name</name>
            <value>hdfs://master:9000</value>
        </property>
        <property>
        <name>fs.trash.interval</name>
            <value>4320</value>
        </property>
    </configuration>
    

    修改 hdfs-site.xml

    <configuration>
    <property>
       <name>dfs.namenode.name.dir</name>
       <value>/home/hadoop/tmp/dfs/name</value>
     </property>
     <property>
       <name>dfs.datanode.data.dir</name>
       <value>/home/hadoop/data</value>
     </property>
     <property>
       <name>dfs.replication</name>
       <value>3</value>
     </property>
     <property>
       <name>dfs.webhdfs.enabled</name>
       <value>true</value>
     </property>
     <property>
       <name>dfs.permissions.superusergroup</name>
       <value>staff</value>
     </property>
     <property>
       <name>dfs.permissions.enabled</name>
       <value>false</value>
     </property>
    </configuration>
    

    复制并修改 mapred-site.xml

    复制

    cp mapred-site.xml.template mapred-site.xml
    

    修改

    <configuration>
    <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
    </property>
    <property>
            <name>mapred.job.tracker</name>
            <value>master:9001</value>
    </property>
    <property>
      <name>mapreduce.jobtracker.http.address</name>
      <value>master:50030</value>
    </property>
    <property>
      <name>mapreduce.jobhisotry.address</name>
      <value>master:10020</value>
    </property>
    <property>
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>master:19888</value>
    </property>
    <property>
      <name>mapreduce.jobhistory.done-dir</name>
      <value>/jobhistory/done</value>
    </property>
    <property>
      <name>mapreduce.intermediate-done-dir</name>
      <value>/jobhisotry/done_intermediate</value>
    </property>
    <property>
      <name>mapreduce.job.ubertask.enable</name>
      <value>true</value>
    </property>
    </configuration>
    

    修改 yarn-site.xml

    <configuration>
      #<property>
             #<name>yarn.nodemanager.resource.memory-mb</name>
             #<value>2048</value>
      #</property>
    
      #<property>
            #<name>yarn.nodemanager.resource.cpu-vcores</name>
            #<value>1</value>
      #</property>
        <property>
       <name>yarn.resourcemanager.hostname</name>
       <value>master</value>
     </property>
     <property>
       <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
     </property>
     <property>
       <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
       <value>org.apache.hadoop.mapred.ShuffleHandler</value>
     </property>
     <property>
       <name>yarn.resourcemanager.address</name>
       <value>master:18040</value>
     </property>
    <property>
       <name>yarn.resourcemanager.scheduler.address</name>
       <value>master:18030</value>
     </property>
     <property>
       <name>yarn.resourcemanager.resource-tracker.address</name>
       <value>master:18025</value>
     </property> <property>
       <name>yarn.resourcemanager.admin.address</name>
       <value>master:18141</value>
     </property>
    <property>
       <name>yarn.resourcemanager.webapp.address</name>
       <value>master:18088</value>
     </property>
    <property>
       <name>yarn.log-aggregation-enable</name>
       <value>true</value>
     </property>
    <property>
       <name>yarn.log-aggregation.retain-seconds</name>
       <value>86400</value>
     </property>
    <property>
       <name>yarn.log-aggregation.retain-check-interval-seconds</name>
       <value>86400</value>
     </property>
    <property>
       <name>yarn.nodemanager.remote-app-log-dir</name>
       <value>/tmp/logs</value>
     </property>
    <property>
       <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
       <value>logs</value>
     </property>
    </configuration>
    

    修改slaves文件,将原有内容替换为

    slave1
    slave2
    

    3.2.9 打包并分发hadoop文件

    opt 目录下打包

    tar -cvf hadoop-dis.tar hadoop-2.7.4
    

    创建 hadoop-dis.yaml 文件,内容如下

    ---
    - hosts: cluster
      tasks:
        - name: copy .bashrc to slaves
          copy: src=~/.bashrc dest=~/
          notify:
            - exec source
        - name: copy hadoop-dis.tar to slaves
          unarchive: src=/opt/hadoop-dis.tar dest=/opt
    
      handlers:
        - name: exec source
          shell: source ~/.bashrc
    

    执行

    ansible-playbook hadoop-dis.yaml
    

    分发完毕后显示如下

    分发成功


    3.2.10 格式化namenode

    hadoop namenode -format
    

    出现以下结果,表明成功

    格式化成功

    注意,这里我一开始出错了,原因是在上面配置文件的时后没有将原先的标签对给替换,以至于出现格式化错误。源文件如下

    <configuration>
    </configuration>
    

    在修改源文件时必须将上面的标签对替换。


    3.2.11 启动集群

    start-all.sh
    

    使用 jps 查看进程,master 节点和 slave 节点如下

    在这里插入图片描述

    执行hadoop自带程序

    hadoop jar /opt/hadoop-2.7.4/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.4.jar pi 5 5
    

    结果如下

    在这里插入图片描述
    表明运行成功。
    输入http://192.168.43.50:60070/ 还可以看到集群状态(我的master容器端口为60070

    在这里插入图片描述


    3.3 spark集群搭建

    3.3.1 下载spark、Scala、zookeeper

    wget http://mirrors.tuna.tsinghua.edu.cn/apache/spark/spark-2.4.7/spark-2.4.7-bin-hadoop2.7.tgz
    
    wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
    

    Scala2.11.11我是在本机下载上传的

    docker cp F:/scala-2.11.11.tgz 97c444c90ca7:/opt
    

    3.3.2 安装zookeeper

    进入opt目录解压

    tar xvzf zookeeper-3.4.9.tar.gz
    

    修改 ~/.bashrc 文件,增加zookeeper的环境变量,内容如下

    #zookeeper
    export ZOOKEEPER_HOME=/opt/zookeeper-3.4.9
    export PATH=$PATH:$ZOOKEEPER_HOME/bin
    
    source ~/.bashrc
    

    修改 zookeeper 的配置信息

    cd zookeeper-3.4.9/conf/
    cp zoo_sample.cfg zoo.cfg
    vi zoo.cfg
    

    修改、添加如下信息

    #修改
    dataDir=/opt/zookeeper-3.4.9/tmp
    #添加
    server.1=master:2888:3888
    server.2=slave1:2888:3888
    server.3=slave2:2888:3888
    

    接下来添加 myid 文件

    cd ../
    mkdir tmp
    cd tmp
    vi myid
    #在master的myid文件中写1,slave1写2,slave2写3
    

    3.3.3 安装spark

    依旧回到 opt 目录,解压 spark

    tar xvzf spark-2.4.7-bin-hadoop2.7.tgz
    

    修改 ~/.bashrc, 配置 spark 环境变量,增加内容如下

    #spark
    export SPARK_HOME=/opt/spark-2.4.7-bin-hadoop2.7
    export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$PATH
    
    source ~/.bashrc
    

    修改 spark 配置文件

    export SPARK_MASTER_IP=master
    export SPARK_WORKER_MEMORY=128m
    export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.272.b10-1.el8_2.x86_64
    export SCALA_HOME=/opt/scala-2.11.11  
    export SPARK_HOME=/opt/spark-2.4.7-bin-hadoop2.7
    export HADOOP_CONF_DIR=/opt/hadoop-2.7.4/etc/hadoop
    export SPARK_LIBRARY_PATH=$SPARK_HOME/lib
    export SCALA_LIBRARY_PATH=$SPARK_LIBRARY_PATH
    export SPARK_WORKER_CORES=1
    export SPARK_WORKER_INSTANCES=1
    export SPARK_MASTER_PORT=7077
    

    创建slaves文件并写入slave节点

    vi slaves
    

    写入

    slave1
    slave2 
    

    3.3.4 安装Scala

    回到 opt 目录,解压 Scala

    tar xvzf scala-2.11.11.tgz
    

    修改 ~/.bashrc, 配置 Scala 环境变量,内容如下

    #scala
    export SCALA_HOME=/opt/scala-2.11.11
    export PATH=$PATH:$SCALA_HOME/bin
    

    3.3.5 将spark、Scala、zookeeper传到slave

    执行如下代码

    scp -r /opt/spark-2.4.7-bin-hadoop2.7 root@slave1:/opt
    scp -r /opt/scala-2.11.11 root@slave1:/opt
    scp -r /opt/zookeeper-3.4.9 root@slave1:/opt
    scp -r /opt/spark-2.4.7-bin-hadoop2.7 root@slave2:/opt
    scp -r /opt/scala-2.11.11 root@slave2:/opt
    scp -r /opt/zookeeper-3.4.9 root@slave2:/opt
    

    3.3.6 修改slave节点的~/.bashrc文件和myid文件


    3.3.7 集群启动

    #启动hadoop
    start-dfs.sh
    start-yarn.sh
    #启动spark
    start-all.sh
    #启动zookeeper(目前spark集群不需要zookeeper,不启动zookeeper也能正常启动spark)
    zkServer.sh start(三个节点都执行才能使用zkServer.sh status查看状态)
    

    再分别查看masterslave节点进程如下

    在这里插入图片描述

    执行自带的程序测试spark集群

    run-example SparkPi
    

    输出结果

    运行成功
    输入本机网址和端口号即可以看到集群运行状态

    在这里插入图片描述


    3.3.8 集群关闭

    一定要输入命令结束集群运行,不然下次启动很有可能报错!

    stop-all.sh
    stop-yarn.sh
    stop-dfs.sh
    

    4、实验中遇到问题及解决

    1.在拉取镜像的时候,我只添加了一个镜像源,发现下载很慢,后来我在Daemon中添加了多个镜像源,发现速度快了许多;

    2.我在进入容器下载文件的时候,嫌下载的太慢,想调整镜像源,于是忘记退出就把docker重启了,结果发现master端口出错,无奈只得上传镜像再拉回来使用;

    3.我在修改配置文件的时后,有一个没有将多余的标签对替换,于是出错;

    4.我在启动容器时没有按照顺序启动,于是报了ip错误;

    5、实验心得

    1.得下功夫搭环境,首先得建立信心;

    2.不要盲目更改配置,在重启或者关机之前一定要确认是否关闭容器;

    3.要学会看日志,看报错的具体是什么错,不要盲目改;

    4.学会了Markdown编辑文本,实验报告较为美观。

    最后,感谢博主 @https://blog.csdn.net/qq_43034505/article/details/109975833
    本文从此处获得很多帮助,感谢这位大佬。

    展开全文
  • spark集群windows搭建

    千次阅读 2019-11-15 14:35:24
    我用三台windows电脑,主机名 和 ip对应如下: (右键我的计算机 属性 修改计算机名分别为:win-master,win-salver1,win-salver2) win-master 192.168.0.1 win-salve1 192.168.0.2 win-salve2 192.168.0.3 每台电脑...

    我用三台windows电脑,主机名 和 ip对应如下:
    (右键我的计算机 属性 修改计算机名分别为:win-master,win-salver1,win-salver2)
    win-master 192.168.0.1
    win-salve1 192.168.0.2
    win-salve2 192.168.0.3
    每台电脑安装好对应的软件,建议安装目录保持一致
    1.下载java:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
    我下载的是jdk8,根据自己电脑系统选择对应的版本,需要登录后下载。安装好之后,设置系统环境变量JAVA_HOME指向java安装目录,比如我的是D:/spark/Java/jdk1.8.0_231,同时把%JAVA_HOME%\bin目录添加到系统变量path里
    2.下载scala:https://www.scala-lang.org/download/2.12.10.html 选择msi格式,然后安装
    3.下载spark:http://spark.apache.org/downloads.html
    我选择的spark版本为2.4.4 pre-build for apache hadoop 2.7
    安装spark 然后设置环境变量SPARK_HOME=d:/spark (我的spark安装目录) ,同样把%SPARK_HOME%\bin目录添加到系统变量path里
    4.下载Hadoop:https://archive.apache.org/dist/hadoop/common/hadoop-2.7.1/ 下载后直接加压就可以,然后设置系统环境变量HADOOP_HOME=你的hadoop目录,同样把%HADOOP_HOME%\bin目录添加到系统变量path里。下载winutils.exe 把它复制到hadoop\bin目录下
    5.安装pyspark:将spark目录下python子目录里的pyspark文件夹复制到python安装目录\Python35\Lib\site-packages里
    软件安装好后,启动spark就可以了,linux下有自动脚本start-all.sh可以直接启动,在windows下不能用,所以只能手动启动(D:/hadoop2.7,D:/spark是我的hadoop和spark目录)。
    先启动master,打开CMD输入启动命令:java -cp “D:/hadoop2.7/conf;D:/spark/jars/" -Xmx1g org.apache.spark.deploy.master.Master --host win-master --port 7077 --webui-port 8080
    然后启动master机器的worker,重新打开一个CMD输入:java -cp "D:/hadoop2.7/conf/;D:/spark/jars/
    ” -Xmx1g org.apache.spark.deploy.worker.Worker spark://win-master:7077
    然后启动win-salve1和win-salve2的worker命令和master电脑的一样:java -cp “D:/hadoop2.7/conf/;D:/spark/jars/*” -Xmx1g org.apache.spark.deploy.worker.Worker spark://win-master:7077

    集群启动起来后,就可以用spark-submit了,在master电脑新开一个CMD,运行d:/spark/bin/spark-submit --master spark://win-master:7077 test.py
    然后可以在master电脑中打开浏览器访问localhost:8080 查看状态

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 167
精华内容 66
关键字:

spark集群搭建windows