1、集群模式

1.1 虚拟机准备

  • 再准备三台虚拟机
  • 可以通过命令脚本分发hadoop的安装文件,避免每台虚拟机都要重新配置,可以使用脚本来循环完成
  • rsync相比常规的scp命令,只会去拷贝不相同的文件,跳过相同文件,这样就能加快拷贝速度
    1. rsync -rvl /opt/hadoop-3.1.3/ root@hadoop102:/opt/hadoop-3.1.3
    2. rsync -rvl /opt/hadoop-3.1.3/ root@hadoop103:/opt/hadoop-3.1.3
    3. rsync -rvl /opt/hadoop-3.1.3/ root@hadoop104:/opt/hadoop-3.1.3
    4. rsync -rvl /opt/hadoop-3.1.3/ root@hadoop105:/opt/hadoop-3.1.3

1.2 集群规划

  • NN(NameNode)是目录,DN(DataNode)是实际的文件存放地,所以规划集群时候,尽可能分开放入不同的服务器
  • SNN(SecondaryNameNode)是目录的二级缓存,起到对NN的维护作用,二者的内存占用是一致的,所以SNN和NN也不要放在同一台服务器上
  • 如果条件允许,我们最好可以分配单独的服务器来专门做计算用,这部分服务器不用来存放数据,以保证MR(MapReduce)性能最高
  • 对于YARN来说,RM(ResourceManager)是所有资源请求的入口,要为他分配最大的内存,因此我们将这个节点放在DN上,避免和NN、SNN竞争内存
  • NM(NodeManager)是单节点的管理器,所以每个服务器都要有
hadoop101 hadoop102 hadoop103 hadoop104
HDFS NN
日志服务器
Hive、Spark等
DN
SNN
DN
YARN NM NM NM RM+NM

1.3 集群配置

1.3.1 HDFS配置

  • 修改core-site.xml,将主机名改为规划的NN主机

    1. <!-- 指定HDFS中NameNode的地址 -->
    2. <property>
    3. <name>fs.defaultFS</name>
    4. <value>hdfs://hadoop101:9000</value>
    5. </property>
  • 配置hadoop-env.sh(配置后分发至每台主机即可,已配完可略过)

    export JAVA_HOME=/opt/module/jdk1.8.0_144
    
  • 配置hdfs-site.xml

    <!-- 指定HDFS副本的数量,比如现在有4个 -->
    <property>
          <name>dfs.replication</name>
          <value>4</value>
    </property>
    <!-- 指定Hadoop辅助名称节点SNN主机配置 -->
    <property>
      <name>dfs.namenode.secondary.http-address</name>
      <value>hadoop103:50090</value>
    </property>
    

1.3.2 YARN配置

  • 配置yarn-env.sh(hadoop3版本可省略)

    export JAVA_HOME=/opt/jdk1.8.0_241
    
  • 配置yarn-site.xml

    <!-- 指定YARN的ResourceManager的地址 -->
    <property>
          <name>yarn.resourcemanager.hostname</name>
          <value>hadoop104</value>
    </property>
    <!-- Reducer获取数据的方式 -->
    <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
    </property>
    

1.3.3 MapReduce配置

  • 配置mapred-env.sh,(hadoop3版本可省略)

    export JAVA_HOME=/opt/jdk1.8.0_241
    
  • 配置mapred-site.xml

    <!-- 指定MR运行在Yarn上 -->
    <property>
      <name>mapreduce.framework.name</name>
          <value>yarn</value>
    </property>
    <!-- 指定MR运行日志服务器 -->
    <property>
      <name>mapreduce.jobhistory.address</name>
          <value>hadoop101:10020</value>
    </property>
    <!-- 历史服务器web端地址 -->
    <property>
      <name>mapreduce.jobhistory.webapp.address</name>
      <value>hadoop101:19888</value>
    </property>
    

1.3.4 分发配置文件

  • scp可在主机未安装情况下,整个软件进行复制

    scp -r /opt/hadoop/ root@hadoop102:/opt/hadoop/
    scp -r /opt/hadoop/ root@hadoop103:/opt/hadoop/
    scp -r /opt/hadoop/ root@hadoop104:/opt/hadoop/
    
  • rsync是在主机上已经安装了hadoop,只需要同步配置文件时使用

    rsync -rvl /opt/hadoop/etc/hadoop/ root@hadoop102:/opt/hadoop/etc/hadoop/
    rsync -rvl /opt/hadoop/etc/hadoop/ root@hadoop103:/opt/hadoop/etc/hadoop/
    rsync -rvl /opt/hadoop/etc/hadoop/ root@hadoop104:/opt/hadoop/etc/hadoop/
    
  • 常规做法要输入四次命令很麻烦,更好的做法是使用脚本来循环调用,在/home目录下创建bin目录,并在bin目录下创建xsync文件,这个文件名就是日后脚本调用的方法名

    cd /home
    mkdir bin
    touch xsync
    vim xsync
    
  • 脚本内容如下 ```shell

    !/bin/bash

    1 获取输入参数个数,如果没有参数,直接退出

    pcount=$# if((pcount==0)); then echo no args; exit; fi

2 获取文件名称

p1=$1 fname=basename $p1 echo fname=$fname

3 获取上级目录到绝对路径 –P指向实际物理地址,防止软连接

pdir=cd -P $(dirname $p1); pwd echo pdir=$pdir

4 获取当前用户名称

user=whoami

5 循环,我们初始主机101,需要分发至三台上

for((host=101; host<=104; host++)); do echo —————————- hadoop$host ——————— rsync -rvl $pdir/$fname $user@hadoop$host:$pdir done


- 赋予脚本权限
```shell
chmod 777 xsync

1.4 集群启动

  • 第一次启动时一定格式化,否则集群启动时候,hadoop101用jps命令会看不到NN进程

    hdfs namenode -format
    
  • 根据规划,可以根据职责在不同服务器上启动不同节点,但这样做特别慢,所以最好做群启节点

1.4.1 ssh免密码登录

  • 可以在主机上保存ssh秘钥文件,这样就能让服务器之间互相实现免密码登录
  • 首先生成公钥和私钥,然后拷贝至其他主机,建议可以所有主机都操作一遍,完成互联互通
    ssh-keygen -t rsa
    ssh-copy-id hadoop101
    ssh-copy-id hadoop102
    ssh-copy-id hadoop103
    ssh-copy-id hadoop104
    

1.4.2 配置集群关系

  • 根据hadoop官方文档,我们可以在./etc/hadoop/workers这个文件中配置所有参与集群的服务器主机名,然后就能借助内置的集群脚本来群启节点,前提是参与集群的服务器之间是可以免密码ssh登录的。workers文件并未初始存在,所以我们需要新建一个,然后追加 ```shell cd /opt/hadoop-3.1.3/etc/hadoop/ touch workers vim workers

追加所有主机名

hadoop101 hadoop102 hadoop103 hadoop104


- 然后继续分发脚本(建议使用脚本代替)。

<a name="YxSul"></a>
#### 1.4.3 群启集群节点

- 配置好集群节点文件后,是可以单个节点去启动的,但这样做太麻烦,而且得自己维护哪台服务器启动什么组件,所以hadoop提供了群启工具,进入hadoop安装目录下:
```shell
# 启动HDFS集群
sbin/start-dfs.sh
  • 如果出现下面的错误,就是因为我们安装hadoop时候用的是root帐号,但脚本启动文件的用户权限却不是root导致的(建议不要用root用户安装)

image.png

  • 修改sbin目录下的start-dfs.sh,stop-dfs.sh脚本文件,在顶部追加

    #!/usr/bin/env bash
    HDFS_DATANODE_USER=root
    HDFS_DATANODE_SECURE_USER=hdfs
    HDFS_NAMENODE_USER=root
    HDFS_SECONDARYNAMENODE_USER=root
    
  • start-yarn.sh,stop-yarn.sh顶部也需添加

    #!/usr/bin/env bash
    YARN_RESOURCEMANAGER_USER=root
    HDFS_DATANODE_SECURE_USER=yarn
    YARN_NODEMANAGER_USER=root
    
  • 再次分发配置文件

    rsync -rvl /opt/hadoop/sbin/ root@hadoop102:/opt/hadoop/sbin/
    rsync -rvl /opt/hadoop/sbin/ root@hadoop103:/opt/hadoop/sbin/
    rsync -rvl /opt/hadoop/sbin/ root@hadoop104:/opt/hadoop/sbin/
    
  • 启动成功

image.png

  • NN会分配给输入命令的当前主机,这个暂时无法指定,所以应在规划的NN服务器上输入启动命令
  • YARN是需要单独启动的,并且会默认把运行启动命令的主机分配为ResourceManger,所以,记得去对应的主机上输入命令。

    #启动YARN
    [root@hadoop104 hadoop-3.1.3]# sbin/start-yarn.sh
    Starting resourcemanager
    Starting nodemanagers
    [root@hadoop104 hadoop-3.1.3]# jps
    2285 DataNode
    2717 NodeManager
    2543 ResourceManager
    3071 Jps
    
  • 现在通过jps命令查看每台主机的组件运行情况

    [root@hadoop101 sbin]# jps
    3760 DataNode
    4289 Jps
    4148 NodeManager
    3561 NameNode
    
    [root@hadoop102 ~]# jps
    2312 NodeManager
    2457 Jps
    2091 DataNode
    
    [root@hadoop103 ~]# jps
    2418 SecondaryNameNode
    2740 Jps
    2295 DataNode
    2585 NodeManager
    
    [root@hadoop104 ~]# jps
    2285 DataNode
    2717 NodeManager
    3117 Jps
    2543 ResourceManager
    
  • 服务器节点的运行符合预期规划,至此集群搭建成功。通过连接http://hadoop101:9870可以直接访问web页面。

1.4.4 历史服务器启动

sbin/mr-jobhistory-daemon.sh start historyserver

1.4.5 群启群停脚本编写

  • hadoop自带脚本无法满足规划需求时,可以自己编写脚本
    echo "开始启动HDFS"
    /opt/hadoop/sbin/start-dfs.sh
    echo "启动日志服务器"
    mapred --daemon start historyserver
    echo "开始启动YARN"
    ssh root@hadoop104 "/opt/hadoop/sbin/start-yarn.sh"
    echo "启动完毕"
    
    echo "开始关闭HDFS"
    /opt/hadoop/sbin/stop-dfs.sh
    echo "开始关闭YARN"
    ssh root@hadoop104 "/opt/hadoop/sbin/stop-yarn.sh"
    echo "停止日志服务器"
    mapred --daemon stop historyserver
    echo "关闭成功"