zoukankan      html  css  js  c++  java
  • 【第1期】使用Docker虚拟化技术搭设Hadoop环境

    一、Docker简介

         Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。(以上摘自“百度百科”)


    二、Docker安装

    2.1 Docker简介

        使用yum安装Docker最新版本,经验证,目前能安装Docker最新版本(1.10.3)为CentOS7,因此本次安装Docker的版本为CentOS7。

        配置yum源:

    cd /etc/yum.repos.d
    vi docker.repo
    --------------文件内容-----------------------
    [dockerrepo]
    name=Docker Repository
    baseurl=https://yum.dockerproject.org/repo/main/centos/7/
    enabled=1
    gpgcheck=1
    gpgkey=https://yum.dockerproject.org/gpg

        清除yum,并安装docker

    yum clean all
    yum install docker-engine

        直至安装成功后,设置docker开机自启动

    systemctl enable docker

       默认情况下,docker新开一个容器能使用的磁盘容量为10G(未来版本不知道会不会优化这个限制)。因此,需要修改docker配置文件,使得可以使用宿主主机的所有容量。

    vi /lib/systemd/system/docker.service
    修改[Service]标签下的ExecStart属性值
    -------------- 文件内容 -----------------
    ExecStart=/usr/bin/docker daemon -H fd:// -s overlay

      重启docker服务

    service docker restart

    三、Hadoop镜像制作

    3.1 Hadoop版本

      本次使用的Java版本为jdk-8u73-linux-x64.rpm,可在甲骨文官网下载,这里不赘述。

      本次使用的Hadoop版本为2.5.2,可在官网下载http://hadoop.apache.org/releases.html

     

      如图,下载2.5.2版本的binary包。至于source源码包,根据实际情况需要下载即可。


    2.3 Hadoop集群机器配置

       本次Docker镜像预定配合的机器集群信息如图

    主机描述 主机IP 主机名
    Master 172.17.1.220 hadoop-master.richardchan.nom
    Slave1 172.17.1.221 hadoop-slave1.richardchan.nom
    Slave2 172.17.1.222 hadoop-slave2.richardchan.nom
    Slave3 172.17.1.223 hadoop-slave3.richardchan.nom

    2.4 镜像制作

    2.4.1 获得操作系统基础镜像

      下载docker官网发布的CentOS-6.6操作系统镜像

    docker pull centos:6.6

      下载完毕后,使用命令查看镜像,可以看到已经下载的镜像

    docker images

      docker本身支持使用Dockerfile来制作镜像。但是由于在制作hadoop镜像过程中,需要配置ssh无密码登录。这个操作需要交互式完成。因此使用Dockerfile并无法适用我们本次制作hadoop镜像。因此,只能手工一步步来操作了。

    2.4.2 启动一个新容器

      在生成docker容器来制作之前,我们需要清除,我们目前需要对外提供什么端口,环境变量是什么。因此即使在docker容器中配置了环境变量文件.profile。但由于docker的内部机制。实际上重启docker容器或又容器生成镜像时,环境变量文件并不会生效。也就是说,我们在生成docker容器的时候,就必须显示指定这些信息。  环境变量信息

    变量 取值
    HADOOP_COMMON_LIB_NATIVE_DIR /opt/hadoop/lib/native
    HADOOP_OPTS /opt/hadoop/lib
    JAVA_HOME /usr/java/jdk1.8.0_73
    JAVA_BIN /usr/java/jdk1.8.0_73/bin
    CLASSPATH .:/usr/java/jdk1.8.0_73/lib/dt.jar:/usr/java/jdk1.8.0_73/lib/tools.jar
    HADOOP_HOME /opt/hadoop
    PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jdk1.8.0_73/bin:/opt/hadoop/bin

      需要开启端口 22 ,用于ssh免登录 

      使用以下命令启动一个新的容器,容器名字为hadoop-base,主机名为hadoop-base.richardchan.nom

    docker run -d -it --expose=22 -e "HADOOP_COMMON_LIB_NATIVE_DIR=/opt/hadoop/lib/native" -e "HADOOP_OPTS=-Djava.library.path=/opt/hadoop/lib" -e "JAVA_HOME=/usr/java/jdk1.8.0_73" -e "JAVA_BIN=/usr/java/jdk1.8.0_73/bin" -e "CLASSPATH=.:/usr/java/jdk1.8.0_73/lib/dt.jar:/usr/java/jdk1.8.0_73/lib/tools.jar" -e "HADOOP_HOME=/opt/hadoop" -e "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/jdk1.8.0_73/bin:/opt/hadoop/bin" --net=none -h hadoop-base.richardchan.nom --name hadoop-base centos:6.6 /bin/bash

      分配IP地址172.17.1.211,用于在容器中使用yum来安装软件

    pipework docker0 hadoop-base 172.17.1.211/16@172.17.0.1

      将准备好的java安装包和hadoop安装包上传到容器中

    docker cp jdk-8u73-linux-x64.rpm hadoop-base:/opt
    docker cp hadoop-2.5.2.tar.gz hadoop-base:/opt

      登录到docker容器hadoop-base

    docker exec -it hadoop-base /bin/bash

      安装java

    cd /opt
    chmod +x /opt/jdk-8u73-linux-x64.rpm
    rpm -ivh /opt/jdk-8u73-linux-x64.rpm
    
    rm -rf /opt/jdk-8u73-linux-x64.rpm

      添加hadoop用户和用户组

    groupadd hadoop
    useradd hadoop -g hadoop
    
    chown -R hadoop:hadoop /opt

     现在想要解压hadoop安装包,但是centos6.6可能未安装tar工具,这里先安装一下

    yum install -y tar

      解压hadoop安装包,并修改解压后hadoop目录名(该步骤使用hadoop用户)

    su hadoop   # 使用su命令由root切到hadoop用户
    
    tar -zxvf hadoop-2.5.2.tar.gz
    mv /opt/hadoop-2.5.2 /opt/hadoop
    
    rm -rf hadoop-2.5.2.tar.gz

      安装ssh服务端和客户端(该步骤使用root用户)

    exit               # 接上个步骤,使用exit即可由hadoop用户切回root用户
    
    yum install openssh-server
    yum install openssh-clients
    
    chkconfig sshd on # 设置sshd开机自启动

      生成私钥和密钥对(该步骤使用hadoop用户)

    su hadoop  # 使用su命令由root切到hadoop用户
    
    ssh-keygen -t rsa -P ''
    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    
    # 以下必须赋权,不然会有问题
    chmod 600 ~/.ssh/authorized_keys
    chmod 700 ~/.ssh

      配置sshd使用私钥公钥的认证方式(该步骤使用root用户)

    exit   # 接上个步骤,使用exit可以由hadoop切回root用户
    
    vi /etc/ssh/sshd_config
    修改以下内容,即去注释即可
    ---------- 文件内容 ----------
    RSAAuthentication yes # 启用 RSA 认证
    PubkeyAuthentication yes # 启用公钥私钥配对认证方式
    AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(和上面生成的文件同)

      重启sshd服务

    service sshd restart

      以下步骤就开始配置hadoop(使用hadoop用户)

      创建目录

    su hadoop   # 使用su可由root切到hadoop用户
    
    mkdir /opt/hadoop/tmp            # hadoop临时目录
    mkdir -p /opt/hdfs/namenode      # namenode目录
    mkdir -p /opt/hdfs/datanode      # datanode目录

      配置core-site.xml

    vi /opt/hadoop/etc/hadoop/core-site.xml
    
    ----------- 文件内容 -----------
    <configuration>
      <property>
        <name>hadoop.tmp.dir</name>
        <value>/opt/hadoop/tmp</value>
        <description>A base for other temporary directories.</description>
      </property>
      <!-- file system properties -->
      <property>
        <name>fs.default.name</name>
        <value>hdfs://hadoop-master.richardchan.nom:9000</value>
      </property>
    </configuration>

      配置hdfs-site.xml

    <configuration>
      <property>
        <name>dfs.replication</name> 
        <value>3</value>
      </property>
      <property>
        <name>dfs.namenode.name.dir</name>
        <value>/opt/hdfs/namenode</value>
      </property>
      <property>
        <name>dfs.datanode.data.dir</name>
        <value>/opt/hdfs/datanode</value>
      </property>
    </configuration>

      配置mapreduce-site.xml。由于在hadoop2.5.2版本中,该配置文件为mapred-site.xml.template,因此需要复制一份为mapreduce-site.xml,再修改配置信息

    cp /opt/hadoop/etc/hadoop/mapred-site.xml.template /opt/hadoop/etc/hadoop/mapreduce-site.xml
    
    vi /opt/hadoop/etc/hadoop/mapreduce-site.xml
    ------------ 文件内容 ------------
    <configuration>
      <property>
        <name>mapred.job.tracker</name>
        <value>http://hadoop-master.richardchan.nom:9001</value>
      </property>
      <property>
        <name>mapreduce.framework.name</name> 
        <value>yarn</value>
      </property>
    </configuration>

      配置yarn-site.xml

    <configuration>
      <!-- Site specific YARN configuration properties -->
       <property>
           <name>yarn.nodemanager.aux-services</name>
           <value>mapreduce_shuffle</value>
       </property>
       <property>
           <name>yarn.resourcemanager.address</name>
           <value>hadoop-master.richardchan.nom:8032</value>
       </property>
       <property>
            <name>yarn.resourcemanager.scheduler.address</name>
            <value>hadoop-master.richardchan.nom:8030</value>
       </property>
       <property>
    <name>yarn.resourcemanager.resource-tracker.address</name> <value>hadoop-master.richardchan.nom:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>hadoop-master.richardchan.nom:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>hadoop-master.richardchan.nom:8088</value> </property> </configuration>

      配置slaves

    vi /opt/hadoop/etc/hadoop/slaves
    --------- 文件内容 ---------
    hadoop-slave1.richardchan.nom
    hadoop-slave2.richardchan.nom
    hadoop-slave3.richardchan.nom

      配置hadoop-env.sh

    vi /opt/hadoop/etc/hadoop/hadoop-env.sh
    ------------ 文件结尾添加 ------------
    export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
    export HADOOP_OPTS="-Djava.library.path=${HADOOP_PREFIX}/lib"
    export JAVA_HOME=/usr/java/jdk1.8.0_73

      配置yarn-env.sh

    vi /opt/hadoop/etc/hadoop/hadoop-env.sh
    ------------ 文件结尾添加 ------------
    export HADOOP_COMMON_LIB_NATIVE_DIR=${HADOOP_PREFIX}/lib/native
    export HADOOP_OPTS="-Djava.library.path=${HADOOP_PREFIX}/lib"
    export JAVA_HOME=/usr/java/jdk1.8.0_73

      到此为止,即可退出容器

    exit   # 由hadoop用户切回root用户
    exit   # 退出容器

    2.4.3 生成hadoop-base镜像

    首先生成一个简单的hadoop-base镜像

    docker commit -a "Richard Chan" -m "base on Hadoop2.5.2" hadoop-base richardchan/hadoop-base

    2.4.4 生成hadoop2.5.2-base镜像

      由于目前为止,如果直接richardchan/hadoop-base镜像来开启一个新的容器时,容器的sshd服务并不会自动启动(可能是docker的内部机制造成的),所以,我们需要在这个镜像的基础上用Dockerfile再进行简单的加工一下

    vi Dockerfile
    -------- 文件内容 --------
    FROM richardchan/hadoop-base
    
    MAINTAINER Richard Chan <545036958@qq.com>
    
    EXPOSE 22
    
    CMD /usr/sbin/sshd -D

      上述CMD将设置sshd的开机自动启动。

      最终生成镜像richardchan/hadoop2.5.2-base

    docker build -t richardchan/hadoop2.5.2-base .

    2.4.3 删除hadoop-base镜像

      生成完毕后,richardchan/hadoop-base镜像就可以删掉了。

    docker rmi -f richardchan/hadoop-base

      至此,richardchan/hadoop2.5.2-base镜像制作完成。


    三、使用测试

      先生成4台hadoop虚拟容器,分别是MasterSlave1Slave2Slave3(host主机信息表在此设置)

    docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-master.richardchan.nom --name hadoop-master richardchan/hadoop2.5.2-base
    docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave1.richardchan.nom --name hadoop-slave1 richardchan/hadoop2.5.2-base
    docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave2.richardchan.nom --name hadoop-slave2 richardchan/hadoop2.5.2-base
    docker run -d -it --add-host hadoop-master.richardchan.nom:172.17.1.220 --add-host hadoop-slave1.richardchan.nom:172.17.1.221 --add-host hadoop-slave2.richardchan.nom:172.17.1.222 --add-host hadoop-slave3.richardchan.nom:172.17.1.223 --net=none -h hadoop-slave3.richardchan.nom --name hadoop-slave3 richardchan/hadoop2.5.2-base

      给虚拟容器分配IP地址

    pipework docker0 hadoop-master 172.17.1.220/16@172.17.0.1
    pipework docker0 hadoop-slave1 172.17.1.221/16@172.17.0.1
    pipework docker0 hadoop-slave2 172.17.1.222/16@172.17.0.1
    pipework docker0 hadoop-slave3 172.17.1.223/16@172.17.0.1

      进入master容器,分配上面生成的密钥

    docker exec -it hadoop-master /bin/bash

      使用hadoop用户,直接追加公钥到authorized_keys(这里的公钥在制作容器的时候可以查看 more /home/hadoop/.ssh/id_rsa.pub 这里不赘述)

    su hadoop
    echo "" > ~/.ssh/authorized_keys
    echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave1.richardchan.nom" >> ~/.ssh/authorized_keys
    echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave2.richardchan.nom" >> ~/.ssh/authorized_keys
    echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAu/KPnYg9Tlr9XYgDFsTLPzCJpgyEcXH08qUSJjvbIf8ZBRhqLuxoMhRxrywH6G8V/IJyLRcituYzc3CbKlnWGhtVQrdj6xENgWwy3BkYWIZ/FV13FDzcdmjRP/U6gykkOhErezukJafGFDncMP73d/Wf9YXfhvK9zuVlq9iyO4ZufeaBTUctkxHibZ/e6RzjrVxyqfgUfTYkeMFZzapHbFe7sQ+RsYSVJQMBsRselii5BSDPTh4it58O5gp6xXsGY/+a1485qKFmrGwm74/bVtAvnCAU+3oqe2s7G4GrNqiZdtHsLhxREy8LTEa6HdLd8RL0K8YPnK9RrRn2iku1Zw== hadoop@hadoop-slave3.richardchan.nom" >> ~/.ssh/authorized_keys

      对可信任的host主机进行配置(这一步在虚拟容器之间使用“ssh 主机名”后,最后生成的known_hosts,可以记录下来)

    echo "" > ~/.ssh/known_hosts
    chmod 644 ~/.ssh/known_hosts
    echo "hadoop-master.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
    echo "hadoop-slave1.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
    echo "hadoop-slave2.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
    echo "hadoop-slave3.richardchan.nom ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts
    echo "0.0.0.0 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA81rjLgthG9fpmLr41zWhnbMe1jYWfcg7mKMKUAa9EsbFY6P2eDiXQsCRt0vjDXNHpgUN8p9Xth4mxQu/TFlqetNE9hb2jZNnbtFvoBKaVbd8zLlazixG9zbG2AGC2gtpc7PtyDOUb0GW4KyDXzWqA97i4ihvl/e7UqBHRuCNqrqLK5ez8EdtO0ZyCsAqtSaUwLTnj/hH02tjJYvf5szNzo0wPZ5dOkTFZemvIXTZWvsIFjXlW5Ny69j4lstkxzC/hOn1rNs1o9EkQK7LZM1nWJYIp28KhtlAxVkMr8QnVqagkEBKYx9EPeUpneemq7iknM/R+wPGPLQ3TrWmMAioQQ==" >> ~/.ssh/known_hosts

      格式化namenode

    hadoop namenode -format

      启动hadoop

    /opt/hadoop/sbin/start-all.sh

     查看hadoop是否开启成功

    jps -l

    我是【Richard在菩提树下】

      如果,您认为阅读这篇博文让您有些收获,不妨点击一下右下角的【推荐】。

      如果,您希望更容易地发现我的新博文,不妨点击一下左下角的【关注我】。

      如果,您对我的博文所讲述的内容有兴趣,请继续关注我后续的博文。

      本文版权归作者和博客园共有,欢迎转载,但未经作业同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则作者将保留追究法律责任的权利。

  • 相关阅读:
    Python基础(二)之数据类型和运算(6)——元组
    Python基础(二)之数据类型和运算(5)——字符串操作汇总
    Python基础(二)之数据类型和运算(4)—— 列表
    Python基础(二)之数据类型和运算(3)——其他运算算符
    Python 基础(三)——流程控制之break 、continue 、else
    Python 基础(三)之流程控制(3)——for
    Python 基础(三)之流程控制(2)——while
    Python 基础(三)之流程控制(1)——if…else
    python------迭代器与生成器
    Python基础(四)
  • 原文地址:https://www.cnblogs.com/bubi/p/5407276.html
Copyright © 2011-2022 走看看