zoukankan      html  css  js  c++  java
  • 使用docker部署hadoop集群

    最近要在公司里搭建一个hadoop测试集群,于是采用docker来快速部署hadoop集群。

    0. 写在前面

    网上也已经有很多教程了,但是其中都有不少坑,在此记录一下自己安装的过程。

    目标:使用docker搭建一个一主两从三台机器的hadoop2.7.7版本的集群

    准备

    • 首先要有一台内存8G以上的centos7机器,我用的是阿里云主机。

    • 其次将jdk和hadoop包上传到服务器中。

      我安装的是hadoop2.7.7。包给大家准备好了,链接:https://pan.baidu.com/s/15n_W-1rqOd2cUzhfvbkH4g 提取码:vmzw。

    1. 步骤

    大致分以下几步:

    1. 安装docker
    2. 基础环境准备
    3. 配置网络,并启动docker容器
    4. 配置host及ssh免密登录
    5. 安装配置hadoop
    6. 测试使用hadoop

    1.1 安装docker

    依次执行如下步骤安装docker。如果有docker环境的可以跳过。

    yum update
    
    yum install -y yum-utils device-mapper-persistent-data lvm2
    
    yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
    yum install -y docker-ce
     
    systemctl start docker
    
    docker -v
    
    

    1.2 基础环境准备

    1.2.1 创建基础的centos7镜像

    1. 拉取官方centos7镜像
    docker pull centos
    
    1. 通过build Dockfile生成带ssh功能的centos镜像
    • 创建Dockerfile文件

      vi Dockerfile

      将如下内容写入Dockerfile

      FROM centos
      MAINTAINER mwf
      
      RUN yum install -y openssh-server sudo
      RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
      RUN yum  install -y openssh-clients
      
      RUN echo "root:qwe123" | chpasswd
      RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
      RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
      RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
      
      RUN mkdir /var/run/sshd
      EXPOSE 22
      CMD ["/usr/sbin/sshd", "-D"]
      

      上述内容大概意思是:以centos镜像为基础,设置密码为wqe123,安装ssh服务并启动

    • 构建Dockerfile

      docker build -t="centos7-ssh" .
      

      将生成一个名为centos7-ssh的镜像,可以通过docker images查看

    1.2.2 生成有hadoop和jdk环境的镜像

    1. 将准备好的包放在当前目录下。hadoop-2.7.7.tar.gzjdk-8u202-linux-x64.tar.gz

    2. 通过build Dockfile生成带hadoop和jdk环境的centos镜像

      刚才已经创建了一个Dockerfile了,先将他移开。mv Dockerfile Dockerfile.bak

    • 创建Dockerfile

      vi Dockerfile

      将以下内容写入:

      FROM centos7-ssh
      ADD jdk-8u202-linux-x64.tar.gz /usr/local/
      RUN mv /usr/local/jdk1.8.0_202 /usr/local/jdk1.8
      ENV JAVA_HOME /usr/local/jdk1.8
      ENV PATH $JAVA_HOME/bin:$PATH
      
      ADD hadoop-2.7.7.tar.gz /usr/local
      RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop
      ENV HADOOP_HOME /usr/local/hadoop
      ENV PATH $HADOOP_HOME/bin:$PATH
      
      RUN yum install -y which sudo
      

      上述内容大概意思是:以上面生成的centos7-ssh为基础,将hadoop和jdk包放进去,然后配好环境变量。

    • 构建Dockerfile

      docker build -t="hadoop" .
      

      将生成一个名为hadoop的镜像

    1.3 配置网络,并启动docker容器

    因为集群间必须要能网络连通,所以要先配置好网络。

    1. 创建网络

      docker network create --driver bridge hadoop-br
      

      以上命令创建了一个名为hadoop-br的bridge类型的网络

    2. 启动docker时指定网络

      docker run -itd --network hadoop-br --name hadoop1 -p 50070:50070 -p 8088:8088 hadoop
      docker run -itd --network hadoop-br --name hadoop2 hadoop
      docker run -itd --network hadoop-br --name hadoop3 hadoop
      

      以上命令启动了3台机器,网络都指定为hadoop-br,hadoop1还开启了端口映射。

    3. 查看网络情况

      docker network inspect hadoop-br 
      

      执行以上命令就可以看到对应的网络信息:

      [
          {
              "Name": "hadoop-br",
              "Id": "88b7839f412a140462b87a353769e8091e92b5451c47b5c6e7b44a1879bc7c9a",
              "Containers": {
      "86e52eb15351114d45fdad4462cc2050c05202554849bedb8702822945268631": {
                      "Name": "hadoop1",
                      "IPv4Address": "172.18.0.2/16",
                      "IPv6Address": ""
                  },
                  "9baa1ff183f557f180da2b7af8366759a0d70834f43d6b60fba2e64f340e0558": {
                      "Name": "hadoop2",
                      "IPv4Address": "172.18.0.3/16",
                      "IPv6Address": ""
                  },  "e18a3166e965a81d28b4fe5168d1f0c3df1cb9f7e0cbe0673864779b224c8a7f": {
                      "Name": "hadoop3",
                      "IPv4Address": "172.18.0.4/16",
                      "IPv6Address": ""
                  }
              },
          }
      ]
      
      

      我们可以得知3台机器对应的ip:

      172.18.0.2 hadoop1 
      172.18.0.3 hadoop2 
      172.18.0.4 hadoop3 
      
    4. 登录docker容器,互相之间就可以ping通了。

      docker exec -it hadoop1 bash
      docker exec -it hadoop2 bash
      docker exec -it hadoop3 bash
      

    1.4 配置host及ssh免密登录

    1.4.1 配置host

    分别在每台修改每台机器的host

    vi /etc/hosts

    将以下内容写入(注:docker分出来的ip对于每个人可能不一样,填你自己的):

    172.18.0.2 hadoop1 
    172.18.0.3 hadoop2 
    172.18.0.4 hadoop3 
    

    1.4.2 ssh免密登录

    因为上面在镜像中已经安装了ssh服务,所以直接分别在每台机器上执行以下命令:

    ssh-keygen
    一路回车
    ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
    输入密码,如果按我的来得话就是qwe123
    ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
    输入密码,如果按我的来得话就是qwe123
    ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
    输入密码,如果按我的来得话就是qwe123
    

    1.4.3 测试是否配置成功

    ping hadoop1 
    ping hadoop2
    ping hadoop3
    ssh hadoop1
    ssh hadoop2
    ssh hadoop3
    

    1.5 安装配置hadoop

    1.5.1 在hadoop1上操作

    1. 进入hadoop1

      docker exec -it hadoop1 bash
      
    2. 创建一些文件夹,一会在配置中要用到

      mkdir /home/hadoop
      mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
      
    3. 切换到hadoop配置的目录

      cd $HADOOP_HOME/etc/hadoop/
      
    4. 编辑core-site.xml

      	<property>
              <name>fs.defaultFS</name>
              <value>hdfs://hadoop1:9000</value>
          </property>
          <property>
              <name>hadoop.tmp.dir</name>
              <value>file:/home/hadoop/tmp</value>
          </property>
          <property>
              <name>io.file.buffer.size</name>
              <value>131702</value>
          </property>
      
    5. 编辑hdfs-site.xml

       <property>
              <name>dfs.namenode.name.dir</name>
              <value>file:/home/hadoop/hdfs_name</value>
          </property>
          <property>
              <name>dfs.datanode.data.dir</name>
              <value>file:/home/hadoop/hdfs_data</value>
          </property>
          <property>
              <name>dfs.replication</name>
              <value>2</value>
          </property>
          <property>
              <name>dfs.namenode.secondary.http-address</name>
              <value>hadoop1:9001</value>
          </property>
          <property>
              <name>dfs.webhdfs.enabled</name>
              <value>true</value>
          </property>
      
    6. 编辑mapred-site.xml

      mapred-site.xml默认不存在,要执行cp mapred-site.xml.template mapred-site.xml

       <property>
              <name>mapreduce.framework.name</name>
              <value>yarn</value>
          </property>
          <property>
              <name>mapreduce.jobhistory.address</name>
              <value>hadoop1:10020</value>
          </property>
          <property>
              <name>mapreduce.jobhistory.webapp.address</name>
              <value>hadoop1:19888</value>
          </property>
      
    7. 编辑yarn-site.xml

       <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
          </property>
          <property>
              <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
              <value>org.apache.hadoop.mapred.ShuffleHandler</value>
          </property>
          <property>
              <name>yarn.resourcemanager.address</name>
              <value>hadoop1:8032</value>
          </property>
          <property>
              <name>yarn.resourcemanager.scheduler.address</name>
              <value>hadoop1:8030</value>
          </property>
          <property>
              <name>yarn.resourcemanager.resource-tracker.address</name>
              <value>hadoop1:8031</value>
          </property>
          <property>
              <name>yarn.resourcemanager.admin.address</name>
              <value>hadoop1:8033</value>
          </property>
          <property>
              <name>yarn.resourcemanager.webapp.address</name>
              <value>hadoop1:8088</value>
          </property>
      
    8. 编辑slaves

      我这里把hadoop1当成主节点,hadoop2、3作为从节点

      hadoop2
      hadoop3
      
    9. 把文件拷贝到hadoop2和hadoop3上

      依次执行以下命令:

      scp -r $HADOOP_HOME/ hadoop2:/usr/local/
      scp -r $HADOOP_HOME/ hadoop3:/usr/local/
      
      scp -r /home/hadoop hadoop2:/
      scp -r /home/hadoop hadoop3:/
      

    1.5.2 在每台机器上操作

    1. 分别连接每台机器

      docker exec -it hadoop1 bash
      docker exec -it hadoop2 bash
      docker exec -it hadoop3 bash
      
    2. 配置hadoop sbin目录的环境变量

      因为hadoop bin目录在之前创建镜像时就配好了,但是sbin目录没有配,所以要单独配置。分配为每台机器配置:

      vi ~/.bashrc

      追加如下内容:

      export PATH=$PATH:$HADOOP_HOME/sbin

      执行:

      source ~/.bashrc

    1.5.3 启动hadoop

    在hadoop1上执行以下命令:

    1. 格式化hdfs

      hdfs namenode -format
      
    2. 一键启动

      start-all.sh
      

    不出错的话,就可以庆祝一下了。出错的话,加油。

    1.6 测试使用hadoop

    • jps
    # hadoop1
    1748 Jps
    490 NameNode
    846 ResourceManager
    686 SecondaryNameNode
    
    # hadoop2
    400 DataNode
    721 Jps
    509 NodeManager
    
    # hadoop3
    425 NodeManager
    316 DataNode
    591 Jps
    
    • 上传文件
    hdfs dfs -mkdir /mwf
    
    echo hello > a.txt
    hdfs dfs -put a.txt /mwf
    
    hdfs dfs -ls /mwf
    
    Found 1 items
    drwxr-xr-x   - root supergroup          0 2020-09-04 11:14 /mwf
    
    

    由于是云服务器,不想配端口,就不看ui界面了。

    2. 最后

    以上是我安装成功之后总结的过程,应该没有问题,也可能有遗漏。

    大家安装过程中遇到什么问题欢迎交流。有写错的地方也欢迎指正。

    3. 参考

    https://cloud.tencent.com/developer/article/1084166

    https://cloud.tencent.com/developer/article/1084157?from=10680

    https://blog.csdn.net/ifenggege/article/details/108396249

  • 相关阅读:
    request和response使用
    oracle_to_char
    oracl_LTRIM_RITRIM
    convert
    jdbc
    oracle_trunc
    [python]glob模块中的glob()函数为什么返回空列表??
    win10 anaconda+tensorflow+keras
    Golang学习:sublime text3配置golang环境
    2018/12/05学习笔记
  • 原文地址:https://www.cnblogs.com/upupfeng/p/13616125.html
Copyright © 2011-2022 走看看