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 上-
block,是将文件线性切割成块,也是偏移量 offset,大小默认设置为128M,副本数默认为3个,分散存储在集群节点中,
已上传的文件block副本数可以调整,大小不可以调整,只支持一次写入多次读取,同一时刻只有一个写入者 -
副本的放置位置的逻辑
第一个副本:放置在上传文件的 DN,如果是集群外提交,则随机挑选一台磁盘不满,CPU不忙的
第二个副本:放置在与同一个副本不同的机架上的某个 DN
第三个副本:放置在与第二个副本同一个机架,不同的 DN 上
更多个脚本:出去上边3个,其他随机放置在不同的 DN 上
-
-
SecondaryNameNode (2NN)
它不是 NN 的备份,主要工作是帮助 NN 合并 fsimage 和 edits log信息,减少 NN 启动时间-
2NN 执行合并文件的时机:根据配置的时间间隔 dfs.namenode.checkpoint.perid 默认是3600秒,
或者根据配置文件设置一定数量的文件系统事物之后 dfs.namenode.checkpoint.txns,默认是 1000000次事物
如果同时设置了这两个属性,则达到的哪一个阈值将触发一个检查点 -
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日志文件就可以合并下一个最新的快照文件
-
-
安全模式
-
NN 启动的时候,首先将映射文件fsimage载入内存,并执行编辑日志edits log文件里的操作
-
一旦在内存中成功建立文件系统元数据的映射,则会创建一个新的fsimage 文件和一个空的edits log文件
此刻 NN 是安全模式,即 NN 的文件系统对于客户端来说只读 -
此时,NN 接收到各个 DN 的心跳和汇报信息,会收集到数据块的位置等信息,当数据块达到最小副本数时,
会被认为是安全的,在一定比例的数据块被确认为安全后,再过若干时间,安全模式结束 -
当检测到副本数不足的数据块,块会被复制到其他 DN 中,直到达到最小副本数,系统中数据块的位置并不是由 NN 维护,而是以块列表形式存储在 DN 中
-
hadoop 概述一,已经写了hdfs的一些基本概念,那作为分布式文件系统,是怎么进行读写的?下边讲述hdfs的读写流程
HDFS中读写流程中有一些额外的小的概念,下面讲述一下
- block
blokc块,一般是128M,可以修改大小,但不推荐,原因如下:
-
如果块设置过大,
一方面,从磁盘传输数据的时间会明显大于寻址时间,导致程序在处理这块数据时,变得非常慢;
另一方面,mapreduce中的map任务通常一次只处理一个块中的数据,如果块过大运行速度也会很慢。 -
如果块设置过小,
一方面存放大量小文件会占用NameNode中大量内存来存储元数据,而NameNode的内存是有限的,不可取;
另一方面文件块过小,寻址时间增大,导致程序一直在找block的开始位置。
-
packet
packet 它是client端向DataNode,或者DataNode之间使用PipLine传输的基本单位,默认64KB -
chunk
它是client向DataNode,或者DataNode之间PipLine之间进行数据校验的基本单位,默认是512Byte,因为要用作校验,
故每个chunk需要带有4Byte的校验位,一个chunk的大小是516Byte
HDFS写流程
写流程步骤
-
客户端向NameNode发出写文件请求,
-
检查文件是否已经存在,是否有权限写,如果校验通过,写入到edits log,并返回输出流对象和可写的DataNode列表
-
客户端按128MB的大小切分文件
-
客户端根据NameNode返回的可分配的可写DataNode列表,将Data数据发送给最近的一个DataNode节点写入一个packet,
列表中其他可写DataNode节点会和第一个节点形成pipline管道,将packet在多个节点写入,使得多个DataNode节点可以同时写入 -
给个DataNode写完一个块后,会返回确认信息
-
写数据完成,关闭输出流
-
发送完成信号给NameNode
HDFS读流程
读流程步骤
-
客户端访问NameNode,查询元数据信息,获取这个文件按照距离排序的位置信息,返回输入流对象
-
选择最近的一台DataNode服务器,请求建立输入流
-
客户端从DataNode读取数据,以packet为单位,还要校验完整性
-
关闭输入流
从我们之前搭建的hadoop来看HDFS存在如下问题
- NameNode 单点故障,难于应用于在线场景
- NameNode 压力过大,且内存受限,影响系统扩展性
- 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
- 然后一键查看进程并分发该脚本
chmod 777 /home/hadoop/bin/xcall
xsync /home/hadoop/bin/
- 各节点应该启动的hadoop进程如下图
xcall jps
hadoop集群安装
hadoop集群安装
- 安装环境服务部署规划
服务器IP | node01 | node02 | node03 |
---|---|---|---|
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界面
-
hdfs集群访问地址
http://192.168.56.10:9870 -
yarn集群访问地址
http://192.168.56.10:8088 -
jobhistory访问地址:
http://192.168.56.10:19888
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 -
服务规划
节点 namenode namenode datanode zookeeper zkFC Journalnode ha01 * * * ha02 * * * * * ha03 * * * ha04 * *
修改4台服务器的/etc/hosts文件,追加IP和节点信息,HA集群需要用到ssh免密登录,这里免密登录有2中场景
- ha01控制执行hadoop脚本会用到免密登录到其他机器
- 两个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 树型显示当前运行的进程。
集群启动验证
- 启动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查看是否是我们规划的服务信息