一、HDFS-核心参数
1.1NameNode内存生产配置
1)NameNode内存计算
每个文件块大概占用150byte,一台服务器128G内存为例,能存多少文件快?
128*1024*1024*1024、150byte≈9.1亿
G kb mb byte
2)Hadoop2.x系列配置NameNode
namenode内存默认2000m,如果服务器内存4G,namenode内存可以配置3G 在hadoop.env.sh中配置
HADOOP_NAMENODE_OPTS=-Xmx3072m
3)Hadoop3.x 配置Namenode
①hadoop-env.sh中描述Hadoop的内存是动态分配的
②查看NameNode占用内存 jmap -heap 7140
③查看DataNode占用内存jmap -heap 7259
NameNode:namenode最小值1G,每增加1000000个block,增加1G内存
DataNode:datanode最小值4G block数或者副本数升高,都应该调大datanode的值
一个datanode上的副本总数低于4000000调为4G 超过4000000每增加1000000 增加1G
具体修改hadoop-env.sh
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
1.2NameNode心跳并发配置
1)hdfs-site.xml
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
1.3开启回收站配置
1)回收站工作机制
检查回收站的间隔时间: fs.trash.checkpoint.interval=10
设置文件存货时间:fs.trash.interval=60
2)开启回收站功能参数说明
①默认值fs.trash.interval=0,0表示禁用回收站:其他值表示设置文件的存活时间
②默认值fs.trash.checkpoint.interval=0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等
③要求fs.trash.checkpoint.interval<=fs.trash.interval
3)启用回收站
修改core-site.xml 配置垃圾回收时间为1分钟
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
4)查看回收站
回收站目录在HDFS集群中的路径:/usr/cyf/.Trash/...
5)通过网页上直接删除的文件不会进入回收站
6)通过程序删除的文件不会经过回收站,需调用moveToTrash()才进入回收站
Trash trash = New Trash(conf)
trash.moveToTrash(path)
7)只有在命令行利用hadoop fs -rm 命令删除的文件才会走回收站
hadoop fs -rm -r /
二、HDFS-集群压测
HDFS的读写性能主要受网络和磁盘影响比较大,为了方便测试,将hadoop102、hadoop103、hadoop104虚拟机网络设置为100mpbs=12M/s
2.1测试HDFS写性能
0)写测试底层原理
1)测试内容:向HDFS集群写10个128M的文件
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-3.1.1-tests.jar TestDFSIO -write -nrFiles 10 -fileSize 128MB
3)测试结果分析
(1)由于副本1就在本地 所以该副本不参与测试
一共参与测试的文件: 10个文件*2个副本=20个
压测后的速度: 3.53
实测速度:3.53m/s * 20个文件≈71.6m/s
三台服务器的带宽:12.5+12.5+12.5≈30m/s
所有网络资源都已经用满
如果实测速度远远小于网络,并且实测速度不能满足工作需求,可以考虑采用固态硬盘或者增加磁盘个数
(2)如果客户端不在集群节点,那么三个副本都将参与计算
2.2测试HDFS读性能
1)测试内容:读取HDFS集群10个128m的文件
2)删除测试生成数据
3)测试结果分析:为什么读取文件速度大于网络带宽?
由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有网络影响
三、HDFS多目录
3.1NameNode多目录配置
1)NameNode的本地目录可以配置成多个,且每个目录存放内容相同,增加了可靠性
2)具体配置
(1)在hdfs-site.xml文件中添加如下内容
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2</value>
</property>
3.2DataNode多目录配置
1)DataNode可以配置成多个目录,每个目录存储的数据不一样(数据不是副本)
2)具体配置如下:
在hdfs-site.xml文件中添加如下内容
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2</value>
</property>
3.3集群数据均衡之磁盘间数据均衡
生产环境 由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令(Hadoop3.x新特性)
(1)生成均衡计划(一块硬盘不会生成计划)
hdfs diskbalancer -plan hadoop103
(2)执行均衡计划
hdfs diskbalancer -excute hadoop103.plan.json
(3)查看当前均衡任务的执行情况
hdfs diskbalancer -query hadoop103
(4)取消均衡任务
hdfs diskbalancer -cencel hadoop103.plan.json
四、HDFS----集群扩容及缩容
4.1添加白名单
白名单:表示在白名单的主机IP地址可以用来存储数据
企业中:配置白名单,可以尽量防止黑客恶意访问攻击
配置白名单步骤如下:
1)在NameNode节点的/opt/module/hadoop-3.1.1/etc/hadoop目录下分别创建whitelist和blacklist文件
(1)创建白名单
vim whitelist
(2)创建黑名单
touch blacklist
2)在hdfs-site.xml配置文件中增加dfs.hosts配置参数
<!--白名单-->
<proeprty>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.1/etc/hadoop/whitelist</value>
</property>
<!--黑名单-->
<proeprty>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.1/etc/hadoop/blacklist</value>
</property>
4.2服役新数据节点
(1)在hadoop100主机上在克隆一台105主机
(2)修改IP地址和主机名称
修改IP:vim /etc/sysconfig/network-scripts/ifcfg-ens33
主机名称: vim /etc/hostname
(3)将102的opt module下的分发到105
scp -r module/* cyf@hadoop105:/opt/module
(4)配置环境变量:将102的分发到105
sudo scp /etc/profile.d/my_env.sh root@hadoop105:/etc/profile.d/
source profile.d
(5)配置102-》105,103-》105的ssh
ssh-copy-id hadoop105
103:ssh-copy-id hadoop105
(6)清空105的data logs
rm -rf data/ logs/
(7)单点启动105
105:hdfs --daemon start datanode
105:yarn --daemon start nodemanager
(8)配置白名单
分发
(9)刷新节点
hdfs dfsadmin -refreshNodes
4.3集群数据均衡之节点间数据均衡
1)经验:如果经常在102和104上提交任务,且副本数为2,由于数据本地性原则,就会导致102和104数据过多,则103的存储数据量小
另一种情况:就是新服役的服务器的数据量比较少,需要执行集群均衡命令
2)开启数据均衡命令
sbin/start-balancer.sh -threshold 10
//对于参数10,代表的是集群中各个节点的磁盘空间利用率相差不超过10%,可根据实际情况进行调整
3)停止数据均衡命令
sbin/stop-balancer.sh
4.4黑名单退役旧节点
黑名单:表示在黑名单的主机IP地址不可用,用来存储数据
企业中:配置黑名单用来退役服务器
1)编辑opt/module/hadoop3.1.1/etc/hadoop 目录下的blacklist
添加如下主机名称:
hadoop105
2)分发配置文件
3第一次添加黑名单必须重启集群 不是第一次 只需刷新namenode节点即可
4)检查web端
五、HDFS存储优化
5.1纠删码原理(可节省很大一部分存储空间,但是对CPU占用大)
HDFS默认情况下,一个文件有3个副本。这样提高了数据的可靠性,但也带来了2倍的冗余开销。Hadoop3.x引入了纠删码,采用计算的方式,可以节省大约50%的存储空间
一个文件300m(拆分成3个数据单元+2个校验单元)存储上只比自己大小多了两个校验单元
1)纠删码操作相关命令
hdfs ec查看纠删码命令
-listPolicies 列出所有策略
-addPolicies -policyFile <file> 添加策略
-getPolicy -path <path> 获取某一路径的策略
-removePolicy -path <path> 删除策略
-setPolicy -path <path> [-policy <policy>] [-replicate]
-unsetPolicy -path <path>
-listCodecs
-enablePolicy -policy <policy> 开启某一纠删策略
-disablePolicy -policy <policy> 关闭
-help <command-name>
RS-10-4-1024k:使用RS编码,每10个数据单元生成4个校验单元,共14个单元,也就是说:这14个单元中,只要有任意的10个单元存在(不管是数据单元还是校验单元,只要总数=10)就可以得到原始数据
RS-6-3-1024k
RS-LEGACY-6-3-1024k:策略和上面的RS-6-3-1024k一样,只是编码的算法用的是rs-legacy
XOR-2-1-1024k:使用XOR编码(速度比RS编码快),每2个数据单元,生成1个校验单元,共3个单元,也就是说:这三个单元中,只要有任意的2个单元存在(不管是数据单元还是校验单元,只要总数是2)就可以得到原始数据。每个单元的大小是1024k
5.1.2纠删码案例实操
纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。默认只开启对RS6-3-1024k策略的支持,如要使用别的策略需要提前启用
1)需求:
将/input目录设置为RS-6-3-1024k策略
2)具体步骤:
①开启RS3-2-1024K策略的支持
hdfs ec -enablePolicy -policy RS-3-2-1024k
②设置纠删策略路径
hdfs ec -setPolicy -path /input -policy RS-3-2-1024k
5.2异构存储(冷热数据分离)
异构存储主要解决奴同的数据,存储在不同类型的硬盘中,达到最佳性能的问题
1)关于存储类型
RAM_DISK:(内存镜像文件)
SSD:(SSD固态硬盘)
DISK:(普通磁盘 在HDFS中,如果没有主动声明数据目录存储类型默认都是DISK)
ARCHIVE:(没有特指那种存储戒指,主要指的是计算能力比较弱而存储密度比较高的存储介质,用来解决数据量的容量扩增的问题,一般用于归档)
2)关于存储策略(说明:从LAZY_Persist到Cold,分别代表了设备的访问速度从快到慢)
5.2.1异构存储shell操作
1)查看当前有那些存储策略
hdfs storagepolicies -listPolicies
2)为指定路径(数据存储目录)设置指定的存储策略
hsfs storagepolicies -setStoragePolicy -path xxx -policy xxx
3)获取指定路径的存储策略
hdfs storagepolicies -getStoragePolicy -path xxx
4)取消存储策略 执行命令之后该目录或文件,以其上级的目录为准,如果是根目录,那么就是HOT
hdfs storagepolicies -unsetStoragePolicy -path xxx
5)查看文件块的分布
bin/hdfs fsck xxx -files -blocks -locations
6)查看集群节点
hadoop dfsadmin -report
5.2.2测试化境准备
1)环境描述
服务器:5台
集群配置:副本数为2,创建好带有存储类型的目录(提前创建)
集群规划:
节点 存储类型分配
hadoop102 RAM_DISK,SSD
hadoop103 SSD,DISK
hadoop104 DISK,RAM_DISK
hadoop105 ARCHIVE
hadoop106 ARCHIVE
2)配置文件信息
1)为hadoop102节点hdfs-site.xml添加:(为每个副本都配置,不可分发)
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.storage.policy.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>[SSD]file:///opt/module/hadoop-3.1.1/hdfsdata/ssd,[RAM_DISK]file:///opt/module/hadoop-3.1.1/hdfsdata/ram_disk</value>
</property>
2)关闭集群 删除所有data logs
3)格式化 hdfs namenode -format
4)启动集群
5.2.3HOT存储策略
1)最开始未设置存储策略 应获取目录的存储策略
hdfs storagepolicies -getStoragePolicy -path /hdfsdata
2)查看上传文件块分布
hdfs fsck /hdfsdata -files -blocks -location
未设置存储策略,所有文件块都存储在DISK下。所以 默认存储策略为HOT
5.2.4WARN存储策略测试
1)数据降温
hdfs storagepolicies -getStoragePolicy -path /hdfsdata -policy WARN
2)再查看文件块分布,我们可以看到文件块依然放在远处
hdfs fsck /hdfsdata -files -blocks -locations
3)需要让HDFS按照存储策略自行移动文件块
hdfs mover /hdfsdata
4)再次查看文件块分布
hdfs fsck /hdfsdata -files -blocks -locations
5.2.5COLD策略
1)为数据降温
hdfs storagepolicies -getStoragePolicy -path /hdfsdata -policy COLD
注:当我们将目录设置为COLD并且我们未配置ARCHIVE存储目录的情况下,不可以向该目录直接上传文件,会报出异常
2)手动转移
hdfs mover /hdfsdata
3)检查文件块分布
hdfs fsck /hdfsdata -files -blocks -locations
5.2.6ALL_SSD策略
5.2.7One_SSD策略
5.2.8Lazy_Persist策略
六、HDFS----故障排除
6.1namenode故障处理
1)一般杀死可用
恢复
2)若将namenode的name文件夹下文件全部删除且kill掉namenode进程
发现 hdfs --daemon start namenode 无法重启namenode
进入logs查看namenode的日志
tail -n 100 hadoop-cyf-namenode-hadoop102.log
去hadoop104查看namesecondary
(namenode namesecondary区别 前者为动态)
将namescondary拷贝到102的name中
启动namenode
hdfs --daemon namenode
6.2集群的安全模式&磁盘修复
1)安全模式:文件系统只接受读数据请求,而不接受删除修改等变更请求
2)进入安全模式场景:
NameNode在加载镜像文件和编辑日志期间处于安全模式
NameNode在接受DataNode注册时,处于安全模式
3)退出安全模式:
dfs.namenode.safemode.min.datanodes:最小可用datanode数量,默认0
dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,默认0.999f(只允许丢一个块)
dfs .namenode.safemode.extension:稳定时间,默认值30000毫秒,即30秒
4)基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式
①bin/hdfs dfsadmin -safemode get 查看安全模式状态
②bin/hdfs dfsadmin -safemode enter 进入安全模式
③bin/hdfs dfsadmin -safemode leave 离开安全模式状态
④bin/hdfs dfsadmin -safemode wait 等待安全模式状态
5)案例2:磁盘修复
需求:数据块损坏,进入安全模式,如何处理?
(1)分别进入hadoop102、hadoop103、hadoop104的/opt/module/hadoop-3.1.1/data/dfs/data/current/BP-1111978388-192.168.10.102-1681307461693/current/finalized/subdir0/subdir0目 统一删除某两个块信息
(2)重新启动集群
(3)退出安全模式
可以继续集群操作
(4)如果是不重要的数据可以删除
进入web端tmp找到文件进行删除就可以,如果很重要则需要联系厂家找人找回数据
(5)重启集群
7)案例3:
需求:模拟等待安全模式
(1)查看当前模式:
hdfs dfsadmin -safemode get
(2)先进入安全模式
bin/hdfs dfsadmin -safemode enter
(3)创建并执行以下脚本
(4)再打开一个新窗口执行
(5)发现集群上新创建了一个README。txt文件
***6.3慢磁盘监控
“慢磁盘”指的是写入数据非常慢的一类磁盘。其实慢性磁盘并不少见,当机器运行时间长了,上面跑的任务多,磁盘的读写性能自然会退化,严重时就会出现
写入数据延时的问题。
如何发现满磁盘???
正常再HDFS上创建一个目录,只需要不到1s的时间。如果发现创建目录超过1分钟及以上,而且这个现象并不是每次都有。只是偶尔慢了一下,就很有可能存在
慢磁盘。可以通过如下方法找出哪块是慢磁盘!
1)通过心跳未联系时(慢磁盘会影响到DataNode与NameNode之间的心跳。正常情况心跳时时间间隔是3s,超过3s说明异常)
2)fio命令,测试磁盘的读写性能
(1)顺序读测试
安装:sudo yum install -y fio
结果显示:磁盘的总体顺序读速度为397MiB/s
(2)顺序写测试
结果显示:磁盘的总体顺序写速度为398MiB/s
(3)随机写测试
结果显示:磁盘的总体顺序写速度为152MiB/s
(4)混合随机读写
6.4小文件归档
1)HDFS存储小文件弊端
每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此HDFS存储小文件会非常低效。因为大量的小文件会耗尽NameNode中的大部分内存。但注意,存储小文件所需要的磁盘容量和数据块的大小无关。例如:一个1MB的文件设置为128MB的块存储,实际使用的是1MB的磁盘 空间,而不是128MB
2)解决存储小文件办法之一:
HDFS存档文件或HAR文件是一个更搞笑的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。具体来说,HDFS存档文件对内还是一个一个独立文件,对NameNode而言却是一个整体,减少了NameNode的内存
3)案例实操
(1)启动yarn
start-yarn.sh
(2)归档
把/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/output路径下
hadoop archive -archiveName input.har -p /input /output
(3)查看归档
hadoop fs -ls /output/input.har
hadoop fs -ls har:///output/input.har
(4)解归档文件
hadoop fs -cp har:///output/input.har/*
七、HDFS----集群迁移
7.1Apache和Apache集群间数据拷贝
1)scp实现两个远程主机之间的文件复制
scp -r hello.txt root@hadoop103:/usr/cyf/hello.txt //推 push
scp -r root@hadoop103:/usr/cyf/hello.txt hello.txt //拉 pull
scp -r root@hadoop103:/usr/cyf/hello.txt root@hadoop103:/usr/cyf //通过本地主机中转实现两个远程主机的文件复制,如果在两个远程主机之间ssh没有配置的情况下可以使用该方式
2)采用distcp命令实现两个Hadoop集群之间的递归数据复制
bin/hadoop distcp
hdfs://hadoop102:8020/user/cyf/hello.txt
hdfs://hadoop105:8020/user/cyf/hello.txt
7.2Apache和CDH集群间数据拷贝
八、MapReduce生产经验
8.1MapReduce跑得慢的原因
MapReduce程序效率瓶颈在于两点:
1)计算机性能:
CPU、内存、磁盘、网络
2)I/O操作优化
①数据倾斜
②Map运行时间太长,导致Reduce等待过久
③小文件过多
8.2MapReduce常用调优参数
MapReduce优化(上)
插图
MapReduce优化(下)
插图
8.3MapReduce数据倾斜问题
1)数据倾斜现象
数据频率倾斜---某一个区域的数据量要远远大于其他区域
数据大小倾斜---部分记录的大小远远大于平均值
2)减少数据倾斜的方法
①首先检查是否空值过多造成的数据倾斜
生产环境,可以直接过滤掉空值,如果想保留空值就自定义分区,将空值加随机数打散 再二次聚合
②能再map阶段提前处理,最好现在map阶段处理。如:Combiner、MapJoin
③设置多个reduce个数
九、Hadoop-Yarn生产经验
9.1常用的调优参数
1)调优参数列表
①Resourcemanager相关
②Nodemanager相关
2)Container容器相关
9.2容量调度器 详见Yarn
9.3公平调度器 详见Yarn
十、Hadoop综合调优
10.1小文件优化方法
10.1.1Hadoop小文件弊端
一方面会占用大量NameNode的内存空间,零一方面元数据过多,使得寻址索引速度变慢
小文件过多,在进行MR计算时会产生过多的切片,需要启动过的MapTask 买个MapTask处理的数据量小,导致MapTask的处理时间比启动时间还小 浪费资源
10.1.2解决方案
1)再数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS(数据源头)
2)HadoopArchive(存储方向)
是一个搞笑的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件 从而达到减少NameNode的内存使用
3)CombinerTextInputFormat(计算方向)
用于将多个小文件再切片过程中生成一个单独的切片或者少量的切片
4)开启user模式 实现JVM重用(计算方向)
每个Task任务都需要启动一个JVM运行,如果Task任务计算的数据量很小 可以让同一个job的多个Task运行在一个JVM中 不必为每个Task都开启一个JVM
①未开启user模式 在/input 路径上上传多个小文件并i行zwordcount程序
[cyf@hadoop102 hadoop-3.1.1]$ hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar wordcount /input /output1
②开启user模式,在mapred-site.xml中添加如下配置
<property>
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
<property>
<name>mapreduce.job.ubertask.maxmaps</name>
<value>9</value>
</property>
<property>
<name>mapreduce.job.ubertask.maxreduces</name>
<value>1</value>
</property>
<property>
<name>mapreduce.job.ubertask.maxbytes</name>
<value></value>
</property>
10.2测试MapReduce计算性能
使用Sort程序评测MapReduce
一个虚拟机不超过150G磁盘尽量不要执行这段代码
1)使用RandomWriter来产生随机数 每个节点运行10个Map任务,每个Map产生大约1G大小的二进制随机数
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar randomwriter random-data
2)执行Sort程序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar sort random-data sorted-data
3)验证数据是否真正排好序
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.1.jar testmapredsort -sortInput random-data -sortOutput sorted-data
10.3企业开发场景案例
10.3.1需求
1)需求:从1G数据中,统计每个单词出现次数 服务器3台 每台配置4G内存 4核cpu 4线程
2)分析
1g/128m=8个MapTask 1个ReduceTASK 1个mrAppMaster
平均每个节点运行3个任务(4 3 3)
10.3.2hdfs 参数调优
1)修改hadoop-env.sh
export HDFS_NAMENODE_OPTS="-Dhadoop.security.logger=INFO,RFAS -Xmx1024m"
export HDFS_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS -Xmx1024m"
2)修改hdfs-site.xml
<!-- NameNode有一个工作线程池,默认值是10 -->
<property>
<name>dfs.namenode.handler.count</name>
<value>21</value>
</property>
3)修改core-site.xml
<!-- 配置垃圾回收时间为60分钟 -->
<property>
<name>fs.trash.interval</name>
<value>60</value>
</property>
4)分发配置
插图
10.3.3MapReduce参数调优
1)修改mapred-site.xml
插图5
2)分发配置
10.3.4Yarn参数调优
1)修改yarn-site.xml
插图
2)分发配置
10.3.5执行程序