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
    
  • 修改主机名

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

    #关闭防火墙
    systemctl stop firewalld.service
    #禁用开机启动
    systemctl disable firewalld.service
    
    
    #重启防火墙
    systemctl restart firewalld.service
    #查看防火墙状态
    systemctl status firewalld.service
    

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

  • 禁用selinux

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

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

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

    useradd hadoop
    passwd hadoop
    

    所有主机上都创建

    密码:fmi135246

  • 配置hadoop用户的root权限

    vim /etc/sudoers
    

    %wheel下一行添加内容

    hadoop ALL=(ALL) NOPASSWD:ALL
    

    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
    

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

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

    # 在hadoop1上执行
    ssh-copy-id hadoop1
    ssh-copy-id hadoop2
    ssh-copy-id hadoop3
    

    其他主机上同理执行

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
    
  • 配置环境变量

    可直接将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
    

    使用上个命令的参数 !$ ,或者 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
    
  • 配置环境变量到 /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
    

    $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/
    

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
    
  • 配置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
    

    添加 JAVA_HOME配置

    export JAVA_HOME=/usr/local/jdk
    

    验证配置

    hadoop version
    
  • 复制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/
    
  • 登录其他主机配置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
    

    修改内容为:

    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
    
  • 编写集群文件分发脚本xsync

    新建xsync文件

    vim ~/bin/xsync
    

    添加如下内容

    #!/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
    

    添加执行权限

    chmod +x ~/bin/xsync
    

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

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

    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

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      
      <configuration>
          <!-- 指定NameNode的地址 -->
          <property>
              <name>fs.defaultFS</name>
              <value>hdfs://hadoop1:8020</value>
          </property>
      
          <!-- 指定hadoop数据的存储目录,需要手动创建目录 -->
          <property>
              <name>hadoop.tmp.dir</name>
              <value>/opt/module/hadoop/data</value>
          </property>
      
          <!-- 配置HDFS网页登录使用的静态用户为hadoop -->
          <property>
              <name>hadoop.http.staticuser.user</name>
              <value>hadoop</value>
          </property>
      </configuration>
      
    2. 配置hdfs-site.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      
      <configuration>
      	<!-- nn web端访问地址-->
      	<property>
              <name>dfs.namenode.http-address</name>
              <value>hadoop1:9870</value>
          </property>
      	<!-- 2nn web端访问地址-->
          <property>
              <name>dfs.namenode.secondary.http-address</name>
              <value>hadoop3:9868</value>
          </property>
      </configuration>
      
    3. 配置yarn-site.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      
      <configuration>
          <!-- 指定MR走shuffle -->
          <property>
              <name>yarn.nodemanager.aux-services</name>
              <value>mapreduce_shuffle</value>
          </property>
      
          <!-- 指定ResourceManager的地址-->
          <property>
              <name>yarn.resourcemanager.hostname</name>
              <value>hadoop2</value>
          </property>
      
      </configuration>
      
    4. 配置mapred-site.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
      
      <configuration>
      	<!-- 指定MapReduce程序运行在Yarn上 -->
          <property>
              <name>mapreduce.framework.name</name>
              <value>yarn</value>
          </property>
      </configuration>
      
  • 同步配置文件到其他主机

    xsync $HADOOP_HOME/etc/hadoop/
    

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

  • 启动集群

    1. 配置workers

      vim $HADOOP_HOME/etc/hadoop/workers
      

      添加内容

      hadoop1
      hadoop2
      hadoop3
      

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

    2. 同步文件到其他主机

      xsync $HADOOP_HOME/etc
      
    3. 启动集群

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

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

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

      在hadoop1主机启动HDFS

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

      在hadoop2主机启动YARN

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

      # 查看HDFS的NameNode
      http://hadoop1:9870
      # 查看YARN的ResourceManager
      http://hadoop2:8088
      

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

    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
      

5 配置历史服务器

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

  • 配置mapred-site.xml

    # 添加如下内容
    <!-- 历史服务器端地址 -->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop1:10020</value>
    </property>
    
    <!-- 历史服务器web端地址 -->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop1:19888</value>
    </property>
    
  • 同步配置到其他主机

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

    mapred --daemon start historyserver
    
  • 查看进程

    [hadoop@hadoop1 hadoop]$ jps
    2176 NodeManager
    1714 NameNode
    2292 Jps
    1865 DataNode
    1533 JobHistoryServer
    
  • 访问web

    http://hadoop1:19888/jobhistory
    

6 配置日志聚集

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

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

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

  • 配置 yarn-site.xml

    添加内容

    <!-- 开启日志聚集功能 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
    <!-- 设置日志聚集服务器地址 -->
    <property>  
        <name>yarn.log.server.url</name>  
        <value>http://hadoop1:19888/jobhistory/logs</value>
    </property>
    <!-- 设置日志保留时间为7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>
    
  • 同步配置

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

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

    # 在hadoop2上执行
    start-yarn.sh
    
    # 在hadoop1上执行
    mapred --daemon start historyserver
    

7 编写Hadoop集群常用脚本

1 hadoop集群启停脚本

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

    vim ~/bin/myhadoop.sh
    
  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
    
  3. 添加执行权限

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

    # 停止
    myhadoop.sh stop
    # 启动
    myhadoop.sh start
    
  5. 同步文件

    xsync ~/bin
    

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

  1. ~/bin目录下创建 jpsall

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

    #!/bin/bash
    
    for host in hadoop1 hadoop2 hadoop3
    do
            echo =============== $host ===============
            ssh $host 'jps' 
    done
    
  3. 添加执行权限

    chmod +x ~/bin/jpsall
    
  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
    
  5. 同步到其他主机

    xsync ~/bin/
    

8 默认常用端口号说明

端口Hadoop2.Xhadoop3.x
NameNode内部通信端口8020/90008020/9000/9820
NameNode HTTP UI500709870
MapReduce 查看执行任务端口80888088
历史服务器通信端口1988819888
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值