注意:采用三台服务器即可,恢复到Yarn开始的服务器快照。
3)退出安全模式条件
dfs.namenode.safemode.min.datanodes:最小可用datanode数量,默认0
dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,默认0.999f
dfs.namenode.safemode.extension:稳定时间,默认30000毫秒,即30秒
4)基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
1、需求:
NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode
2、故障模拟
1)kill -9 NameNode进程
2)删除NameNode存储的数据
3、问题解决
1)拷贝SecondaryNameNode中数据到原NameNode存储数据据目录
2)重新启动NameNode
3)向集群上传一个文件
案例1:启动集群进入安全模式
1、重新启动集群
案例2:磁盘修复
需求:数据库损失,进入安全模式,如何处理
1、分别进入hadoop102、103、104的/opt/module/hadoop-3.1.3/data/dfs/data/current/BP~/subdir0目录,统一删除某2个块信息
说明:hadoop103/hadoop104重复执行以上命令
2、重新启动集群
说明:安全模式已经打开,块的数量没有达到要求
4、离开安全模式
7、观察http://hadoop102:9870/dfshealth.html#tab-overview,集群已经正常
案例3:
需求:模拟等待安全模式
1、查看当前模式
2、先进入安全模式
3、创建并执行下面的脚本
在opt/module/hadoop-3.1.3路径上,编辑一个脚本safemode.sh
4、再打开一个窗口,执行
5、再观察上一个窗口
2、具体配置如下:
在hdfs-site.xml文件中添加如下内容:
3、查看结果
4、向集群上传一个文件,再次观察两个文件夹里面的内容发现不一致(一个有数一个没数)
2、执行均衡计划
3、查看当前均衡任务的执行情况
4、取消均衡任务
1、需求
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点
2、环境准备
1)在hadoop100主机上再克隆一台hadoop105主机
2)修改IP地址和主机名称
3)拷贝hadoop102的/opt/module目录和/etc/profile.d/my_env.sh到hadoop105
4)删除hadoop105上Hadoop的历史数据,data和log数据
5)配置hadoop102和hadoop103到hadoop105的ssh无密登录
3、服役新节点具体步骤
1)直接启动DataNode,即可关联到集群
4、在白名单中增加新服役的服务器
1)在白名单whitelist中增加hadoop104、105,并重启集群
修改如下内容:
2)分发
3)刷新NameNode
5、在hadoop105上上传文件
思考:如果数据不均衡(hadoop105数据少,其它节点数据多),怎么处理?
2、开启数据均衡命令:
对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整。
3、停止数据均衡命令
注意:由于HDFS需要启动单独的Rebalance Server来执行Rebalance操作,所以经量不要在NameNode上执行start-balancer.sh,而是找一台比较空闲的机器。
白名单:表示在白名单的主机IP地址可用,用来存储数据。
企业中:配置白名单,可用尽量防止黑客恶意访问攻击。
配置白名单步骤如下:
1、在NameNode节点的/opt/~/hadoop目录下创建whitelist和blacklist文件
1)创建白名单
在whitelist中添加如下主机名称,加入集群正常工作的节点为102 103
2)创建黑名单
保持空的就可用
2、在hdfs-site.xml配置文件中增加dfs.hosts配置参数
3、分发配置文件whitelist、hdfs-site.xml
4、第一次添加白名单必须重启集群,不是第一次,只需要刷新NameNode节点即可
5、在web浏览器上查看DN,http://hadoop102:9870/dfshealth.html#tab-datanode
6、二次修改白名单,增加hadoop104
7、刷新NameNode
8、在web浏览器上查看DN,http://hadoop102:9870/dfshealth.html#tab-datanode
黑名单配置步骤如下:
1、编辑/opt/module/had~/hadoop目录下的blacklist文件
添加如下主机名称(要退役的节点)
注意:如果白名单中没有配置,需要在hdfs-site.xml配置文件中增加dfs.hosts配置参数
2、分发配置文件blacklist,hdfs-site.xml
3、第一次添加黑名单必须重启集群,不是第一次,只需要刷新NameNode节点即可
stopping datanode
stopping nodemanager
6、如果数据不均衡,可以用命令实现集群的再平衡
MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。
4.1.1 数据输入
1、合并小文件:在执行MR任务前将小文件进行合并,大量的小文件会产生大量的Map任务,增大Map任务装载次数,而任务的装载比较耗时,从而导致MR运行较慢。
2、采用CombineTextInputFormat来作为输入,解决输入端大量小文件场景。
4.1.2 Map阶段
1、减少溢出(Spill)次数:通过调整mapreduce.task.io.sort.mb及mapreduce.map.sort.spill.percent参数值,增大触发Spill的内存上限,减少Spill次数,从而减少IO。
2、减少合并(Merge)次数:通过调整mapreduce.task.io.sort.factor参数,增大Merge的文件数目,减少Merge的次数,从而缩短MR处理时间。
3、在Map之后,不影响业务逻辑前提下,先进行Combine处理,减少I/O。
4.1.3 Reduce阶段
1、合理设置Map和Reduce数:两个都不能设置太少,也不能设置太多。太少,会导致Task等待,延长处理时间;太多,会导致Map、Reduce任务间竞争资源,造成处理超时等错误。
2、设置Map、Reduce共存:
调整mapreduce.job.reduce.slowstart.completedmaps参数,使Map运行到一定程度后,Reduce也开始运行,减少Reduce的等待时间。
3、规避使用Reduce:因为Reduce在用于连接数据集的时候将会产生大量的网络消耗。
4、合理设置Reduce端的Buffer:默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reduce会从磁盘中获得所有的数据。也就是说,Buffer和Reduce是没有直接关联的,中间多次写磁盘-》读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得Buffer中的一部分数据直接输送到Reducec,从而减少IO开销:mapreduce.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保留指定比例的内存读Buffer中的数据直接拿给Reduce使用。这样一来,设置Buffer需要内存,读取数据需要内存,Reduce计算也要内存,所以要根据作业的运行情况进行调整。
4.1.4 I/O传输
1、采用数据压缩的方式,减少网络IO的时间。安装Snappy和LZO压缩编码器。
2、使用SequenceFile二进制文件。
4.1.5 数据倾斜问题
1、数据倾斜现象
数据频率倾斜-某一个区域的数据量要远远大于其它区域
数据大小倾斜-部分记录的大小远远大于平均值
2、减少数据倾斜的方法
方法1:抽样和范围分区
可以通过对原始数据进行抽样得到的结果集来预设分区边界值。
方法2:自定义分区
基于输出键的背景知识进行自定义分区。例如,如果Map输出键的单词来源于一本书。且其中某几个专业词汇较多。那么就可以自定义分区将这些专业词汇发送给固定的一部分Reduce实例。而将其它的都发送给剩余的Reduce实例。
方法3:Combiner
使用Combiner可以大量地减少数据倾斜。在可能地情况下,Combine的目的就是聚合并精简数据。
方法4:采用Map Join,尽量避免Reduce Join。
4.4.1 Hadoop小文件弊端
HDFS上每个文件都要在NameNode上创建对应的元数据,这个元数据的大小约为150byte,这样当小文件比较多的时候,就会产生很多的元数据文件,一方面会大量占用NameNode的内存空间,另一方面就是元数据文件过多,使得寻址索引速度变慢。
小文件过多,在进行MR计算时,会生成过多切片,需要启动过多的MapTask。每个MapTask处理的数据量小,导致MapTask的处理时间比启动时间还小,白白浪费资源。
4.4.2 Hadoop小文件解决方案
1、小文件优化的方向:
1)在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
2)在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
3)在MapReduce处理时,可采用CombineTextInputFormat提高效率。
4)开启uber模式,实现jvm重用。
2、Hadoop Archive
是一个高效的将小文件放入HDFS块中的文件存档工具,能够将小文件打包成一个HAR文件,从而达到减少NameNode的内存使用。
3、CombineTextInputFormat
CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片。
4、开启uber模式,实现JVM重用。
默认情况下,每个Task任务都需要启动一个JVM来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个JVM中,不必为每个Task都开启一个JVM。
开启uber模式,在mapred-site.xml中添加如下配置:
1、scp实现两个远程主机之间的文件复制
2、采用distcp命令实现两个Hadoop集群之间的递归数据复制
1、HDFS存储小文件弊端
每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效。因为大量的小文件会消耗NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据库的大小无关。例如,一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘空间,而不是128MB。
2、解决存储小文件办法之一
HDFS存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体来说,HDFS存档文件对内还是一个一个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存。
1、实例
1)需要启动YARN进程
2)归档文件
把/user/atguigu/input目录里面的所有文件归档成一个交input.har的归档文件,并把归档后文件存储到/user/atguigu/output路径下
3)查看归档
4)解归档文件
3、查看回收站
回收站目录在hdfs集群的路径:/user/atguigu/.Trash/…
4、通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站
5、同故宫网页上直接删除的文件也不会走回收站。
6、只有在命令行利用hadoop fs -rm命令删除的文件才会走回收站
7、恢复回收站数据