• 1 Hadoop 3.2.4分布式环境搭建


    1 Hadoop 3.2.4分布式环境搭建

    1 系统配置

    • 3台centOS虚拟机

      # 配置hosts解析
      vim /etc/hosts
      
      192.168.88.129 	hadoop1
      192.168.88.130  hadoop2
      192.168.88.131  hadoop3
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 修改主机名

      hostnamectl set-hostname hadoop1
      hostnamectl set-hostname hadoop2
      hostnamectl set-hostname hadoop3
      
      • 1
      • 2
      • 3
    • 关闭防火墙

      #关闭防火墙
      systemctl stop firewalld.service
      #禁用开机启动
      systemctl disable firewalld.service
      
      
      #重启防火墙
      systemctl restart firewalld.service
      #查看防火墙状态
      systemctl status firewalld.service
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      生产环境不允许直接关闭防火墙!!!只能配置策略,开通特定的端口!!

    • 禁用selinux

      修改 /etc/selinux/config 设置 SELINUX=disabled

      vim /etc/selinux/config
      
      • 1
    • 重启使主机名等配置生效

    • 创建hadoop用户,并设置密码

      useradd hadoop
      passwd hadoop
      
      • 1
      • 2

      所有主机上都创建

      密码:fmi135246

    • 配置hadoop用户的root权限

      vim /etc/sudoers
      
      • 1

      %wheel下一行添加内容

      hadoop ALL=(ALL) NOPASSWD:ALL
      
      • 1

      NOPASSWD:ALL 表示使用sudo 命令时免输入密码 , 需要放在 %wheel 下一行 , 否则可能失效

    • 设置ssh免密登录

      # 进入密钥目录(有可能不存在)
      cd ~/.ssh
      # 删除旧密钥
      rm -rf ~/.ssh
      # 生成密钥
      ssh-keygen -t rsa
      # 公钥复制到ssh指定的密钥文件 authorized_keys
      cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
      
      #修改文件权限(不设置可能导致失败)
      chmod 600 ~/.ssh/authorized_keys
      # 测试免密登录
      ssh -vvv hadoop1
      
      # 退出ssh登录
      exit
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16

      ssh -vvv -vvv 表示输出调试信息,如果免密失败,可以从调试信息中查看原因,我在测试中,非root用户,必须修改 authorized_keys 文件的权限,否则设置免密不成功

    • 将hadoop1的公钥内容添加到其他主机的~/.ssh/authorized_keys中,这样hadoop1可以免密登录其他主机

      # 在hadoop1上执行
      ssh-copy-id hadoop1
      ssh-copy-id hadoop2
      ssh-copy-id hadoop3
      
      • 1
      • 2
      • 3
      • 4

      其他主机上同理执行

    2 JDK安装

    • 解压安装包到 /opt/module

      # 创建目录
      sudo mkdir -p /opt/module
      # 修改权限
      sudo chown -R hadoop:hadoop /opt/module
      # 解压安装包到/opt/module
      tar -xvf jdk-8u341-linux-x64.tar.gz -C /opt/module/
      # 修改jdk目录名
       mv /opt/module/jdk1.8.0_341/ /opt/module/jdk
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 配置环境变量

      可直接将jdk路径配置到 /etc/profile 文件,或者在 /etc/profile.d/新建 my_env.sh

      # 编辑文件
      sudo vim /etc/profile.d/my_env.sh
      
      # 添加内容
      export JAVA_HOME=/opt/module/jdk
      export PATH=$PATH:$JAVA_HOME/bin
      
      # 使变量生效
      source /etc/profile
      
      # 测试jdk
      java -version
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      使用上个命令的参数 !$ ,或者 alt + .

    3 安装hadoop

    • 解压到 /opt/module/hadoop

      tar -xvf hadoop-3.2.4.tar.gz -C /opt/module
      
      sudo mv /opt/module/hadoop-3.2.4 /opt/module/hadoop
      
      • 1
      • 2
      • 3
    • 配置环境变量到 /etc/profile.d/my_env.sh

      # 添加内容
      export JAVA_HOME=/opt/module/jdk
      export PATH=$PATH:$JAVA_HOME/bin
      export HADOOP_HOME=/opt/module/hadoop
      export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
      
      #export HDFS_NAMENODE_USER=root
      #export HDFS_DATANODE_USER=root
      #export HDFS_SECONDARYNAMENODE_USER=root
      #export YARN_RESOURCEMANAGER_USER=root
      #export YARN_NODEMANAGER_USER=root
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      $HADOOP_HOME/bin 和 $HADOOP_HOME/sbin 必须加入环境变量

    • 配置文件分发到其他主机

      scp /etc/profile.d/my_env.sh hadoop2:/etc/profile.d/
      scp /etc/profile.d/my_env.sh hadoop3:/etc/profile.d/
      
      • 1
      • 2

    rsync -av p d i r / pdir/ pdir/fname u s e r @ user@ user@host: p d i r / pdir/ pdir/fname

    命令 选项参数 要拷贝的文件路径/名称 目的地用户@主机:目的地路径/名称

    • 使环境变量生效

      source /etc/profile
      
      • 1
    • 配置hadoop-env.sh的jdk路径

      # 分别打开文件
      vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
      #vim /usr/local/hadoop/etc/hadoop/mapred-env.sh
      #vim /usr/local/hadoop/etc/hadoop/yarn-env.sh
      
      • 1
      • 2
      • 3
      • 4

      添加 JAVA_HOME配置

      export JAVA_HOME=/usr/local/jdk
      
      • 1

      验证配置

      hadoop version
      
      • 1
    • 复制jdk和hadoop到其他主机

      #通过ssh创建目录并修改权限
      ssh hadoop2 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module'
      ssh hadoop3 'sudo mkdir -p /opt/module;sudo chown -R hadoop:hadoop /opt/module'
      # 复制安装文件到hadoop2主机
      scp -r /opt/module hadoop@hadoop2:/opt/
      scp -r /opt/module hadoop@hadoop3:/opt/
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 登录其他主机配置jdk和hadoop的环境变量,参考前面配置 /etc/profile.d/my_env.sh 的步骤

    4 hadoop配置文件配置

    • home/hadoop目录下新建bin目录,并将目录加到PATH

      # 创建目录
      mkdir -p /home/hadoop/bin
      # 修改环境变量
      vim /etc/profile.d/my_env.sh
      
      • 1
      • 2
      • 3
      • 4

      修改内容为:

      export JAVA_HOME=/opt/module/jdk
      export PATH=$PATH:$JAVA_HOME/bin
      export HADOOP_HOME=/opt/module/hadoop
      export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:/home/hadoop/bin
      
      • 1
      • 2
      • 3
      • 4
    • 编写集群文件分发脚本xsync

      新建xsync文件

      vim ~/bin/xsync
      
      • 1

      添加如下内容

      #!/bin/bash
      
      #1. 判断参数个数
      if [ $# -lt 1 ]
      then
            echo Not Enough Arguement!
          exit;
      fi
      
      #2. 遍历集群所有机器
      for host in hadoop2 hadoop3
      do
          echo ====================  $host  ====================
          #3. 遍历所有目录,挨个发送
      
          for file in $@
          do
              #4. 判断文件是否存在
              if [ -e $file ]
                  then
                      #5. 获取父目录
                      pdir=$(cd -P $(dirname $file); pwd)
      
                      #6. 获取当前文件的名称
                      fname=$(basename $file)
                      ssh $host "mkdir -p $pdir"
                      rsync -av $pdir/$fname $host:$pdir
                  else
                      echo $file does not exists!
              fi
          done
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32

      添加执行权限

      chmod +x ~/bin/xsync
      
      • 1

      测试将文件复制到其他主机

      xsync /home/hadoop/bin
      
      • 1
    • 集群规划部署

      hadoop1hadoop2hadoop3
      HDFSNameNode
      DataNode
      DataNodeSecondaryNameNode
      DataNode
      YARNNodeManagerResourceManager
      NodeManager
      NodeManager

      规划原则: NameNode , SecondaryNameNode , ResourceManager 均比较占内存,故应部署在不同的主机上

    • 配置文件说明

      需要配置的配置文件位于hadoop安装目录下 $HADOOP_HOME/etc/hadoop

      配置文件名配置说明
      core-site.xml1 配置NameNode地址
      2 配置hadoop数据存储目录
      3 配置HDFS网页登录静态用户名
      hdfs-site.xml1 配置NameNode web端访问地址
      2 配置SecondaryNameNode web端访问地址
      yarn-site.xml1 配置MR走shuffle
      2 配置ResourceManger地址
      mapred-site.xml1 配置MapReduce程序运行在yarn上
      1. 配置core-site.xml

        
        
        
        <configuration>
            
            <property>
                <name>fs.defaultFSname>
                <value>hdfs://hadoop1:8020value>
            property>
        
            
            <property>
                <name>hadoop.tmp.dirname>
                <value>/opt/module/hadoop/datavalue>
            property>
        
            
            <property>
                <name>hadoop.http.staticuser.username>
                <value>hadoopvalue>
            property>
        configuration>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21
        • 22
      2. 配置hdfs-site.xml

        
        
        
        <configuration>
        	
        	<property>
                <name>dfs.namenode.http-addressname>
                <value>hadoop1:9870value>
            property>
        	
            <property>
                <name>dfs.namenode.secondary.http-addressname>
                <value>hadoop3:9868value>
            property>
        configuration>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
      3. 配置yarn-site.xml

        
        
        
        <configuration>
            
            <property>
                <name>yarn.nodemanager.aux-servicesname>
                <value>mapreduce_shufflevalue>
            property>
        
            
            <property>
                <name>yarn.resourcemanager.hostnamename>
                <value>hadoop2value>
            property>
        
        configuration>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
      4. 配置mapred-site.xml

        
        
        
        <configuration>
        	
            <property>
                <name>mapreduce.framework.namename>
                <value>yarnvalue>
            property>
        configuration>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
    • 同步配置文件到其他主机

      xsync $HADOOP_HOME/etc/hadoop/
      
      • 1

      登录其他主机查看配置文件是否同步成功

    • 启动集群

      1. 配置workers

        vim $HADOOP_HOME/etc/hadoop/workers
        
        • 1

        添加内容

        hadoop1
        hadoop2
        hadoop3
        
        • 1
        • 2
        • 3

        不能有空行,行尾不能有空格

      2. 同步文件到其他主机

        xsync $HADOOP_HOME/etc
        
        • 1
      3. 启动集群

        如果是第一次启动,需要现在 NameNode 节点上执行格式化

        #在NameNode节点,即hadoop1上执行
        hdfs namenode -format
        
        • 1
        • 2

        注意:格式化NameNode,会产生新的集群id,导致NameNode和DataNode的集群id不一致,集群找不到已往数据。如果集群在运行过程中报错,需要重新格式化NameNode的话,一定要先停止namenode和datanode进程,并且要删除所有机器的$HADOOP_HOME/data$HADOOP_HOME/logs目录,然后再进行格式化。

        在hadoop1主机启动HDFS

        #在NameNode节点执行,即hadoop1上执行
        start-dfs.sh
        
        • 1
        • 2

        在hadoop2主机启动YARN

        #在ResourceManager节点执行,即hadoop2上执行
        start-yarn.sh
        
        • 1
        • 2
      4. 通过web服务查看NameNode和ResourceManager

        # 查看HDFS的NameNode
        http://hadoop1:9870
        # 查看YARN的ResourceManager
        http://hadoop2:8088
        
        • 1
        • 2
        • 3
        • 4

        如果页面都能正常打开则集群启动成功

      5. 查看各节点进程

        # hadoop1 主机
        [hadoop@hadoop1 hadoop]$ jps
        21745 NodeManager
        21860 Jps
        20682 NameNode
        20797 DataNode
        
        
        # hadoop2主机
        [hadoop@hadoop2 hadoop]$ jps
        9986 DataNode
        10535 NodeManager
        10410 ResourceManager
        10891 Jps
        
        # hadoop3主机
        [hadoop@hadoop3 hadoop]$ jps
        17488 NodeManager
        17584 Jps
        17397 SecondaryNameNode
        17289 DataNode
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16
        • 17
        • 18
        • 19
        • 20
        • 21

    5 配置历史服务器

    ​ 为了查看程序的历史运行情况,可以配置历史服务器

    • 配置mapred-site.xml

      # 添加如下内容
      
      
          mapreduce.jobhistory.address
          hadoop1:10020
      
      
      
      
          mapreduce.jobhistory.webapp.address
          hadoop1:19888
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    • 同步配置到其他主机

      xsync $HADOOP_HOME/etc
      
      • 1
    • 在hadoop1启动历史服务器

      mapred --daemon start historyserver
      
      • 1
    • 查看进程

      [hadoop@hadoop1 hadoop]$ jps
      2176 NodeManager
      1714 NameNode
      2292 Jps
      1865 DataNode
      1533 JobHistoryServer
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 访问web

      http://hadoop1:19888/jobhistory
      
      • 1

    6 配置日志聚集

    ​ 日志聚集概念:应用运行完成以后,将程序运行日志信息上传到HDFS系统上。

    ​ 日志聚集功能好处:可以方便的查看到程序运行详情,方便开发调试。

    ​ 注意:开启日志聚集功能,需要重新启动NodeManager 、ResourceManager和HistoryServer。

    • 配置 yarn-site.xml

      添加内容

      
      <property>
          <name>yarn.log-aggregation-enablename>
          <value>truevalue>
      property>
      
      <property>  
          <name>yarn.log.server.urlname>  
          <value>http://hadoop1:19888/jobhistory/logsvalue>
      property>
      
      <property>
          <name>yarn.log-aggregation.retain-secondsname>
          <value>604800value>
      property>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
    • 同步配置

      xsync $HADOOP_HOME/etc
      
      • 1
    • 关闭NodeManager , ResourceManager , HistroyServer

      # 在hadoop2上执行
      stop-yarn.sh
      
      # 在hadoop1上执行
      mapred --daemon stop historyserver
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 开启NodeManager , ResourceManager , HistroyServer

      # 在hadoop2上执行
      start-yarn.sh
      
      # 在hadoop1上执行
      mapred --daemon start historyserver
      
      • 1
      • 2
      • 3
      • 4
      • 5

    7 编写Hadoop集群常用脚本

    1 hadoop集群启停脚本

    1. ~/bin目录下创建 myhadoop.sh

      vim ~/bin/myhadoop.sh
      
      • 1
    2. 添加内容

      #!/bin/bash
      
      if [ $# -lt 1 ]
      then
          echo "No Args Input..."
          exit ;
      fi
      
      case $1 in
      "start")
              echo " =================== 启动 hadoop集群 ==================="
      
              echo " --------------- 启动 hdfs ---------------"
              ssh hadoop1 "/opt/module/hadoop/sbin/start-dfs.sh"
              echo " --------------- 启动 yarn ---------------"
              ssh hadoop2 "/opt/module/hadoop/sbin/start-yarn.sh"
              echo " --------------- 启动 historyserver ---------------"
              ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon start historyserver"
      ;;
      "stop")
              echo " =================== 关闭 hadoop集群 ==================="
      
              echo " --------------- 关闭 historyserver ---------------"
              ssh hadoop1 "/opt/module/hadoop/bin/mapred --daemon stop historyserver"
              echo " --------------- 关闭 yarn ---------------"
              ssh hadoop2 "/opt/module/hadoop/sbin/stop-yarn.sh"
              echo " --------------- 关闭 hdfs ---------------"
              ssh hadoop1 "/opt/module/hadoop/sbin/stop-dfs.sh"
      ;;
      *)
          echo "Input Args Error..."
      ;;
      esac
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
    3. 添加执行权限

      chmod +x ~/bin/myhadoop.sh
      
      • 1
    4. 测试脚本

      # 停止
      myhadoop.sh stop
      # 启动
      myhadoop.sh start
      
      • 1
      • 2
      • 3
      • 4
    5. 同步文件

      xsync ~/bin
      
      • 1

    2 查看三台主机的java进程脚本

    1. ~/bin目录下创建 jpsall

      vim ~/bin/jpsall
      
      • 1
    2. 添加内容

      #!/bin/bash
      
      for host in hadoop1 hadoop2 hadoop3
      do
              echo =============== $host ===============
              ssh $host 'jps' 
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    3. 添加执行权限

      chmod +x ~/bin/jpsall
      
      • 1
    4. 测试脚本

      [hadoop@hadoop1 ~]$ jpsall
      =============== hadoop1 ===============
      4448 DataNode
      4723 NodeManager
      4889 JobHistoryServer
      4985 Jps
      4299 NameNode
      =============== hadoop2 ===============
      4372 DataNode
      4550 ResourceManager
      5053 Jps
      4686 NodeManager
      =============== hadoop3 ===============
      3420 SecondaryNameNode
      3677 Jps
      3310 DataNode
      3503 NodeManager
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    5. 同步到其他主机

      xsync ~/bin/
      
      • 1

    8 默认常用端口号说明

    端口Hadoop2.Xhadoop3.x
    NameNode内部通信端口8020/90008020/9000/9820
    NameNode HTTP UI500709870
    MapReduce 查看执行任务端口80888088
    历史服务器通信端口1988819888
  • 相关阅读:
    [微前端实战]---03微前端实现方式对比
    垃圾收集算法
    2010年5月27日Go生态洞察:I/O中Go的热门问答
    使用containerlab搭建cilium BGP环境解析
    刷题记录:牛客NC51180Accumulation Degree
    Flutter:类功能索引(全)
    程序员保密协议(合资合作)[范本]
    史上最简单的Terraform教程不浪费时间
    Shell编程从看懂到看开②(字符串、数组、注释、流程控制、read读取控制台输入)
    go 语言使用Beego 生成 swagger文档
  • 原文地址:https://blog.csdn.net/fmi110/article/details/126087817