zoukankan      html  css  js  c++  java
  • 使用docker搭建hadoop分布式集群

    使用docker搭建部署hadoop分布式集群
    在网上找了非常长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,仅仅能自己写一个了。
    一:环境准备:
    1:首先要有一个Centos7操作系统。能够在虚拟机中安装。
    2:在centos7中安装docker,docker的版本号为1.8.2
    安装过程例如以下:
    <1>安装制定版本号的dockeryum install -y docker-1.8.2-10.el7.centos
    <2>安装的时候可能会报错,须要删除这个依赖

    这里写图片描写叙述

    rpm -e lvm2-7:2.02.105-14.el7.x86_64

    启动docker

    service docker start

    验证安装结果:
    这里写图片描写叙述
    <3>启动之后运行docker info会看到以下有两行警告信息
    这里写图片描写叙述

    须要关闭防火墙并重新启动系统

    systemctl stop firewalld
    systemctl disable firewalld
    注意:运行完上面的命令之后须要重新启动系统
    reboot -h(重新启动系统)

    <4>运行容器可能会报错
    这里写图片描写叙述

    须要关闭selinux
    解决方法:

    1:setenforce 0(立马生效,不须要重新启动操作系统)
    2:改动/etc/selinux/config文件里的SELINUX=disabled 。然后重新启动系统生效
    建议两个步骤都运行,这样能够确保系统重新启动之后selinux也是关闭状态

    3:须要先构建一个hadoop的基础镜像,使用dockerfile文件方式进行构建。
    先构建一个具备ssh功能的镜像。方便后期使用。(可是这样对于容器的安全性会有影响)
    注意:这个镜像中的root用户的password是root
    Mkdir centos-ssh-root
    Cd centos-ssh-root
    Vi Dockerfile

    # 选择一个已有的os镜像作为基础  
    FROM centos 
    
    # 镜像的作者  
    MAINTAINER crxy 
    
    # 安装openssh-server和sudo软件包,而且将sshd的UsePAM參数设置成no  
    RUN yum install -y openssh-server sudo  
    RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config  
    #安装openssh-clients
    RUN yum  install -y openssh-clients
    
    # 加入測试用户root。passwordroot,而且将此用户加入到sudoers里  
    RUN echo "root:root" | chpasswd  
    RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers  
    # 以下这两句比較特殊,在centos6上必须要有,否则创建出来的容器sshd不能登录  
    RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key  
    RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key  
    
    # 启动sshd服务而且暴露22port  
    RUN mkdir /var/run/sshd  
    EXPOSE 22  
    CMD ["/usr/sbin/sshd", "-D"]

    构建命令:
    docker build -t=”crxy/centos-ssh-root” .

    查询刚才构建成功的镜像

    这里写图片描写叙述
    4:基于这个镜像再构建一个带有jdk的镜像
    注意:jdk使用的是1.7版本号的
    Mkdir centos-ssh-root-jdk
    Cd centos-ssh-root-jdk
    Cp ../jdk-7u75-linux-x64.tar.gz .
    Vi Dockerfile

    FROM crxy/centos-ssh-root
    ADD jdk-7u75-linux-x64.tar.gz /usr/local/
    RUN mv /usr/local/jdk1.7.0_75 /usr/local/jdk1.7
    ENV JAVA_HOME /usr/local/jdk1.7
    ENV PATH $JAVA_HOME/bin:$PATH

    构建命令:
    docker build -t=”crxy/centos-ssh-root-jdk” .

    查询构建成功的镜像
    这里写图片描写叙述

    5:基于这个jdk镜像再构建一个带有hadoop的镜像
    注意:hadoop使用的是2.4.1版本号的。


    Mkdir centos-ssh-root-jdk-hadoop
    Cd centos-ssh-root-jdk-hadoop
    Cp ../hadoop-2.4.1.tar.gz .
    Vi Dockerfile

    FROM crxy/centos-ssh-root-jdk
    ADD hadoop-2.4.1.tar.gz /usr/local
    RUN mv /usr/local/hadoop-2.4.1 /usr/local/hadoop
    ENV HADOOP_HOME /usr/local/hadoop
    ENV PATH $HADOOP_HOME/bin:$PATH

    构建命令:
    docker build -t=”crxy/centos-ssh-root-jdk-hadoop” .

    查询构建成功的镜像
    这里写图片描写叙述

    二:搭建hadoop分布式集群
    1:集群规划
    准备搭建一个具有三个节点的集群,一主两从
    主节点:hadoop0 ip:192.168.2.10
    从节点1:hadoop1 ip:192.168.2.11
    从节点2:hadoop2 ip:192.168.2.12

    可是由于docker容器又一次启动之后ip会发生变化,所以须要我们给docker设置固定ip。使用pipework给docker容器设置固定ip
    2:启动三个容器,分别作为hadoop0 hadoop1 hadoop2
    在宿主机上运行以下命令。给容器设置主机名和容器的名称。而且在hadoop0中对外开放port50070 和8088

    docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 crxy/centos-ssh-root-jdk-hadoop
    
    docker run --name hadoop1 --hostname hadoop1 -d -P crxy/centos-ssh-root-jdk-hadoop
    
    docker run --name hadoop2 --hostname hadoop2 -d -P crxy/centos-ssh-root-jdk-hadoop

    使用docker ps 查看刚才启动的是三个容器

    这里写图片描写叙述

    3:给这三台容器设置固定IP
    1:下载pipework
    下载地址:https://github.com/jpetazzo/pipework.git
    2:把下载的zip包上传到宿主机服务器上,解压,改名字

    unzip pipework-master.zip
    mv pipework-master pipework
    cp -rp pipework/pipework /usr/local/bin/ 

    3:安装bridge-utils

    yum -y install bridge-utils

    4:创建网络

    brctl addbr br0
    ip link set dev br0 up
    ip addr add 192.168.2.1/24 dev br0

    5:给容器设置固定ip

    pipework br0 hadoop0 192.168.2.10/24
    pipework br0 hadoop1 192.168.2.11/24
    pipework br0 hadoop2 192.168.2.12/24

    验证一下。分别ping三个ip,能ping通就说明没问题

    这里写图片描写叙述

    4:配置hadoop集群
    先连接到hadoop0上,
    使用命令

    docker exec -it hadoop0 /bin/bash

    以下的步骤就是hadoop集群的配置过程
    1:设置主机名与ip的映射。改动三台容器:vi /etc/hosts
    加入以下配置

    192.168.2.10    hadoop0
    192.168.2.11    hadoop1
    192.168.2.12    hadoop2

    2:设置ssh免password登录
    在hadoop0上运行以下操作

    cd  ~
    mkdir .ssh
    cd .ssh
    ssh-keygen -t rsa(一直按回车就可以)
    ssh-copy-id -i localhost
    ssh-copy-id -i hadoop0
    ssh-copy-id -i hadoop1
    ssh-copy-id -i hadoop2
    在hadoop1上运行以下操作
    cd  ~
    cd .ssh
    ssh-keygen -t rsa(一直按回车就可以)
    ssh-copy-id -i localhost
    ssh-copy-id -i hadoop1
    在hadoop2上运行以下操作
    cd  ~
    cd .ssh
    ssh-keygen -t rsa(一直按回车就可以)
    ssh-copy-id -i localhost
    ssh-copy-id -i hadoop2

    3:在hadoop0上改动hadoop的配置文件
    进入到/usr/local/hadoop/etc/hadoop文件夹
    改动文件夹下的配置文件core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml
    (1)hadoop-env.sh

    export JAVA_HOME=/usr/local/jdk1.7

    (2)core-site.xml

    <configuration>
            <property>
                    <name>fs.defaultFS</name>
                    <value>hdfs://hadoop0:9000</value>
            </property>
            <property>
                    <name>hadoop.tmp.dir</name>
                    <value>/usr/local/hadoop/tmp</value>
            </property>
             <property>
                     <name>fs.trash.interval</name>
                     <value>1440</value>
            </property>
    </configuration>

    (3)hdfs-site.xml

    <configuration>
        <property>
            <name>dfs.replication</name>
            <value>1</value>
        </property>
        <property>
            <name>dfs.permissions</name>
            <value>false</value>
        </property>
    </configuration>

    (4)yarn-site.xml

    <configuration>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
            </property>
            <property> 
                    <name>yarn.log-aggregation-enable</name> 
                    <value>true</value> 
            </property>
    </configuration>

    (5)改动文件名称:mv mapred-site.xml.template mapred-site.xml
    vi mapred-site.xml

    <configuration>
        <property>
            <name>mapreduce.framework.name</name>
            <value>yarn</value>
        </property>
    </configuration>

    (6)格式化
    进入到/usr/local/hadoop文件夹下
    1、运行格式化命令

    bin/hdfs namenode -format
    注意:在运行的时候会报错,是由于缺少which命令。安装就可以
    
    运行以下命令安装
    yum install -y which

    看到以下命令说明格式化成功。


    这里写图片描写叙述

    格式化操作不能反复运行。假设一定要反复格式化。带參数-force就可以。


    (7)启动伪分布hadoop

    命令:sbin/start-all.sh

    第一次启动的过程中须要输入yes确认一下。


    这里写图片描写叙述

    使用jps。检查进程是否正常启动?能看到以下几个进程表示伪分布启动成功

    [root@hadoop0 hadoop]# jps
    3267 SecondaryNameNode
    3003 NameNode
    3664 Jps
    3397 ResourceManager
    3090 DataNode
    3487 NodeManager

    (8)停止伪分布hadoop

    命令:sbin/stop-all.sh

    (9)指定nodemanager的地址。改动文件yarn-site.xml

    <property>
        <description>The hostname of the RM.</description>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop0</value>
      </property>

    (10)改动hadoop0中hadoop的一个配置文件etc/hadoop/slaves
    删除原来的全部内容,改动为例如以下

    hadoop1
    hadoop2

    (11)在hadoop0中运行命令

      scp  -rq /usr/local/hadoop   hadoop1:/usr/local
      scp  -rq /usr/local/hadoop   hadoop2:/usr/local

    (12)启动hadoop分布式集群服务

    运行sbin/start-all.sh

    注意:在运行的时候会报错。是由于两个从节点缺少which命令,安装就可以

    分别在两个从节点运行以下命令安装

    yum install -y which

    再启动集群(假设集群已启动,须要先停止)

    sbin/start-all.sh

    (13)验证集群是否正常
    首先查看进程:
    Hadoop0上须要有这几个进程

    [root@hadoop0 hadoop]# jps
    4643 Jps
    4073 NameNode
    4216 SecondaryNameNode
    4381 ResourceManager

    Hadoop1上须要有这几个进程

    [root@hadoop1 hadoop]# jps
    715 NodeManager
    849 Jps
    645 DataNode

    Hadoop2上须要有这几个进程

    [root@hadoop2 hadoop]# jps
    456 NodeManager
    589 Jps
    388 DataNode

    使用程序验证集群服务
    创建一个本地文件

    vi a.txt
    hello you
    hello me

    上传a.txt到hdfs上

    hdfs dfs -put a.txt /

    运行wordcount程序

    cd /usr/local/hadoop/share/hadoop/mapreduce
    hadoop jar hadoop-mapreduce-examples-2.4.1.jar wordcount /a.txt /out

    查看程序运行结果
    这里写图片描写叙述
    这样就说明集群正常了。

    通过浏览器訪问集群的服务
    由于在启动hadoop0这个容器的时候把50070和8088映射到宿主机的相应port上了

    adb9eba7142b        crxy/centos-ssh-root-jdk-hadoop   "/usr/sbin/sshd -D"   About an hour ago   Up About an hour    0.0.0.0:8088->8088/tcp, 0.0.0.0:50070->50070/tcp, 0.0.0.0:32770->22/tcp   hadoop0

    所以在这能够直接通过宿主机訪问容器中hadoop集群的服务
    宿主机的ip为:192.168.1.144

    http://192.168.1.144:50070/
    http://192.168.1.144:8088/

    这里写图片描写叙述

    这里写图片描写叙述
    三:集群节点重新启动
    停止三个容器,在宿主机上运行以下命令

    docker stop hadoop0
    docker stop hadoop1
    docker stop hadoop2

    容器停止之后,之前设置的固定ip也会消失,又一次再使用这几个容器的时候还须要又一次设置固定ip
    先把之前停止的三个容器起来

    docker start hadoop0
    docker start hadoop1
    docker start hadoop2

    在宿主机上运行以下命令又一次给容器设置固定ip

    pipework br0 hadoop0 192.168.2.10/24
    pipework br0 hadoop1 192.168.2.11/24
    pipework br0 hadoop2 192.168.2.12/24

    还须要又一次在容器中配置主机名和ip的映射关系,每次都手工写比較麻烦
    写一个脚本。runhosts.sh

    #!/bin/bash
    echo 192.168.2.10       hadoop0 >> /etc/hosts
    echo 192.168.2.11       hadoop1 >> /etc/hosts
    echo 192.168.2.12       hadoop2 >> /etc/hosts

    加入运行权限,chmod +x runhosts.sh
    把这个脚本复制到全部节点。而且分别运行这个脚本

    scp runhosts.sh  hadoop1:~
    scp runhosts.sh  hadoop2:~

    运行脚本的命令 ./runhosts.sh

    查看/etc/hosts文件里是否加入成功
    这里写图片描写叙述

    注意:有一些docker版本号中不会在hosts文件里自己主动生成以下这些映射,所以我们才在这里手工给容器设置固定ip,并设置主机名和ip的映射关系。

    172.17.0.25     hadoop0
    172.17.0.25     hadoop0.bridge
    172.17.0.26     hadoop1
    172.17.0.26     hadoop1.bridge
    172.17.0.27     hadoop2
    172.17.0.27     hadoop2.bridge

    启动hadoop集群

    sbin/start-all.sh

    **

    假设有什么问题,能够进群一起交流!群号:295505811

    **
    这里写图片描写叙述

    大数据技术博客
    www.bigdata1024.com

  • 相关阅读:
    leetcode 375. Guess Number Higher or Lower II
    leetcode 374. Guess Number Higher or Lower
    转 PHP中exec、system等函数调用linux命令问题
    转 PHP 使用 Redis
    转 Vim操作
    转 php simple test
    转 手把手教你最简单的开源项目托管GitHub入门教程
    Bootstrap开启模态框后对数据处理(标记模态框的开启与关闭状态)
    java必会的英语单词
    Service和Servlet的区别
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7069260.html
Copyright © 2011-2022 走看看