avatar

目录
Hadoop学习笔记(一)Hadoop集群

Hadoop学习笔记(一)Hadoop集群

一、介绍

Hadoop集群有三种模式:

  • 本地模式:即系统自身的文件系统。
  • 伪分布式模式:即在一台机子上运行所有角色。
  • 完全分布式模式:根据划分,不同机子拥有不同的角色来进行协同工作。

二、伪分布式搭建

  1. 建虚拟机

  2. 配置联网

    • 查看当前网卡名称 (ip addr)

    • 进入网络配置文件的目录(cd /etc/sysconfig/network-scripts) (ls)

    • 编辑网络配置文件(vi ifcfg-ens33)

      Code
      修改配置文件:
      BOOTPROTO=static
      ONBOOT=yes
      添加:
      IPADDR=本机IP
      NETMASK=255.255.255.0
      GATEWAY=NAT模式网关IP
      DNS1=8.8.8.8
    • 再重新启动网络配置(service network restart)

    • 测试网络是否畅通(本地PING 虚拟机IP,虚拟机ping外网)

  3. 更改主机名

    Code
    vi /etc/hostname
    将里面的内容替换为需要的主机名
  4. 配置主机名(域名)映射文件,整个集群都写上去

    Code
    vi /etc/hosts
    新建:
    127.0.0.1 localhost
    192.168.xxx.xxx XXX
  5. 安装JDK1.8,配置环境变量(Hadoop是JAVA开发)

  6. 解压Hadoop(这里使用hadoop-3.0)

  7. 修改Hadoop配置文件

    • 修改 vi hadoop-env.sh 的JAVA环境变量为自己的
    xml
    export JAVA_HOME=/home/hadoop/app/jdk1.8.0_131
    • 修改 vi core-site.xml
      xml
      <configuration>
      <!-- hdfs://xxx其中hdfs是协议,xxx是核心主机,默认端口号9000 -->
      <property>
      <name>fs.defaultFS</name>
      <value>hdfs://weekend01:9000</value>
      </property>
      <!-- 配置Hadoop的临时工作目录存放数据,默认/tmp/hadoop-${user.name} -->
      <property>
      <name>hadoop.tmp.dir</name>
      <value>/home/hadoop/app/hadoop-3.1.2/tmp/</value>
      </property>
      </configuration>
    • 修改 vi hdfs-site.xml
      xml
      <configuration>
      <!-- 指定HDFS副本的数量,默认是3份。副本数不要超过节点数量。这里只有一台机器所以写1 -->
      <property>
      <name>dfs.replication</name>
      <value>1</value>
      </property>
      </configuration>
    • 修改 vi mapred-site.xml
      xml
      <configuration>
      <!-- 指定mr运行时框架,这里指定在yarn上,默认是local在本地跑 -->
      <property>
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
      </property>
      </configuration>
    • 修改 vi yarn-site.xml
      xml
      <configuration>
      <!-- 指定YARN的老大(ResourceManager)的地址 -->
      <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>weekend01</value>
      </property>
      <!-- reduce获取数据的方式 -->
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      </configuration>
  8. 关闭防火墙(CentOS7如下)

    shell
    #关闭防火墙
    systemctl stop firewalld.service
    #关闭防火墙随开机启动
    systemctl disable firewalld.service
    --------------------------------------------------------------------------
    $>sudo systemctl enable firewalld.service //"开机启动"启用
    $>sudo systemctl disable firewalld.service //"开机自启"禁用
    $>sudo systemctl start firewalld.service //启动防火墙
    $>sudo systemctl stop firewalld.service //停止防火墙
    $>sudo systemctl status firewalld.service //查看防火墙状态
  9. 配置Hadoop环境变量

    Code
    export JAVA_HOME=/home/hadoop/app/jdk1.8.0_131
    export HADOOP_HOME=/home/hadoop/app/hadoop-3.1.2
    export PATH=$PATH:$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin
    更新配置
    source /etc/profile
  10. 启动Hadoop

    • 初始化

      Code
      首次启动Hadoop集群时,必须对其HDFS进行格式化。格式化本质上是进行一些清理和准备工作,因为此时的HDFS在物理上还是不存在的。格式化只能在主角色(NameNode)所在的机器上进行。

      hdfs namenode -format
    • 启动

      Code
      hdfs(namenode + datanode + secondarynamenode):  
      start-dfs.sh
      yarn资源管理调度(resourcemanager + nodemanager):
      start-yarn.sh

      TIP:如果遇到Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).问题,搜索文章:在CentOS 7中配置免密码登录SSH时遇到错误

      还有一个是启动所有进程(不推荐)
      start-all.sh
      关闭所有进程
      stop-all.sh
    1. 查看进程

      Code
      $> jps
      显示5个进程:
      2960 ResourceManager
      3392 Jps
      2550 DataNode
      3079 NodeManager
      2440 NameNode(仅仅是一个目录的功能)
      2734 SecondaryNameNode
    • 通过WEB-UI查看

      Code
      角色							   URL						说明
      NameNode http://NN_host:port/ 默认端口是9870
      ResourceManager http://RM_host:port/ 默认端口是8088
      MapReduce Job History Server http://JHS_host:port/ 默认端口是19888
  11. 配置SSH

    Code
    1)检查是否安装了ssh相关软件包(openssh-server + openssh-clients + openssh)
    $yum list installed | grep ssh

    2)检查是否启动了sshd进程
    $>ps -Af | grep sshd

    3)在client侧生成公私秘钥对。
    $>ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

    4)生成~/.ssh文件夹,里面有id_rsa(私钥) + id_rsa.pub(公钥)

    5)追加公钥到~/.ssh/authorized_keys文件中(文件名、位置固定)
    $>cd ~/.ssh
    $>cat id_rsa.pub >> authorized_keys

    6)修改authorized_keys的权限为644.
    $>chmod 644 authorized_keys

    7)测试
    $>ssh localhost

三、完全分布式搭建

  1. 将上述伪分布式机器克隆3台出来(其中01作为名称节点,02-04作为数据节点),记得设置文件夹共享(默认是关闭:设置,选项,文件夹共享,总是启用)

  2. 修改hostname和ip地址文件还有host映射

    Code
    $sudo vi /etc/hostname # 修改主机名

    $sudo vi /etc/hosts # 新增4台机子的IP以及对应的主机名

    $sudo vi /etc/sysconfig/network-scripts/ifcfg-ensxxxx # IP文件目录

    $service network restart # 重启网络服务
  3. 重新配置SSH

    Code
    1) 在s201机器上删除所有机器上的SSH文件
    $ssh s203 rm -r /home/wbw/.ssh/*
    $ssh s204 rm -r /home/wbw/.ssh/*
    $ssh s205 rm -r /home/wbw/.ssh/*
    $rm -r .ssh/*

    2)s201机器生成密钥对,并通过SCP发送给其余机器(不用sudo)
    $ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
    # 追加公钥到authorized_keys
    $cat id_rsa.pub >> authorized_keys
    $chmod 644 authorized_keys
    # 分发
    $scp id_rsa.pub wbw@s201:/home/wbw/.ssh/authorized_keys
    $scp id_rsa.pub wbw@s202:/home/wbw/.ssh/authorized_keys
    $scp id_rsa.pub wbw@s203:/home/wbw/.ssh/authorized_keys
    $scp id_rsa.pub wbw@s204:/home/wbw/.ssh/authorized_keys
  4. 配置完全分布(目录为${hadoop_home}/etc/hadoop/)

    • core-site.xml(根据集群规划,S201为名称节点)

      xml
      <configuration>
      <property>
      <name>fs.defaultFS</name>
      <value>hdfs://s201/</value>
      </property>
      <!--- 配置新的本地目录 -->
      <property>
      <name>hadoop.tmp.dir</name>
      <value>/home/wbw/hadoop</value>
      </property>
      </configuration>
    • hdfs-site.xml(因为这里有3个数据节点,所以副本改成3)

      xml
      <configuration>
      <property>
      <name>dfs.replication</name>
      <value>3</value>
      </property>
      </configuration>
    • mapred-site.xml(不变)

    • yarn-site.xml(根据集群规划,S201为resourcemanager)

      xml
      <configuration>
      <property>
      <name>yarn.resourcemanager.hostname</name>
      <value>s201</value>
      </property>
      <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
      </property>
      </configuration>
    • slaves(workers)

      Code
      清空里面的所有内容!根据集群规划,数据节点在s202,s203,s204上。然后添加:
      s202
      s203
      s204
    • hadoop-env.sh(Hadoop的JAVA环境,如果之前没有配的化,要记得设置)

    • 将整个配置文件夹分发到其余机器对应的配置文件夹里

      Code
      scp -r full wbw@s202:/soft/hadoop/etc/
      scp -r full wbw@s203:/soft/hadoop/etc/
      scp -r full wbw@s204:/soft/hadoop/etc/

      !!!注意这里的full是我自己的文件夹,正常应该只有一个名为hadoop的文件夹!!!
  5. 剩余数据清理

    Code
    TIP:如果之前有用过Hadoop(比如这个是克隆来的,而克隆之前用过了。所以对一些文件进行清理后,重新初始化)

    1)删除临时目录文件
    进入主目录下的临时文件夹
    $cd /tmp
    删除hadoop的临时文件(用SSH操作其余机器)
    $rm -rf hadoop-wbw
    $ssh s202 rm -rf /tmp/hadoop-wbw
    $ssh s203 rm -rf /tmp/hadoop-wbw
    $ssh s204 rm -rf /tmp/hadoop-wbw

    2)删除Hadoop日志文件
    进入Hadoop安装目录下的logs文件夹
    $cd /soft/hadoop/logs/
    删除所有文件(用SSH操作其余机器)
    $rm -rf *
    $ssh s202 rm -rf /soft/hadoop/logs/*
    $ssh s203 rm -rf /soft/hadoop/logs/*
    $ssh s204 rm -rf /soft/hadoop/logs/*
  6. 初始化文件系统并启动

    Code
    $hadoop namenode -format
    $start-all.sh
    # 查看进程
    $jps

    s201:
    2178 ResourceManager
    1964 SecondaryNameNode
    2478 Jps
    1743 NameNode

    s202:
    1825 Jps
    1699 NodeManager
    1588 DataNode

    s203:
    1536 NodeManager
    1425 DataNode
    1650 Jps

    s204:
    1522 NodeManager
    1411 DataNode
    1636 Jps

    发现启动成功!再次通过WEB-UI查看,发现确实启动成功!(注意关闭防火墙)

四、启动命令

4.1 批量启动节点

Hadoop的一些启动脚本里面执行的内容(如果启动失败,可以查看日志,即Hadoop安装目录下的logs文件夹):

Code
$>start-all.sh		//start-dfs.sh + start-yarn.sh
$>start-dfs.sh //hadoop-daemon.sh start namenode
//hadoop-daemons.sh start datanode
$>start-yarn.sh //yarn-daemon.sh start resourcemanager
//yarn-daemons.sh start nodemanager

4.2 单独启动节点

  • 启动s201上的NameNode

    Code
    [wbw@s201 /soft/hadoop/sbin]$hadoop-daemon.sh start namenode
    WARNING: Use of this script to start HDFS daemons is deprecated.
    WARNING: Attempting to execute replacement "hdfs --daemon start" instead.
    [wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
    ============= s201 : /soft/jdk/bin/jps ==============
    5272 NameNode
    5342 Jps
    ============= s202 : /soft/jdk/bin/jps ==============
    2587 Jps
    ============= s203 : /soft/jdk/bin/jps ==============
    2395 Jps
    ============= s204 : /soft/jdk/bin/jps ==============
    2360 Jps
  • 在s201上启动所有DataNode

    Code
    [wbw@s201 /soft/hadoop/sbin]$hadoop-daemons.sh start datanode
    WARNING: Use of this script to start HDFS daemons is deprecated.
    WARNING: Attempting to execute replacement "hdfs --workers --daemon start" instead.
    [wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
    ============= s201 : /soft/jdk/bin/jps ==============
    7019 NameNode
    7246 Jps
    ============= s202 : /soft/jdk/bin/jps ==============
    3837 Jps
    3775 DataNode
    ============= s203 : /soft/jdk/bin/jps ==============
    3494 Jps
    3432 DataNode
    ============= s204 : /soft/jdk/bin/jps ==============
    3459 Jps
    3397 DataNode
  • 在s202上停止DataNode

    Code
    [wbw@s201 /soft/hadoop/sbin]$ssh s202
    Last login: Thu Feb 13 18:41:00 2020 from s201
    [wbw@s202 /home/wbw]$hadoop-daemon.sh stop datanode
    WARNING: Use of this script to stop HDFS daemons is deprecated.
    WARNING: Attempting to execute replacement "hdfs --daemon stop" instead.
    [wbw@s202 /home/wbw]$exit
    logout
    Connection to s202 closed.
    [wbw@s201 /soft/hadoop/sbin]$xcall.sh /soft/jdk/bin/jps
    ============= s201 : /soft/jdk/bin/jps ==============
    7286 Jps
    7019 NameNode
    ============= s202 : /soft/jdk/bin/jps ==============
    3945 Jps
    ============= s203 : /soft/jdk/bin/jps ==============
    3432 DataNode
    3516 Jps
    ============= s204 : /soft/jdk/bin/jps ==============
    3397 DataNode
    3480 Jps

五、节点的服役与退役

在生产环境中,肯定会有新的节点加入,以及旧的节点退出。因此就需要进行一些设置。

5.1 前期准备

克隆一台虚拟机,模拟一个新的节点,这里选s204克隆到s205,然后对IP、主机名等信息进行设置。再到s201中更新hosts文件。但是,因为是克隆的,所以datanode并不纯净,因此需要进行清理操作。

  1. 进入Hadoop安装目录,清空logs目录下的所有日志文件

    Code
    [wbw@s205 /soft/hadoop/logs]$rm -rf *
  2. 清空Hadoop临时文件目录

    Code
    [wbw@s205 /home/wbw/hadoop]$rm -rf *
  3. 启动datandoe以及nodemanager

    Code
    [wbw@s205 /home/wbw]$hadoop-daemon.sh start datanode
    [wbw@s205 /home/wbw]$yarn-daemon.sh start nodemanager
  4. 查看进程,发现运行正常

    Code
    [wbw@s205 /home/wbw]$jps
    1633 NodeManager
    1332 DataNode
    1726 Jps

5.2 添加新节点

  1. 创建/修改dfs.include文件(这里暂时称它为白名单,即要想连接上NameNode就必须在这个名单上)中包含新节点名称,该文件在nn的本地目录

    Code
    [wbw@s201 /soft/hadoop/etc]$touch dfs.hosts
    [wbw@s201 /soft/hadoop/etc]$vi dfs.hosts
    添加如下内容:
    s202
    s203
    s204
    s205 //新节点
  2. 在hdfs-site.xml文件中添加属性

    xml
    <property>
    <name>dfs.hosts</name>
    <value>/soft/hadoop/etc/dfs.hosts</value>
    </property>
  3. 在yarn-site.xml文件中添加属性

    xml
    <property>
    <name>yarn.resourcemanager.nodes.include-path</name>
    <value>/soft/hadoop/etc/dfs.hosts</value>
    </property>
  4. 在NameNode上刷新节点

    Code
    $hdfs dfsadmin -refreshNodes
    $yarn rmadmin -refreshNodes
  5. 在slaves(workers)文件中添加新节点ip(主机名)【该文件仅仅是让Hadoop启动的时候,向这些主机发送DataNode启动命令】

    Code
    [wbw@s201 /soft/hadoop/etc/hadoop]$vi workers
    添加如下内容:
    s202
    s203
    s204
    s205
  6. 单独启动新的节点中的datanode以及nodemanager(建议去新节点的机器上执行jps命令,查看进程状态。实验时,一开始新节点的nodemanager是启动的,但是添加完,在NameNode上刷新节点后,莫名停止了)

    Code
    $hadoop-daemon.sh start datanode
    $yarn-daemon.sh start nodemanager
  7. 通过WEB-UI查看状态,发现s205添加成功(也可以通过命令$hdfs dfsadmin -report查看)

    avatar

5.3 退役节点

  1. 添加退役节点的ip到黑名单,不要更新白名单。

    Code
    [wbw@s201 /soft/hadoop/etc]$touch dfs.hosts.exclude
    [wbw@s201 /soft/hadoop/etc]$vi dfs.hosts.exclude
    添加如下内容:
    s204
  2. 配置hdfs-site.xml

    xml
    <property>
    <name>dfs.hosts.exclude</name>
    <value>/soft/hadoop/etc/dfs.hosts.exclude</value>
    </property>
  3. 配置yarn-site.xml

    xml
    <property>
    <name>yarn.resourcemanager.nodes.exclude-path</name>
    <value>/soft/hadoop/etc/dfs.hosts.exclude</value>
    </property>
  4. 刷新NameNode节点

    Code
    $hdfs dfsadmin -refreshNodes
    $yarn rmadmin -refreshNodes
  5. 查看WEB-UI状态(也可以通过命令$hdfs dfsadmin -report查看)

    • 绿勾消失了(状态为decommisstion in progress)

    avatar

    • 当所有的要退役的节点都报告为Decommissioned,数据转移工作已经完成。

    avatar

  6. 从白名单删除节点,并刷新节点

    Code
    $hdfs dfsadmin -refreshNodes
    $yarn rmadmin -refreshNodes
  7. 查看WEB-UI,确定退役成功。同时文件块也成功转移。

    avatar

    avatar

  8. 从slaves(workers)文件中删除退役节点

5.4 黑白名单

在新增和退役节点的时候,有一个黑白名单的设置。这里的黑白名单有一定的优先级:

include // dfs.hosts
exclude // dfs.hosts.include

include exclude Interpretation
No No 不能连接
No Yes 不能连接
Yes No 可以连接
Yes Yes 可以连接,将会退役状态

解释:Yes和No分别代表主机名是否存在于黑白名单中,以及DataNode能否连接到NameNode。

六、配置第二名称节点

修改hdfs-site.xml文件

xml
<property>
<name>dfs.namenode.secondary.http-address</name>
<!-- 根据实际主机IP修改 -->
<value>s205:9868</value>
</property>

如果不配置这个属性,那么第二名称节点会和名称节点在一台主机上。

效果:

Code
============= s201 : jps ==============
2790 ResourceManager
3096 Jps
2398 NameNode
============= s202 : jps ==============
1780 Jps
1526 DataNode
1662 NodeManager
============= s203 : jps ==============
1664 NodeManager
1782 Jps
1529 DataNode
============= s204 : jps ==============
1781 Jps
1526 DataNode
1663 NodeManager
============= s205 : jps ==============
1767 Jps
1709 SecondaryNameNode

七、Hadoop端口介绍

Hadoop 3 相对于Hadoop 2 在端口号上有一些改变:

分类 应用 Haddop 2.x port Haddop 3 port
NNPorts Namenode 8020 9820
NNPorts NN HTTP UI 50070 9870
NNPorts NN HTTPS UI 50470 9871
SNN ports SNN HTTP 50091 9869
SNN ports SNN HTTP UI 50090 9868
DN ports DN IPC 50020 9867
DN ports DN 50010 9866
DN ports DN HTTP UI 50075 9864
DN ports Namenode 50475 9865
文章作者: IT小王
文章链接: https://wangbowen.cn/2020/02/13/Hadoop%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%B8%80%EF%BC%89Hadoop%E9%9B%86%E7%BE%A4/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT小王

评论