Hadoop 概述(一)

Hadoop概述信息

hadoop 有三大组成部分,HDFS(分布式文件存储系统)、YARN(资源管理器)、MAPREDUCE(分布式计算框架) ,下边我们来简单介绍一下

HDFS 分布式文件存储系统

HDFS分布式文件系统,是由Google的GFS谷歌文件系统开源出来,其存储模型是有主从结构的,可以划分出来以下几点

    • NameNode(NN)
      基于内存存储,不会和磁盘发生交互,使用映射快照和日志文件进行持久化,保存元数据信息,
      以及保存文件名,文件属性,block块列表偏移量,位置信息和副本位置(block位置信息不会持久化,由 DN 心跳汇报)

    • DataNode(DN)
      以文件形式进行本地磁盘目录存储block块信息,同时会存储block块的元数据文件(MD5文件,用于校验文件完整性)
      启动 DN 时会向 NN 发送心跳信息,同时汇报block的位置信息,默认心跳时间是3秒一次,如果 NN 10分钟没有收到 DN 的心跳汇报,
      则认为其已经丢失,由于副本数会小于系统配置副本数,NN 会进行copy该block块信息到其他 DN 上

      1. block,是将文件线性切割成块,也是偏移量 offset,大小默认设置为128M,副本数默认为3个,分散存储在集群节点中,
        已上传的文件block副本数可以调整,大小不可以调整,只支持一次写入多次读取,同一时刻只有一个写入者

      2. 副本的放置位置的逻辑
        第一个副本:放置在上传文件的 DN,如果是集群外提交,则随机挑选一台磁盘不满,CPU不忙的
        第二个副本:放置在与同一个副本不同的机架上的某个 DN
        第三个副本:放置在与第二个副本同一个机架,不同的 DN 上
        更多个脚本:出去上边3个,其他随机放置在不同的 DN 上

    • SecondaryNameNode (2NN)
      它不是 NN 的备份,主要工作是帮助 NN 合并 fsimage 和 edits log信息,减少 NN 启动时间

      1. 2NN 执行合并文件的时机:根据配置的时间间隔 dfs.namenode.checkpoint.perid 默认是3600秒,
        或者根据配置文件设置一定数量的文件系统事物之后 dfs.namenode.checkpoint.txns,默认是 1000000次事物
        如果同时设置了这两个属性,则达到的哪一个阈值将触发一个检查点

      2. 2NN 合并的流程
        NN 在触发checkpoint时间节点,会将自己的fsimage 和 edits log 日志信息同步到 2NN。同时创建一个新的edits log
        2NN 会加载fsimage 并执行log日志里的命令,生成一个最新的fsimage.ckpt文件,此时fsimage.ckpt保存的快照信息就是从hadoop启动到当前checkpoint时间节点的信息。
        再次推送fsimage.ckpt 到 NN 转换成fsimage文件,此时会有一个checkpoint时间节点的快照文件,和checkpoint时间节点后的edits log日志文件
        当下次再次触发checkpoint时,2NN 只需要加载edits log日志文件就可以合并下一个最新的快照文件

    • 安全模式

      1. NN 启动的时候,首先将映射文件fsimage载入内存,并执行编辑日志edits log文件里的操作

      2. 一旦在内存中成功建立文件系统元数据的映射,则会创建一个新的fsimage 文件和一个空的edits log文件
        此刻 NN 是安全模式,即 NN 的文件系统对于客户端来说只读

      3. 此时,NN 接收到各个 DN 的心跳和汇报信息,会收集到数据块的位置等信息,当数据块达到最小副本数时,
        会被认为是安全的,在一定比例的数据块被确认为安全后,再过若干时间,安全模式结束

      4. 当检测到副本数不足的数据块,块会被复制到其他 DN 中,直到达到最小副本数,系统中数据块的位置并不是由 NN 维护,而是以块列表形式存储在 DN 中

hadoop 概述一,已经写了hdfs的一些基本概念,那作为分布式文件系统,是怎么进行读写的?下边讲述hdfs的读写流程

HDFS中读写流程中有一些额外的小的概念,下面讲述一下

  1. block
    blokc块,一般是128M,可以修改大小,但不推荐,原因如下:
  • 如果块设置过大,
    一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
    另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。

  • 如果块设置过小,
    一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
    另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。

  1. packet
    packet 它是client端向DataNode,或者DataNode之间使用PipLine传输的基本单位,默认64KB

  2. chunk
    它是client向DataNode,或者DataNode之间PipLine之间进行数据校验的基本单位,默认是512Byte,因为要用作校验,
    故每个chunk需要带有4Byte的校验位,一个chunk的大小是516Byte

HDFS写流程

写流程步骤

  1. 客户端向NameNode发出写文件请求,

  2. 检查文件是否已经存在,是否有权限写,如果校验通过,写入到edits log,并返回输出流对象和可写的DataNode列表

  3. 客户端按128MB的大小切分文件

  4. 客户端根据NameNode返回的可分配的可写DataNode列表,将Data数据发送给最近的一个DataNode节点写入一个packet,
    列表中其他可写DataNode节点会和第一个节点形成pipline管道,将packet在多个节点写入,使得多个DataNode节点可以同时写入

  5. 给个DataNode写完一个块后,会返回确认信息

  6. 写数据完成,关闭输出流

  7. 发送完成信号给NameNode

HDFS读流程

读流程步骤

  1. 客户端访问NameNode,查询元数据信息,获取这个文件按照距离排序的位置信息,返回输入流对象

  2. 选择最近的一台DataNode服务器,请求建立输入流

  3. 客户端从DataNode读取数据,以packet为单位,还要校验完整性

  4. 关闭输入流

从我们之前搭建的hadoop来看HDFS存在如下问题

  1. NameNode 单点故障,难于应用于在线场景
  2. NameNode 压力过大,且内存受限,影响系统扩展性
  3. MapReduce jobTracker访问压力过大,影响系统扩展性

那有没有解决方案呢?
解决单点故障:HDFS HA 通过主备NameNode解决
解决系统扩展性问题:使用HDFS Federation 水平扩展,支持多个NameNode,所有NameNode共享所有DataNode存储资源,每个NameNode分管一部分目录

hadoop集群下几个好用的脚本工具 

远程复制同步脚本

1.通过scp直接拷贝

一般Linux系统之间复制同步文件,或者文件夹使用的是scp,基本语法如下:

scp -r sourceFile  username@host:destpath
  • 或者在有ssh免密登录的情况下可以使用如下命令
scp -r sourceFile  host:$PWD
2. 通过rsync来实现增量拷贝

rsync 远程同步工具,rsync主要用于备份和镜像。具有速度快、避免复制相同内容和支持符号链接的优点。

rsync和scp区别:用rsync做文件的复制要比scp的速度快,rsync只对差异文件做更新。scp是把所有文件都复制过去。

(1) 基本语法

rsync -av sourceFile username@host:destPath

选项参数说明

选项功能
-a 归档拷贝
-v 显示复制过程
例如hadoop01执行以下命令同步zk安装包  
rsync -av /bigdata/soft/apache-zookeeper-3.6.2-bin.tar.gz hadoop02:/bigdata/soft/
3. 通过rsync来封装分发脚本

我们可以通过rsync这个命令工具来实现脚本的分发,可以增量的将文件分发到我们所有其他的机器上面去
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析:
(a)rsync命令原始拷贝:

rsync -av /bigdata/soft hadoop@hadoop02:/bigdata/soft

(b)期望脚本使用方式:
xsync要同步的文件名称
(c)说明:在/home/hadoop/bin这个目录下存放的脚本,hadoop用户可以在系统任何地方直接执行。
(3)脚本实现
三台机器执行以下命令安装rsync工具

sudo yum -y install rsync

(a)在/home/hadoop目录下创建bin目录,并在bin目录下xsync创建文件,文件内容如下:

[hadoop@hadoop01 ~]$ cd ~
[hadoop@hadoop01 ~]$ mkdir bin
[hadoop@hadoop01 ~]$ cd /home/hadoop/bin
[hadoop@hadoop01 bin]$ touch xsync
[hadoop@hadoop01 bin]$ vim xsync

在该文件中编写如下代码

#!/bin/bash
#1 获取输入参数个数,如果没有参数,直接退出
pcount=$#
if ((pcount==0)); then
echo no args;
exit;
fi

#2 获取文件名称
p1=$1
fname=`basename $p1`

echo $fname

#3 获取上级目录到绝对路径
pdir=`cd -P $(dirname $p1); pwd`
echo $pdir

#4 获取当前用户名称
user=`whoami`

#5 循环
for((host=1; host<4; host++)); do
       echo ------------------- hadoop0$host --------------
       rsync -av $pdir/$fname $user@hadoop0$host:$pdir
done

(b)修改脚本 xsync 具有执行权限

[hadoop@hadoop01 bin]$ cd ~/bin/
[hadoop@hadoop01 bin]$ chmod 777 xsync

(c)调用脚本形式:xsync 文件名称

[hadoop@hadoop01 bin]$ xsync /home/hadoop/bin/

注意:如果将xsync放到/home/hadoop/bin目录下仍然不能实现全局使用,可以将xsync移动到/usr/local/bin目录下

一键启动hadoop集群的脚本

  • 为了便于一键启动hadoop集群,我们可以编写shell脚本
  • 在主节点hadoop01服务器的/home/hadoop/bin目录下创建脚本
[hadoop@hadoop01 bin]$ cd /home/hadoop/bin/
[hadoop@hadoop01 bin]$ vi hadoop.sh
  • 内容如下
#!/bin/bash
case $1 in
"start" ){
 source /etc/profile;
 /bigdata/install/hadoop-3.1.4/sbin/start-dfs.sh
 /bigdata/install/hadoop-3.1.4/sbin/start-yarn.sh
 #/bigdata/install/hadoop-3.1.4/sbin/mr-jobhistory-daemon.sh start historyserver
 /bigdata/install/hadoop-3.1.4/bin/mapred --daemon start historyserver
};;
"stop"){

 /bigdata/install/hadoop-3.1.4/sbin/stop-dfs.sh
 /bigdata/install/hadoop-3.1.4/sbin/stop-yarn.sh
 #/bigdata/install/hadoop-3.1.4/sbin/mr-jobhistory-daemon.sh stop  historyserver
 /bigdata/install/hadoop-3.1.4/bin/mapred --daemon stop historyserver
};;
esac
  • 修改脚本权限
[hadoop@hadoop01 bin]$ chmod 777 hadoop.sh
[hadoop@hadoop01 bin]$ ./hadoop.sh start  # 启动hadoop集群
[hadoop@hadoop01 bin]$ ./hadoop.sh stop   # 停止hadoop集群

所有机器查看进程脚本

  • 我们也可以通过jps在每台机器上面查看进程名称,为了方便我们以后查看进程,我们可以通过脚本一键查看所有机器的进程
  • 在主节点hadoop01服务器的/home/hadoop/bin目录下创建文件xcall
[hadoop@hadoop01 bin]$ cd ~/bin/
[hadoop@hadoop01 bin]$ vi xcall
  • 添加以下内容
#!/bin/bash

params=$@
for (( i=1 ; i <= 3 ; i = $i + 1 )) ; do
    echo ============= hadoop0$i $params =============
    ssh hadoop0$i "source /etc/profile;$params"
done
SHELL 复制 全屏
  • 然后一键查看进程并分发该脚本
chmod 777  /home/hadoop/bin/xcall
xsync /home/hadoop/bin/
  • 各节点应该启动的hadoop进程如下图
xcall jps

hadoop集群安装

hadoop集群安装

  • 安装环境服务部署规划
服务器IPnode01node02node03
HDFS NameNode    
HDFS SecondaryNameNode    
HDFS DataNode DataNode DataNode
YARN ResourceManager    
YARN NodeManager NodeManager NodeManager
历史日志服务器 JobHistoryServer    

下载安装包,并解压

下载

目前hadoop已经更新到3.x版本,这次我们使用的是3.1.4版本
使用国内清华大学的镜像库地址
https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.1.4/
将下载的压缩包保存在/bigdata/install

解压
cd /bigdata/install
tar -zxf hadoop-3.1.4.tar.gz -C /bigdata/install/

查看hadoop支持的压缩方式以及本地库

在第一台机器执行以下命令

cd /bigdata/install/hadoop-3.1.4/
bin/hadoop checknative


如果出现openssl为false,那么所有机器在线安装openssl即可,执行以下命令,虚拟机联网之后就可以在线进行安装了

sudo yum -y install openssl-devel

配置文件

一共要修改5个文件hadoop-env.sh、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

修改hadoop-env.sh

第一台机器执行以下命令

cd /bigdata/install/hadoop-3.1.4/etc/hadoop
vi hadoop-env.sh

查找到JAVA_HOME的配置信息,修改为下边信息

export JAVA_HOME=/bigdata/install/jdk1.8.0_141
修改core-site.xml

第一台机器执行以下命令

vi core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:8020</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/bigdata/install/hadoop-3.1.4/hadoopDatas/tempDatas</value>
    </property>
    <!--  缓冲区大小,实际工作中根据服务器性能动态调整;默认值4096 -->
    <property>
        <name>io.file.buffer.size</name>
        <value>4096</value>
    </property>
    <!--  开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟;默认值0 -->
    <property>
        <name>fs.trash.interval</name>
        <value>10080</value>
    </property>
</configuration>
修改hdfs-site.xml

第一台机器执行以下命令

vi hdfs-site.xml
<configuration>
    <!-- NameNode存储元数据信息的路径,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割   --> 
     <property>
            <name>dfs.namenode.secondary.http-address</name>
            <value>hadoop01:9868</value>
    </property>
    <property>
        <name>dfs.namenode.http-address</name>
        <value>hadoop01:9870</value>
    </property>
    <!-- namenode保存fsimage的路径 -->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/namenodeDatas</value>
    </property>
    <!--  定义dataNode数据存储的节点位置,实际工作中,一般先确定磁盘的挂载目录,然后多个目录用,进行分割  -->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/datanodeDatas</value>
    </property>
    <!-- namenode保存editslog的目录 -->
    <property>
        <name>dfs.namenode.edits.dir</name>
        <value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/nn/edits</value>
    </property>
    <!-- secondarynamenode保存待合并的fsimage -->
    <property>
        <name>dfs.namenode.checkpoint.dir</name>
        <value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/snn/name</value>
    </property>
    <!-- secondarynamenode保存待合并的editslog -->
    <property>
        <name>dfs.namenode.checkpoint.edits.dir</name>
        <value>file:///bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/nn/snn/edits</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.permissions.enabled</name>
        <value>false</value>
    </property>
	<property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
</configuration>
修改mapred-site.xml

第一台机器执行以下命令

vi mapred-site.xml
<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.job.ubertask.enable</name>
        <value>true</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
        <property>
        <name>yarn.app.mapreduce.am.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.map.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
    <property>
        <name>mapreduce.reduce.env</name>
        <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
    </property>
</configuration>
修改yarn-site.xml

第一台机器执行以下命令

vi yarn-site.xml
<configuration>
    <property>
       <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
    </property>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 如果vmem、pmem资源不够,会报错,此处将资源监察置为false -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>
</configuration>
修改workers文件

第一台机器执行以下命令

vi workers

把里面内容全部删除后替换为

hadoop01
hadoop02
hadoop03

创建文件存放目录

第一台机器执行以下命令

hadoop01机器上面创建以下目录

mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/tempDatas
mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/namenodeDatas
mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/datanodeDatas 
mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/nn/edits
mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/snn/name
mkdir -p /bigdata/install/hadoop-3.1.4/hadoopDatas/dfs/nn/snn/edits

hadoop01执行以下命令进行拷贝

cd /bigdata/install
scp -r hadoop-3.1.4/ hadoop02:$PWD
scp -r hadoop-3.1.4/ hadoop03:$PWD

配置hadoop的环境变量

三台机器都要进行配置hadoop的环境变量,三台机器执行以下命令

sudo vi /etc/profile
export HADOOP_HOME=/bigdata/install/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

配置完成之后生效

source /etc/profile

集群启动以及验证

格式化集群
  • 要启动 Hadoop 集群,需要启动 HDFS 和 YARN 两个集群。
  • 注意:首次启动HDFS时,必须对其进行格式化操作。本质上是一些清理和准备工作,因为此时的 HDFS 在物理上还是不存在的。格式化操作只有在首次启动的时候需要,以后再也不需要了
  • hadoop01执行一遍即可
hdfs namenode -format
  • 或者
hadoop namenode –format
  • 下图高亮表示格式化成功;
集群启动
  • 启动集群有两种方式:
    • ①脚本一键启动;
    • ②单个进程逐个启动
1. 启动HDFS、YARN、Historyserver
  • 如果配置了 etc/hadoop/workers 和 ssh 免密登录,则可以使用程序脚本启动所有Hadoop 两个集群的相关进程,在主节点所设定的机器上执行。
  • 启动集群
  • 主节点hadoop01节点上执行以下命令
start-dfs.sh
start-yarn.sh
# 已过时mr-jobhistory-daemon.sh start historyserver
mapred --daemon start historyserver
  • 停止集群(主节点hadoop01节点上执行):
stop-dfs.sh
stop-yarn.sh 
# 已过时 mr-jobhistory-daemon.sh stop historyserver
mapred --daemon stop historyserver
2. 单个进程逐个启动
# 在主节点上使用以下命令启动 HDFS NameNode: 
# 已过时 hadoop-daemon.sh start namenode 
hdfs --daemon start namenode

# 在主节点上使用以下命令启动 HDFS SecondaryNamenode: 
# 已过时 hadoop-daemon.sh start secondarynamenode 
hdfs --daemon start secondarynamenode

# 在每个从节点上使用以下命令启动 HDFS DataNode: 
# 已过时 hadoop-daemon.sh start datanode
hdfs --daemon start datanode

# 在主节点上使用以下命令启动 YARN ResourceManager: 
# 已过时 yarn-daemon.sh start resourcemanager 
yarn --daemon start resourcemanager

# 在每个从节点上使用以下命令启动 YARN nodemanager: 
# 已过时 yarn-daemon.sh start nodemanager 
yarn --daemon start nodemanager

以上脚本位于$HADOOP_HOME/sbin/目录下。如果想要停止某个节点上某个角色,只需要把命令中的start 改为stop 即可。
验证访问web ui界面

hadoop HA高可用搭建

接上回hadoop概述二,我们了解到了hdfs有弊端,需要搭建HA,通过官网查看有2中方式进行高可用。一种基于QJM方式的,另一种基于联邦的,
我们今天先来使用QJM方案来做hadoop的高可用,使用4台服务器来做集群,还会用到zookeeper来做主备切换的调控

先说一下我们的IP分配和服务的规划信息

  • 节点和IP

    节点IP
    ha01 192.168.56.20
    ha02 192.168.56.21
    ha03 192.168.56.22
    ha04 192.168.56.23
  • 服务规划

    节点namenodenamenodedatanodezookeeperzkFCJournalnode
    ha01 *       * *
    ha02   * * * * *
    ha03     * *   *
    ha04     * *    

修改4台服务器的/etc/hosts文件,追加IP和节点信息,HA集群需要用到ssh免密登录,这里免密登录有2中场景

  1. ha01控制执行hadoop脚本会用到免密登录到其他机器
  2. 两个namenode进行主备切换时需要登录到对方机器,杀死对方的相应进程,然后提升自己节点的为激活状态
vi /etc/hosts
192.168.56.20	ha01
192.168.56.21	ha02
192.168.56.22	ha03
192.168.56.23	ha04

保存退出后执行/etc/init.d/network restart ,生效hosts文件内容

安装zk

以前已写了安装zk教程,请查看之前的zookeeper集群安装的教程,本次需要安装的是ha02,ha03,ha04,切换成对应的机器信息即可

免密登录

我们使用的hadoop用户,所以我们就在hadoop用户的家目录下进行创建免密登录的信息,其他3台相同操作

[hadoop@ha01 ~]$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
[hadoop@ha01 ~]$ ssh-copy-id ha01          ##复制公钥信息到authorized_keys中

配置hadoop信息

  • hadoop.env.sh
cd /bigdata/install/hadoop-3.1.4/etc/hadoop/
vi hadoop.env.sh

找到JAVA_HOME和HADOOP_HOME,对该配置项进行编辑,并去掉注释符
JAVA_HOME=/bigdata/install/jdk1.8.0_141
HADOOP_HOME=/bigdata/install/hadoop-3.1.4
  • core-site.xml
vi core-site.xml
<configuration>
	<property>
	  <name>fs.defaultFS</name>
	  <value>hdfs://mycluster</value>
	</property>
	<!--  hadoop临时目录 -->
	<property>
	    <name>hadoop.tmp.dir</name>
	    <value>/bigdata/install/hadoop-3.1.4/hadoopDatas/tempDatas</value>
	</property>
	<!--  zk 集群信息 -->
	 <property>
	   <name>ha.zookeeper.quorum</name>
	   <value>ha02:2181,ha03:2181,ha04:2181</value>
	 </property>
	<!--  缓冲区大小,实际工作中根据服务器性能动态调整;默认值4096 -->
	<property>
	    <name>io.file.buffer.size</name>
	    <value>4096</value>
	</property>
</configuration>
  • hdfs-site.xml
<configuration>
	<property>
	  <name>dfs.nameservices</name>
	  <value>mycluster</value>
	</property>
	<property>
	  <name>dfs.ha.namenodes.mycluster</name>
	  <value>nn1,nn2</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
	  <value>ha01:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
	  <value>ha02:8020</value>
	</property>
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn1</name>
	  <value>ha01:9870</value>
	</property>
	<property>
	  <name>dfs.namenode.http-address.mycluster.nn2</name>
	  <value>ha02:9870</value>
	</property>
	<property>
	  <name>dfs.namenode.shared.edits.dir</name>
	  <value>qjournal://ha01:8485;ha02:8485;ha03:8485/mycluster</value>
	</property>
	<property>
	  <name>dfs.journalnode.edits.dir</name>
	  <value>/bigdata/install/hadoop-3.1.4/hadoopDatas/journal</value>
	</property>
	<property>
	  <name>dfs.client.failover.proxy.provider.mycluster</name>
	  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
	</property>
	<property>
	  <name>dfs.ha.fencing.methods</name>
	  <value>sshfence</value>
	</property>
	<property>
	  <name>dfs.ha.fencing.ssh.private-key-files</name>
	  <value>/home/hadoop/.ssh/id_rsa</value>
	</property>
	<property>
	   <name>dfs.ha.automatic-failover.enabled</name>
	   <value>true</value>
	 </property>

	<property>
	    <name>dfs.replication</name>
	    <value>3</value>
	</property>
	<property>
	    <name>dfs.permissions.enabled</name>
	    <value>false</value>
	</property>
	<property>
	    <name>dfs.blocksize</name>
	    <value>134217728</value>
	</property>
</configuration>
  • yarn-site.xml
<configuration>
	<property>
	  <name>yarn.resourcemanager.ha.enabled</name>
	  <value>true</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.cluster-id</name>
	  <value>cluster1</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.ha.rm-ids</name>
	  <value>rm1,rm2</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.hostname.rm1</name>
	  <value>ha01</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.hostname.rm2</name>
	  <value>ha02</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.webapp.address.rm1</name>
	  <value>ha01:8088</value>
	</property>
	<property>
	  <name>yarn.resourcemanager.webapp.address.rm2</name>
	  <value>ha02:8088</value>
	</property>
	<property>
	  <name>hadoop.zk.address</name>
	  <value>ha02:2181,ha03:2181,ha04:2181</value>
	</property>
  <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
  </property>
  <!-- 如果vmem、pmem资源不够,会报错,此处将资源监察置为false -->
  <property>
      <name>yarn.nodemanager.vmem-check-enabled</name>
      <value>false</value>
  </property>
  <property>
      <name>yarn.nodemanager.pmem-check-enabled</name>
      <value>false</value>
  </property>
</configuration>
  • works
vi works,works里面表示的datanode节点的名称,我们这里是ha02-ha04
ha02
ha03
ha04

注意
由于我们在安装centos7的时候选择了最小化安装,默认是不安装psmics。但在ZKFC中会使用到里面的命令来进行主从切换,否则切换失败,所以需安装psmisc
yum -y install psmisc
简短说明,包含fuser,killall,pstree三个程序

fuser 显示使用指定文件或者文件系统的进程的PID。
killall 杀死某个名字的进程,它向运行指定命令的所有进程发出信号。
pstree 树型显示当前运行的进程。

集群启动验证

  1. 启动zookeeper集群
    由于我们在ha02/ha03/ha04安装zookeeper,启动是在这3台进行
    zkServer.sh start

2.启动journalnode
JN我们规划是在ha01/ha02/ha03,在这3台分别执行
hadoop-daemon.sh start journalnode

3.格式化namenode,启动主从namenode
格式化是hdfs中namenode第一次启动时要进行的操作,这里做了集群后是2个namenode,挑选一台,比如我们选的是ha01
ha01执行 hdfs namenode -format
启动主从namenode,
在ha01执行 hadoop-daemon.sh start namenode

在ha02执行 hdfs namenode -bootstrapStandby

4.格式化zk
在启动ZKFC时需要依赖zookeeper集群,上边已启动集群,对zookeeper集群格式化
在ha01执行 hdfs zkfc -formatZK

5.启动其他服务
现在就可以启动其他服务了,我们在ha01执行 start-dfs.sh

然后在4台机器上输入jps查看是否是我们规划的服务信息

 
 
 

 

posted @ 2022-05-04 14:15  hanease  阅读(124)  评论(0编辑  收藏  举报