赞
踩
NFS和QJM解决方案的不同点: #数据存储方式不同
1》NFS解决方案: 数据存储方式为 NFS
2》QJM解决方案: 数据存储方式为 JournalNode
NameNode 更新很频繁,为了保持主备数据的一致性,为了支持快速Failover, Standby
NameNode 持有集群中 Blocks 的最新位置是非常必要的。为了达到这一目的,DataNodes上需要同时配置这两个 NameNode 的地址,同时和它们都建立心跳连接,并把 block 位置发送给它们
fsimage 一致性: #存放名称空间和块设备的映射信息(数据的位置信息);
1》存储数据时,客户端先切分数据,然后访问NameNode1;
2》NameNode1返回给客户端数据存储的位置信息;
3》客户端将数据存储在对应的DataNode节点上;
4》DataNode完成数据的存储后,将存储成功的信息,发送给NameNode1和NameNode2, NameNode1和NameNode2将数据的位置信息存储在fsimage中;
1》Active NameNode 为在HDFS集群中使用的NameNode节点;
2》Standby NameNode 为在HDFS集群中备用的NameNode节点;
3》当修改数据时,Active NameNode将修改的请求写入到fsedits中,为了实现fsedits的高可用,将fsedits存储在JNS上【日志服务器】;
4》Standby NameNode 从JNS上【日志服务器】读取这些更新日志,合并到自己的fsimages中;
> namenode的高可用是依靠zookeeper的 ZKFC【ZookeeperFailoverController】实现的;
# 修改主机名
[root@localhost ~]# hostnamectl set-hostname hadoop1 && bash
# 安装javajdk
[root@hadoop1 ~]# yum -y install java-1.8.0-openjdk-devel
# 配置本地域名解析,添加新的节点 hadoop2
[root@hadoop1 ~]# vim /etc/hosts
192.168.1.50 hadoop1
192.168.1.58 hadoop2
192.168.1.51 node1
192.168.1.52 node2
192.168.1.53 node3
##禁用ssh key检测
##添加 StrictHostKeyChecking no 即可
[root@hadoop1 ~]# vim /etc/ssh/ssh_config
Host *
GSSAPIAuthentication yes
####禁用 ssh key 检测
StrictHostKeyChecking no
# 修改配置文件,在linux上启动hadoop命令的脚本配置文件
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hadoop-env.sh
# 修改环境变量
export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre"
# 指定hadoop配置文件所在的路径
export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"
# 配置slaves,让node1,node2,node3都运行datanode守护进程
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/slaves
node1
node2
node3
#声明namenode服务的地址, 因为namenode有两个,不能要写组名称,这里定义两个namenode节点都在mycluster组中,此处只是声明,后面会具体定义
<name>fs.defaultFS</name>
<value>hdfs://{服务名}</value>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
修改hadoop1 core-site.xml配置参数
#fs.defaultFS 声明namenode服务的地址, 因为namenode有两个,不能要写组名称,这里定义两个namenode节点都在mycluster组中,此处只是声明,后面会具体定义
#hadoop.tmp.dir 声明hadoop数据的存放路径
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
<description>hdfs file system</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
</configuration>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
######### 修改core-site.xml文件,在hadoop1主机上操作 #############
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
<description>hdfs file system</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/var/hadoop</value>
</property>
###### ha.zookeeper.quorum 指定zookeeper服务,新增配置 ########
<property>
<name>ha.zookeeper.quorum</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
</configuration>
# namenode是一个组,指定namenode的组名称,自己可以定义
<name>dfs.nameservices</name>
<value>服务名</value>
# 指定namenode组的成员
<name>dfs.ha.namenodes.{服务名}</name>
<value>nn1,nn2</value>
#删除dfs.namenode.http-address的属性配置
#删除dfs.namenode.secondary.http-address的属性配置
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
#dfs.nameservices 指定namenode的组名称,自己可以定义
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
#dfs.ha.namenodes.mycluster 指定namenode组mycluster的成员为nn1和nn2
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
</configuration>
<name>dfs.namenode.rpc-address.{服务名}.nn1</name>
<value>hadoop1:8020</value>
<name>dfs.namenode.rpc-address.{服务名}.nn2</name>
<value>hadoop2:8020</value>
修改hadoop1 hdfs-site.xml配置参数
# 配置nn1和nn2的rpc地址和端口号
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
dfs.ha.namenodes.mycluster.nn1 指定nn1对应的rpc服务地址和端口
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop1:8020</value>
</property>
##dfs.ha.namenodes.mycluster.nn2 指定nn2对应的rpc服务地址和端口
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop2:8020</value>
</property>
<name>dfs.namenode.http-address.{服务名}.nn1</name>
<value>hadoop1:50070</value>
<name>dfs.namenode.http-address.{服务名}.nn2</name>
<value>hadoop2:50070</value>
修改hadoop1 hdfs-site.xml配置参数
###配置namenode1和namenode2的地址及端口号
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
# 指定namenode1的服务地址和端口号
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop1:50070</value>
</property>
###指定namenode1的服务地址和端口号
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop2:50070</value>
</property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/{服务名}</value>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/journal</value>
修改hadoop1 hdfs-site.xml配置参数
#配置JournalNode的地址和端口号,以及JournalNode的数据存放地址
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
指定JournalNode 的地址及端口号,JournalNode将被安装在node{1,2,3}上
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</value>
</property>
指定JournalNode的日志数据存放地址
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/hadoop/journal</value>
</property>
<name>dfs.client.failover.proxy.provider.{服务名}</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
修改hadoop1 hdfs-site.xml配置参数
# 指定failover 类服务名和远程管理方式【ssh】
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
# 指定Failover的类服务名
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
# 指定远程管理方式,sshfence 使用 ssh 远程管理
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
修改hadoop1 hdfs-site.xml配置参数
# 指定ssh 私钥的位置,配置自动故障切换
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
# 指定 ssh 私钥的位置
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
# 配置自动故障切换,true【自动故障切换】,false【手动故障切换】
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<name>dfs.replication</name>
<value>2</value>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/exclude</value>
修改hadoop1 hdfs-site.xml配置参数
# 指定文件副本数量,和排除主机列表【已经配置过了】
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/hdfs-site.xml
# 指定文件副本数量为2,连同原文件加起来是两份
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
# 指定排除主机列表文件,用于删除节点使用
<property>
<name>dfs.hosts.exclude</name>
<value>/usr/local/hadoop/etc/hadoop/exclude</value>
</property>
</configuration>
<name>mapreduce.framework.name</name>
<value>yarn</value>
修改hadoop1 mapred-site.xml配置参数
# mapreduce.framework.name 要使用计算框架的必须选项,如果是单机版,值为local;如果是分布式集群,值则为yarn;
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
<name>yarn.nodemanager.aux-services</name>
<name>mapreduce_shuffle</name>
修改hadoop1 yarn-site.xml配置参数
# yarn.nodemanager.aux-services 指定要使用的分布式计算框架,可以使用开发人员写的计算框架,这里采用的是官方提供的模板计算框架;
# 删除 yarn.resourcemanager.hostname 的属性配置
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>
# yarn.nodemanager.aux-services 指定要使用的分布式计算框架
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- Site specific YARN configuration properties -->
<configuration>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
修改hadoop1 yarn-site.xml配置参数
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
**激活HA配置**
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
**配置管理节点状态自动恢复**
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
修改hadoop1 yarn-site.xml配置参数
# 修改yarn-site.xml配置文件
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
# 定义数据状态保持介质
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
# 指定zookeeper的服务地址,为了防止单节点故障,指定三个节点
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>node1:2181,node2:2181,node3:2181</value>
</property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
修改hadoop1 yarn-site.xml配置参数
# 修改yarn-site.xml配置文件
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
# 指定集群ID
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-ha</value>
</property>
# 定义两个 resourcemanager 角色: rm1和rm2
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
<name>yarn.resourcemanager..hostname.rm2</name>
<value>hadoop2</value>
修改hadoop1 yarn-site.xml配置参数
# 修改yarn-site.xml配置文件
[root@hadoop1 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
# 指定rm1对应的主机地址 hadoop1
<configuration>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop1</value>
</property>
# 指定rm2对应的主机地址 hadoop2
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop2</value>
</property>
</configuration>
# 使用脚本 zkstats,查看zookeeper的角色
[root@hadoop1 ~]# sh zkstats node{1..3} hadoop1
node1 Mode: follower
node2 Mode: leader
node3 Mode: follower
hadoop1 Mode: observer
# 如果zookeeper服务没有启动,所有节点执行如下启动命令:
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh start
# - 把所有机器删除之前的日志和实验数据
rm -rf /var/hadoop/*
rm -rf /usr/local/hadoop/logs/*
NN1: 格式化
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs namenode -format
NN2: 数据同步到本地 /var/hadoop/dfs
# 创建目录
[root@hadoop2 ~]# mkdir /var/hadoop
# 将namenode1格式化后的数据【dfs目录】到本地目录/var/hadoop/下
[root@hadoop2 ~]# rsync -aXSH --delete hadoop1:/var/hadoop/dfs /var/hadoop/
# 查看数据同步结果
[root@hadoop2 ~]# ls /var/hadoop/
NN1: 初始化 JNS
# 查看帮助信息,获取初始化参数
[root@hadoop2 ~]# /usr/local/hadoop/bin/hdfs namenode --help
# 执行journalnode的初始化
[root@hadoop2 ~]# /usr/local/hadoop/bin/hdfs namenode -initializeSharedEdits
# 停止journalnode服务
[root@node1 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode
# 停止journalnode服务
[root@node2 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode
# 停止journalnode服务
[root@node3 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode
NN1 启动 HDFS 和 Yarn
# 在namenode1上启动HDFS 和 Yarn
[root@hadoop1 ~]# /usr/local/hadoop/sbin/start-all.sh
NN2 启动 resourcemanager
[root@hadoop2 ~]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
获取NameNode状态
/usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
/usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2
# 查看haadmin的帮助信息
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin --help
# NameNode1作为master,处于活跃状态
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
# NameNode1作为backup, 处于备用状态
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2
# 获取rm1的ResourceManager的状态信息
[root@hadoop2 ~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
# 获取rm2的ResourceManager的状态信息
[root@hadoop2 ~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2
/usr/local/hadoop/bin/hdfs dfsadmin -report
/usr/local/hadoop/bin/yarn node -list
# 查看hdfs文件系统的信息
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs dfsadmin -report
# 查看计算节点的信息
[root@hadoop1 ~]# /usr/local/hadoop/bin/yarn node -list
/usr/local/hadoop/bin/hadoop fs -mkdir /input
/usr/local/hadoop/bin/hadoop fs -ls hdfs://{服务名}
# 在hdfs中创建目录/input
[root@hadoop1 ~]# /usr/local/hadoop/bin/hadoop fs -mkdir /input
# 查看数据
[root@hadoop1 ~]# /usr/local/hadoop/bin/hadoop fs -ls /
# 进入到hadoop安装目录下
[root@hadoop1 ~]# cd /usr/local/hadoop/
# 上传当前目录下的txt文件到hdfs中
[root@hadoop1 hadoop]# ./bin/hadoop fs -put *.txt /input
# 查看文件是否上传成功
[root@hadoop1 hadoop]# ./bin/hadoop fs -ls /input
# 分析数据,统计hdfs中,/input下数据中单词的数量
[root@hadoop1 hadoop]# ./bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount /input /output
# 停止 namenode的服务
[root@hadoop1 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop namenode
# 停止 resourcemanager的服务
[root@hadoop1 ~]# /usr/local/hadoop/sbin/yarn-daemon.sh stop resourcemanager
# 查看数据分析结果,数据分析结果正常
[root@hadoop1 hadoop]# /usr/local/hadoop/bin/hadoop fs -cat /output
# namenode1无法连接
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
# namenode2从standby【备用】状态,变为active【主】
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2
# rm1【resourcemanager】无法连接
[root@hadoop1 ~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
# rm2【resourcemanager】从standby【备用】状态,变为active【主】
[root@hadoop1 ~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2
**恢复hadoop集群的高可用**
# 启动resourcemanager的服务
[root@hadoop1 ~]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
# 启动namenode的服务
[root@hadoop1 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh start namenode
# nn1【namenode】重启启动,变成了standby【备】
[root@hadoop1 ~]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
# rm1【resourcemanager】重启启动,变成了standby【备】
[root@hadoop1 ~]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。