1、HDFS数据迁移解决方案
1.1 迁移方案 ——数据迁移的使用场景和考量因素
场景
冷热集群数据同步、分类存储
使用频率较高的数据随着时间发展频率变低而迁移
集群数据整体搬迁:原A机房搬迁到B机房
数据的准实时同步:数据双备份使用
考量因素
带宽:带宽使用多了影像正常业务,带宽低了迁移慢
性能:采用单机程序,还是多线程的分布式程序
增量同步:TB\PB级别的数据如何只迁移增量数据
数据迁移的同步性:数据迁移的过程需要保证周期内数据一定能够完成(数据迁移的速度要比数据生产的速度快得多)
1.2分布式拷贝工具: DistCp的使用
distCp介绍Apache Hadoop Distributed Copy – DistCp Guide
DistCp是Hadoop中的一种工具,在hadoop-tools工程下,作为独立子工程存在。
定位于数据迁移,定期在集群之间和集群内备份数据
每次运行Distcp都是一个备份周期,速度不高,普及程度高
DistCp底层使用Mapreduce在集群之间或并行在同一集群内复制文件。复制执行只有map阶段
优势性能
带宽限流,根据带宽实际情况,调整带宽,利用闲时带宽
增量同步:update(只拷贝不存在的文件)、append(追加写目标路径下存在的文件)、diff(通过快照对比信息同步源路径和目标路径)实现增量同步
高性能性
底层借助mapreduce实现,分布式运行。
使用命令
$ hadoop distcp
usage: distcp OPTIONS [source_path...] <target_path>
-append #拷贝文件时支持对现有文件进行追加写操作
-async #异步执行distcp拷贝任务
-bandwidth <arg> #对每个Map任务的带宽限速
-delete #删除相对于源端,目标端多出来的文件
-diff <arg> #通过快照diff信息进行数据的同步
-overwrite #以覆盖的方式进行拷贝,如果目标端文件已经存在,则直接覆盖
-p <arg> #拷贝数据时,扩展属性信息的保留,包括权限信息,块大小信息等等
-skipcrccheck #拷贝数据时是否跳过cheacksum的校验
-update #拷贝数据时,只拷贝相对于源端 ,目标端不存在的文件数据
2、HDFS NameNode安全模式
安全模式现象
HDFS集群在停机状态下,使用 hdfs -daemon命令逐个进程启动集群
首先启动namenode。
[root@node1 hadoop]# hdfs --daemon start namenode
[root@node1 hadoop]# jps
30787 Jps
30617 NameNode
[root@node1 hadoop]# hadoop fs -ls /
Found 10 items
drwxr-xr-x - root supergroup 0 2022-11-21 17:05 /common
drwxr-xr-x - root supergroup 0 2022-11-23 19:55 /data
drwxr-xr-x - root supergroup 0 2022-11-20 22:38 /itcast
drwxr-xr-x - root supergroup 0 2022-11-21 21:46 /itheima
drwxr-xr-x - root supergroup 0 2022-11-23 20:31 /source
drwxr-xr-x - root supergroup 0 2022-11-20 18:06 /test
drwxr-xr-x - root supergroup 0 2022-11-23 12:43 /tmp
drwxr-xr-x - root supergroup 0 2022-11-20 18:09 /user
drwxr-xr-x - root supergroup 0 2022-11-21 17:05 /warehouse
drwxr-xr-x - root supergroup 0 2022-11-21 17:05 /workspace
[root@node1 hadoop]# hadoop fs -cat /tmp/small/1.txt
cat: Zero blocklocations for /tmp/small/1.txt. Name node is in safe mode.
读目录可以实现,写、修改、读文件不可以。
UI界面关于安全模式的告知。
启动一个datanode
[root@node1 hadoop]# hdfs --daemon start datanode
安全模式概述:safe mode,是NameNodede的维护状态,在此状态下不允许对文件系统进行任何修改,可以读接受读目录树数据请求。
NameNode 启动过程中,会首先从fsimage和edit日志加载文件系统状态,数据块状态需要datanode汇报数据块状态,等待数据块状态达到安全标准。
进入条件:当namenode启动完成之后,自动进入安全模式,
离开条件:有很多参数(hdfs-site.xml,hdfs-default.xml)
dfs.replication #hdfs block的副本数据,默认3
dfs.replication.max #最大块副本数,默认512
dfs.namenode.replication.min #最小块副本数,默认1
dfs.namenode.safemode.threshold-pct #已汇报可用数据块数量占整体块数量的百分比阈值。默认0.999f。
#小于或等于0,则表示退出安全模式之前,不要等待特定百分比的块。
# 大于1的值将使安全模式永久生效。
dfs.namenode.safemode.min.datanodes #指在退出安全模式之前必须存活的DataNode数量,默认0
dfs.namenode.safemode.extension #达到阈值条件后持续扩展的时间。倒计时结束如果依然满足阈值条件
# 自动离开安全模式。默认30000毫秒
安全模式手动进入和离开:集群运行维护的时候场景
命令
#手动获取安全模式状态信息
hdfs dfsadmin -safemode get
# 手动进入命令
hdfs dfsadmin -safemode enter
离开安全模式
# 离开安全模式
hdfs dfsadmin -safemode leave
3、HDFS高阶优化方案
3.1短路本地读取short circuit local reads
Local Resds: DFSClient和datanode在同一个节点,Remote reads:DFSClient和datanode不在同一个节点。无论是Local Resds,还是Remote reads均是由datanode读取数据,再通过RPC把数据传给DFSClient。
针对本地的数据读取HDFS-2246,让Datanode高速DFSClient数据块的起始结束等信息,客户端DFSClient自己读取数据,数据安全性问题(白名单设置)
安全性改进版设计:HDFS-347提出新的解决方案,UnIx Domain Socket,进程间的通讯方式。客户端找datanode询问文件信息,由datanode打开数据,把文件描述符传递给客户端,然后再由客户端读取数据。相当于绕过datanode读取数据。
配置libhadoop.so提供的用java 操作UnIx Domain Socket进程通讯的方式,编译的时候需要注意编译native模块,检查native包是否安装好的命令
hadoop checknative
关闭hdfs修改配置文件hdfs-site.xml
修改项目为
- ldfs.client.read.shortcircuit 是打开短路本地读取功能的开关
- dfs.domain.socket.path 是Datanode和DFSClient之间沟通的Socket的本地路径
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
scp hdfs-site.xml root@node3:$PWD
scp hdfs-site.xml root@node2:$PWD
#注意:这里创建的是文件夹hadoop-hdfs,而上述配置中的dn_socket是datanode自己创建的,不是文件夹。
mkdir -p /var/lib/hadoop-hdfs
启动hdfs,
确认修改生效的方法一:查看日志
确认修改生效的方法二:
读取一个文件到本地
查看测试文件的块信息
hdfs fsck /tmp/caixukun.csv -files -blocks
下载文件
hadoop fs -get /tmp/caixukun.csv /export/data/temp/
查看日志
方式三 ReadStatistics API 通过HdfsDataInputStream的getReadStatistics API来获取读取数据的统计信息。
public class FileSystemCat {
public static void main(String[] args) throws IOException {
String uri = args[0];
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(URI.create(uri), conf);
OutputStream out = new FileOutputStream("/tmp/out");
FSDataInputStream in = null;
try {
in = fs.open(new Path(uri));
IOUtils.copy(in, out);
if (in instanceof HdfsDataInputStream) {
HdfsDataInputStream hdfsIn = (HdfsDataInputStream) in;
DFSInputStream.ReadStatistics readStatistics = hdfsIn.getReadStatistics();
System.out.println("Total Bytes Read Bytes: " + readStatistics.getTotalBytesRead());
System.out.println("Short Circuit Read Bytes: " + readStatistics.getTotalShortCircuitBytesRead());
System.out.println("Local Read Bytes:" + readStatistics.getTotalLocalBytesRead());
}
} finally {
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
}
}
}
3.2负载均衡、磁盘均衡器、纠删码存储
负载均衡(节点之间)
HDFS 数据可能并不总是在datanode之间均匀分布,一个常见的原因是现有集群中添加了新的datanode。HDFS提供了一个Balancer程序。
所谓平衡时指每个datanode的利用率,例如节点100G,存储了30G,利用率为30%,集群的利用率(HDFS整体已用空间与HDFS集群总容量的比)
原理:先计算集群利用率,例如,三个节点分别为100G,100G,300G。已经总共存储了200G,集群的使用率为40%
平衡器不能在单个节点的不同卷之间平衡。
命令说明:
[root@node1 ~]# hdfs balancer --help
Usage: hdfs balancer
[-policy <policy>] the balancing policy: datanode or blockpool
[-threshold <threshold>] Percentage of disk capacity
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]] Excludes the specified datanodes.
[-include [-f <hosts-file> | <comma-separated list of hosts>]] Includes only the specified datanodes.
[-source [-f <hosts-file> | <comma-separated list of hosts>]] Pick only the specified datanodes as source nodes.
[-blockpools <comma-separated list of blockpool ids>] The balancer will only run on blockpools included in this list.
[-idleiterations <idleiterations>] Number of consecutive idle iterations (-1 for Infinite) before exit.
[-runDuringUpgrade] Whether to run the balancer during an ongoing HDFS upgrade.This is usually not desired since it will not affect used space on over-utilized machines.
-threshold 10 //集群平衡的条件,datanode间磁盘使用率相差阈值,区间选择:0~100
-policy datanode //平衡策略,默认为datanode, 如果datanode平衡,则集群已平衡.
-exclude -f /tmp/ip1.txt //默认为空,指定该部分ip不参与balance, -f:指定输入为文件
-include -f /tmp/ip2.txt //默认为空,只允许该部分ip参与balance,-f:指定输入为文件
-idleiterations 5 //迭代 5
使用:
第一步:设置平衡数据传输带宽:
hdfs dfsadmin -setBalancerBandwidth newbandwidth
newbandwidth是每个datanode在平衡操作期间可以使用的最大网络带宽量,单位字节/秒
第二部:运行balancer
默认参数运行:hdfs balancer
指定阈值运行:hdfs balancer --threshold 10
磁盘均衡器(磁盘之间)HDFS Disk Balaner
Hadoop3.0新特性
相较于个人PC,服务器一般可以通过挂载多块磁盘来扩大单机存储能力
DataNode最终负责数据block的存储,当写入新的数据的时候,datanode根据循环策略和可用空间策略选择写入
循环策略:将新block均匀分布到可用磁盘上,默认此策略,长期使用循环策略,有时会有不均匀的填充存储
可用空间策略:此策略将数据优先存储到剩余空间比较大的磁盘,大量数据短时间写入,其他磁盘处于空闲状态,写入速度瓶颈。
HDFS Disk Balaner解决磁盘存储不均的问题。
功能1:数据传输报告,Volume Data Density metric(卷数据密度度量标准——比较同台积极上不同卷之间的数据分布情况)和Node data Density metric(节点数据密度度量标准——比较的是不同机器之间的),
案例计算:
假设有一台具有四个卷/磁盘的计算机-Disk1,Disk2,Disk3,Disk4,各个磁盘使用情况:
disk1 | disk2 | disk3 | disk4 | |
容量 | 200G | 300G | 350G | 500G |
使用量 | 100G | 76G | 300G | 475G |
使用率 | 0.5 | 0.25 | 0.85 | 0.95 |
卷密度 | 0.2 | 0.45 | -0.15 | -0.24 |
总存储能力:200+300+350+500=1350G
使用:100+76+300+475 = 951
计算每个盘上理想的使用率为:951÷1350 = 0.70
每个磁盘与0.7比较,disk1 = 0.7-0.5=0.2,disk2 :0.7-0.25 = 0.45
disk3 = 0.7-0.85 = -0.15 ,disk4 = 0.7-0.95 = -0.24
节点数据密度是各个卷密度绝对值求和=|0.2|+|0.45|+|+|-0.15|+|-0.24| = 1.04
节点数值密度越低,本节点各卷之间分布越均匀。否则倾斜越严重。
volume Data Density的正值表示磁盘未充分利用,而负值表示磁盘相对于当前理想存储目标的利用率过高。
功能2:磁盘平衡
hdfs-site.xml中调整dfs.disk.balancer.enabled参数值,选择在Hadoop中是否启用磁盘平衡器,默认是开启的。
相关命令
hdfs diskbalancer -plan <datanode>
-out #控制计划文件的输出位置
-bandwidth #设置用于运行Disk Balancer的最大带宽.默认带宽10 MB/s.
-thresholdPercentage #定义磁盘开始参与数据重新分配或平衡操作的值.默认的thresholdPercentage值为10%,
#这意味着仅当磁盘包含的数据比理想存储值多10%或更少时,磁盘才用于平衡操作.
-maxerror #它允许用户在中止移动步骤之前为两个磁盘之间的移动操作指定要忽略的错误数.
-v #详细模式,指定此选项将强制plan命令在stdout上显示计划的摘要.
-fs #此选项指定要使用的NameNode.如果未指定,则Disk Balancer将使用配置中的默认NameNode
# execute命令针对为其生成计划的DataNode执行计划。
hdfs diskbalancer -execute <JSON file path>
# query命令从运行计划的DataNode获取HDFS磁盘平衡器的当前状态。
hdfs diskbalancer -query <datanode>
#cancel命令取消运行计划。
hdfs diskbalancer -cancel <JSON file path>
hdfs diskbalancer -cancel planID node <nodename>
Report汇报
hdfs diskbalancer -fs hdfs://node1:8020 -report
纠删码存储
提供容错能力,存储效率提高。
Erasure Coding(EC):数据分块、计算校验数据、各部分关联数据产生关联性,当一部分丢失,可以通过剩余数据块计算出丢失的数据块。
Hadoop3.0之后引入,提高50%存储效率,
Reed-Solomon(RS)码通俗解释
GT Data Parity
其中,7,8,9,50,122任意两个数据块丢失,均可以恢复。
Hadoop EC架构:为了支持纠删码,体系结构的调整
- 条带化的HDFS文件在逻辑上由block group(组成),每个块组包含一定数量的内部块,这允许在块组级别而不是块级别进行管理
- 客户端的读写路径得到了增强,可以并行处理快组中多个内部块
- Datanode扩展 datanode运行一个附加的ECWorker,对失败的纠删吗进行后台恢复。namenode监测到失败的EC,通知datanode恢复。
- 纠删码策略:默认策略为RS-6-3-1024K策略
- RS表示编码算法Reed-solomon
- 6\3中表述数据库和奇偶校验块的数据量
- 1024k表示条带化单元的大小
也支持用户通过xml文件定义自己的EC策略
操作使用:
硬件资源评估:编码和解码需要消耗datanode上的CPU,机架容错对网络带宽的要求同时对机架数量也很重要。
纠删码策略设置,默认是RS-6-3-1024k,其他策略默认是禁用的,可以通过hdfs ec [-enablePolicy -policy <policyName>]命令启用策略集
启用英特尔ISA-L(智能加速库)
EC命令 hdfs ec
设置完成之后,对用户是无感的。
4、HDFS动态节点管理
节点上线:HDFS集群容量已经不能满足存储数据的需求,需要在原有基础上动态添加datanode
4.1 俗称动态扩容、节点服役
步骤方法:
第一步:新机器基础环境准备
主机名,IP
主机名
hosts映射
防火墙关闭和时间同步,请参考Hadoop集群搭建安装教程(详细完整)_天码村的博客-CSDN博客
ssh免密登录
ssh-copy-id node4
jdk环境
第二步:hadoop配置
hadoop配置文件workers中添加新节点。
scp命令拷贝安装包到新节点
scp -r hadoop-3.1.4 root@node4:$PWD
注意不要拷贝数据目录,数据目录和软件目录不要在同一目录。
第三步:启动新节点
# 启动
hdfs --deamon start datanode
# 查看
jps
如果启动失败,查看日志,解决相应问题。
第四步:设置负载均衡。
#负载均衡带宽
hdfs dfsadmin -setBalancerBandwidth 104857600
# 负载均衡差异
hdfs balancer -threshold 5
4.2 节点下线、
俗称:节点退役、动态缩容
第一步:添加退役节点(这一个配置需要在搭建集群的时候就要做好配置,不然要关闭集群,重新启动,就不是动态退役了)
hdfs-site.xml配置文件中需要提前配置dfs.hosts.exclude属性,提前配置好的目的是让namenode启动的时候加载到该属性,只不过没有指定任何机器,否则就需要重启namenode才能加载,因此这样的操作我们称之为具有前瞻性的操作
<property>
<name>dfs.hosts.exclude</name>
<value>/export/server/hadoop-3.1.4/etc/hadoop/excludes</value>
</property>
编辑dfs.hosts.exclude属性指向的excludes文件,添加需要退役的主机名称
第二步:同步到其他机器上
scp -r hdfs-site.xml root@node2:$PWD
第三步:刷新节点。
hdfs dfsadmin -refreshNodes
如果副本数是3,服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
HDFS集群黑白名单机制
白名单:允许加入到hdfs当前集群中的节点,是一种准入机制
白名单由dfs.hosts,该参数位于hdfs-site.xml,默认为空,所有节点均可以加入
dfs.hosts指向文件,该文件包含允许连接到namenode的主机列表。必须指定文件的完整路径名。如果该值为空,则允许所有主机准入
黑名单:禁止哪些机器加入当前HDFS集群中,默认也是空,不禁止任何主机加入
黑名单由dfs.hosts.exclude参数指定,该参数位于hdfs-site.xml。默认值为空。
dfs.hosts.exclude指向文件,该文件包含不允许连接到名称节点的主机列表。必须指定文件的完整路径名。如果该值为空,则不禁止任何主机加入。
黑名单配置先配置好,主机列表暂时不列,根据需要添加
5、HDFS HA(高可用)机制
5.1 HA引入
单点故障:singe point of failure,系统中某一个点失效,整合系统无法运作,单点故障及整体故障。
如果解决单点故障,实现系统服务高可用的核心不是让故障用不发生,而是故障发生后,业务影像最小。
主备架构:主节点挂掉,备份节点顶上,保证服务的连续性(持续可用性)。一主一备,一主多背
原理、实现、配置
主备集群角色:active、standy
任意时间只有一个active对外服务,备份角色时刻准备着
高可用:High availability,缩写HA,系统无终断的执行。
集群高可用评判标准(X个9)
系统一年使用过程,系统正常使用时间和整体时间的比
三个九:8.76小时,四个九:52.6分钟,五个九:5.26分钟。
5.2 HA系统的核心问题
脑裂问题:split-brain,大脑分裂,本事医学名词。脑裂是指主备节点失去联系,本来为一个整体,同坐协调,失去联系,混乱状态。
后果:集群无主:认为对方都是好的,无服务;集群多主:都认为对方故障,争当主。
数据状态同步问题:主备切换保证主备节点之间的状态和数据是一致的,或者是准一致的。主备差距过大,没有实际意义。常见操作:日志重演操作记录。备角色读取日志。
5.3 NameNode单点故障问题
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。
每个群集只有一个NameNode,如果NameNode进程不可用,则整个HDFS群集不可用
在同一群集中运行两个(从3.0.0起,支持超过两个)冗余NameNode。形成主备架构。
5.4 解决方案
Quorum Journal Manager(仲裁日志管理器)Hadoop官方推荐的hdfs HA解决方案之一
使用zookeeper中的zkfc实现主备切换:
- ZKFailoverController(ZKFC)监视和管理namenode健康状态。
- 维持和zk集群的联系
主备切换的流程分析
(1)两个zkfc去zk集群上注册节点(短暂znode),谁注册成功,谁代表机器上namenode就是active,没有注册成功的岁znode注册监听,监视他是否消失。
(2)zkfc发现active不健康,断开和zk连接session会话消失,其注册的znode节点被删除,触发监听,把事件通知给standby那台机器上的zkfc
(3)standby接收到监听去注册监听,注册成功返回成为新的active
(4)自己成为主节点之前,远程补刀,彻底干死原来主节点,sshfence是指通过ssh登陆目标节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确)
数据状态同步解决的流程分析
Journal Node(JN)集群轻量式分布系统,主要用于高速读写数据、存储数据。
通常用2N+1台JournalNode存储共享EditsLog(编辑日志)
任何修改操作在active namenode上执行时,journal进程同时会记录edit log到半数以上的jn中,这时standby监测到jn里面的数据变化,就会读取数据,重演操作。
5.5HA集群搭建
高可用集群搭建单独写一篇,这里不再叙述。移步
6、HDFS Federation(联邦)机制
当前HDFS体系架构:
- 命名空间:文件、块、目录组成抽象的目录数结构。namenode
- 块存储:块的管理(namenode)\存储(datanode)
HDFS架构的局限性:datanode可以动态扩容、namenode内存空间满了怎么办?如论读、写,都需要namenode成为唯一入口,会不会成为系统吞吐量的瓶颈?安全性机制?
HDFS Federation(联邦)机制:namenode的之间的Federation,也就是集群中会有多个namenode,多个namespace。每个namenode各有分工,不需要协调,管理自己的工作。
命名空间的可扩展性-可伸缩性,文件从不同入口访问-吞吐量,
联邦架构的配置资料。以下源自教材资料,没有亲自验证,保存在本篇博客,以待后续翻阅
初始化步骤
先启动zookeeper集群
再在5/6/7上启动journalnode
hadoop-daemon.sh start journalnode
在bi下nn1上
hdfs namenode -format –clusterID itcast
hdfs zkfc -formatZK
拷贝元数据目录到standby(nn2)在dt下nn3上
hdfs namenode -format –clusterID itcast ###clusterID必须与bi的相同
hdfs zkfc -formatZK
拷贝元数据目录到standby(nn4)在bi下nn1上
sbin/start-dfs.sh在resoucemanager配置的主机上启动yarn
sbin/start-yarn.sh
<!-- core-site.xml --> <configuration> <property> <name>fs.defaultFS</name> <value>viewfs:///</value> </property> <property> <name>fs.viewfs.mounttable.default.link./bi</name> <value>hdfs://bi/</value> </property> <property> <name>fs.viewfs.mounttable.default.link./dt</name> <value>hdfs://dt/</value> </property> <!-- 指定hadoop临时目录 --> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/apps/hdpdata/</value> </property> <!-- 指定zookeeper地址 --> <property> <name>ha.zookeeper.quorum</name> <value>mini5:2181,mini6:2181,mini7:2181</value> </property> </configuration> <!-- hdfs-site.xml --> <configuration> <!--指定hdfs的nameservice为bi,需要和core-site.xml中的保持一致 --> <property> <name>dfs.nameservices</name> <value>bi,dt</value> </property> <!-- bi下面有两个NameNode,分别是nn1,nn2 --> <property> <name>dfs.ha.namenodes.bi</name> <value>nn1,nn2</value> </property> <property> <name>dfs.ha.namenodes.dt</name> <value>nn3,nn4</value> </property> <!-- bi的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.bi.nn1</name> <value>mini1:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.bi.nn1</name> <value>mini1:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.bi.nn2</name> <value>mini2:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.bi.nn2</name> <value>mini2:50070</value> </property> <!-- dt的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.dt.nn3</name> <value>mini3:9000</value> </property> <!-- nn1的http通信地址 --> <property> <name>dfs.namenode.http-address.dt.nn3</name> <value>mini3:50070</value> </property> <!-- nn2的RPC通信地址 --> <property> <name>dfs.namenode.rpc-address.dt.nn4</name> <value>mini4:9000</value> </property> <!-- nn2的http通信地址 --> <property> <name>dfs.namenode.http-address.dt.nn4</name> <value>mini4:50070</value> </property> <!-- 指定NameNode的edits元数据在JournalNode上的存放位置 --> <!--一下property项的配置,不能都配 --> <!-- 在bi名称空间的两个namenode中用如下配置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://mini5:8485;mini6:8485;mini7:8485/bi</value> </property> <!-- 在dt名称空间的两个namenode中,用如下配置--> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://mini5:8485;mini6:8485;mini7:8485/dt</value> </property> <!-- 指定JournalNode在本地磁盘存放数据的位置 --> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/apps/hdpdata/journaldata</value> </property> <!-- 开启NameNode失败自动切换 --> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <!-- 配置失败自动切换实现方式 --> <property> <name>dfs.client.failover.proxy.provider.bi</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.client.failover.proxy.provider.dt</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行--> <property> <name>dfs.ha.fencing.methods</name> <value> sshfence shell(/bin/true) </value> </property> <!-- 使用sshfence隔离机制时需要ssh免登陆 --> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!-- 配置sshfence隔离机制超时时间 --> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> </configuration> <!-- mapred-site.xml --> <configuration> <!-- 指定mr框架为yarn方式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration> <!-- yarn-site.xml --> <configuration> <!-- 开启RM高可用 --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 指定RM的cluster id --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>yrc</value> </property> <!-- 指定RM的名字 --> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!-- 分别指定RM的地址 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>mini3</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>mini4</value> </property> <!-- 指定zk集群地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>mini5:2181,mini6:2181,mini7:2181</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> </configuration>
7、HDFS集群滚动升级
hadoop2.4开始支持2.4支持滚动升级,在HA集群条件下。主要针对的是namenode 和datanode
滚动升级准备
#创建一个新的fsimage文件用于回滚
hdfs dfsadmin -rollingUpgrade prepare
#不断运行下面命令检查回滚fsimage是否创建完毕。
#如果显示Proceeding with Rolling Upgrade表示已经完成。
hdfs dfsadmin -rollingUpgrade query
升级active和standby,先升级standby,
#关闭NN2:
hdfs --daemon stop namenode
#升级启动NN2:
hdfs --daemon start namenode -rollingUpgrade started
#做一次failover切换,使得NN2成为Active节点,NN1变为Standby节点。
#关闭NN1:
hdfs --daemon stop namenode#升级启动NN1:
hdfs --daemon start namenode -rollingUpgrade started
升级dn
#选择整体中的一小部分DataNode节点进行升级(比如按照DataNode所在的不同机架来筛选)。
#关闭升级所选的DN 其中IPC_PORT由参数dfs.datanode.ipc.address指定,默认9867。
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade
#检查下线DataNode是否已经停止服务.如果还能得到节点信息,意味着此节点还未真正被关闭。
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
#启动DN节点。
hdfs --daemon start datanode
#对选中的所有DN节点执行以上步骤。
#重复上述步骤,直到升级群集中的所有DN节点。
完成升级
#完成滚动升级
hdfs dfsadmin -rollingUpgrade finalize
联邦HA集群升级
#1、在每个namespace下执行升级准备
hdfs dfsadmin -rollingUpgrade prepare
#2、升级每个namespace下的Active/Standby节点.
#2.1、关闭NN2:
hdfs --daemon stop namenode
#2.2、升级启动NN2:
hdfs --daemon start namenode -rollingUpgrade started
#2.3、做一次failover切换,使得NN2成为Active节点,NN1变为Standby节点。
#2.4、关闭NN1:
hdfs --daemon stop namenode
#2.5、升级启动NN1:
hdfs --daemon start namenode -rollingUpgrade started
#3、升级每个DataNode节点
#3.1、关闭升级所选的DN 其中IPC_PORT由参数dfs.datanode.ipc.address指定,默认9867。
hdfs dfsadmin -shutdownDatanode <DATANODE_HOST:IPC_PORT> upgrade
#3.2、检查下线DataNode是否已经停止服务.如果还能得到节点信息,意味着此节点还未真正被关闭。
hdfs dfsadmin -getDatanodeInfo <DATANODE_HOST:IPC_PORT>
#3.3、启动DN节点。
hdfs --daemon start datanode
#4、升级过程执行完毕,在每个namespace下执行finalize确认命令.
hdfs dfsadmin -rollingUpgrade finalize
非HA集群停机升级
#Step1:滚动升级准备
#Step2:升级NN和SNN
#1、关闭NN
hdfs --daemon stop namenode
#2、升级启动NN
hdfs --daemon start namenode -rollingUpgrade started
#3、停止SNN
hdfs --daemon stop secondarynamenode
#4、升级启动SNN
hdfs --daemon start secondarynamenode -rollingUpgrade started
#Step3:升级DN
#Step4:完成滚动升级
hdfs dfsadmin -rollingUpgrade finalize
降级和回滚,升级需要谨慎,降级回滚更需要谨慎。