HDFS-多目录
1、NameNode多目录配置
·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>
·如果已经存在NameNode,需要删除之前的data、logs目录;再格式化NameNode
hdfs namenode -format
2、DataNode多目录配置
·hdfs-site.xml
·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>
·存在多个data目录时,按照顺序进行存储,第一个文件存第一个data,第二个文件存第二个data`
3、磁盘间数据均衡
·当新加一块硬盘时,可以执行磁盘数据均衡(hadoop3.x新特性)
·生成均衡计划
dfs diskbalancer -plan 主机名
·执行均衡计划
hdfs diskbalancer -execute 主机名.plan.json
·查看当前均衡任务的执行情况
hdfs disbalancer -query 主机名
·取消均衡任务
hdfs disbalancer -cancel 主机名.plan.json
HDFS-集群扩容以及缩容
·添加白名单&黑名单
·在NameNode所在节点的hadoop/ect/hadoop下创建whitelist和blacklist目录
·配置hdfs-site.xml
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelist</value>
</property>
<property>
<name>dfs.hosts.exclude</name>
<value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist</value>
</property>
·注意
第一次添加白名单和黑名单需要重启集群,不是第一次只需要刷新NameNode节点
·hdfs dfsadmin -refreshNodes
·服役新的服务器
·单起新服役的服务器DataNode和NodeManager
·hdfs --daemon start|stop datanode
·yarn --daemon start|stop nodemanager
·退役服务器
·添加指定服务器到黑名单
·第一次添加需要重启集群,不是则舒心NameNode节点
hdfs dfsadmin -refreshNodes
·等待退役完成,关闭服务
·服务器数据均衡
·开始|关闭数据均衡
·sbin/start-balancer.sh -threshold 10
10 表示各个节点磁盘空间利用率不超过10%
·sbin/stop-balancer.sh
·开启数据均衡需要占用内存,最好在一台空闲的机器上进行
HDFS故障排查
NameNode数据丢失
·NameNode存储数据丢失 /opt/module/hadoop-3.1.3/data/dfs/name下的数据
·拷贝Secondery NameNode中的数据到 /opt/module/hadoop-3.1.3/data/dfs/name
·使用-importCheckpoint选项启动NameNode守护进程,从而将Secondery NameNode中数据拷贝到NameNode目录中
集群安全模式&磁盘修复
·安全模式开启条件
·集群刚开启时 fsimage和edits会进行合并 30s后自动退出
·datanode进行上报数据信息 30s后自动退出
·datanode中数据丢失,只允许丢失一个块,小于99.99999%
·如果安全模式开启,将对应的NameNode数据删除就可以接触安全模式
·bin/hdfs dfsadmin -safemode get (功能描述:查看安全模式状态)
·bin/hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态)
·bin/hdfs dfsadmin -safemode leave (功能描述:手动离开离开安全模式状态)
·bin/hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态关闭后执行其他操作)
先退出再进入,在hdfs的web端会显示丢失的数据信息
Hadoop企业优化
·MapReduce跑的慢的原因
·硬件问题
·I/O操作优化
·数据倾斜
·Map和Reduce数设置不合理
·Map运行时间太长,导致Reduce等待过久
·小文件太多
·大量的不可切片的超大压缩文件
·Spill次数过多
·Merge次数过多等
·Map数据的输入
·CombineTextInputFormat作为输入,处理小文件
·压缩<保证文件可以切片 --Bzip2 LZO>
·通过一个MapReduce将数据进行合并;Map不做任何处理,Reduce进行合并
·Map阶段
·减少溢写(Spill)的次数
·调整mapreduce.task.io.sort.mb<环形缓冲区大小,默认为100MB;一般进行1:10进行 maptask(默认一个1G):环形缓冲区 = 1:10>以及mapreduce.map.sort.spill.parcent<溢写百分比,默认为80%;一般留置30mb>的参数值--
·减少合并(Merge次数)
·调整mapreduce.task.io.sort.factor(默认为10,跟硬件资源相关,合并溢写文件个数)
·在Map之后,不影响业务逻辑前提下,进行Combine处理
·Reduce阶段
·合理设置MapTask和ReduceTask数
·设置MapTask和ReduceTask共存:共存指的时Map运行一定程度后,可以让Reduce提前申请资源,并不是提前开始任务
·调整mapreduce.job.reduce.slowstart.completedmaps参数(默认为0.05)
·规避使用ReduceTask
·合理设置Reduce端的Buffer
默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reduce会从磁盘中获取所有的数据。也就是说,Buffer和Reduce是没有直接关联的,中间多次写磁盘->读磁盘的过程,既然有这个弊端,那么就可以通过参数来配置,使得Buffer中的一部分数据可以直接输送到Reduce,从而减少io开销:mapreduce.reduce.input.buffer.percent,默认为0.0。当值大于0的时候,会保存指定比例的内存读Buffer中的数据直接拿给Reduce使用。这样一来,设置Buffer需要内存;读取数据需要内存,Reduce计算也要内存,所以要根据作业的情况进行调整.
·I/O的传输:MapTask的输出
·采用数据压缩的方式(Snappy和LZO)
·使用SequenceFile二进制文件(较难)
·数据倾斜
·数据倾斜现象
·数据频率倾斜--某个区域的数据量要远远大于其他区域
·数据大小倾斜--部分记录的大小远远大于平均值
·减少数据倾斜的方法
·抽样和范围分区
通过对原始数据进行抽样得到的结果集来预设分区边界值
·自定义分区
·Combiner
·采用Map Join,避免采用Reduce Join
常用的调优参数
·以下参数是在用户自己的MR应用程序中配置就可以生效--mapred-site.xml
·mapreduce.map.memory.mb
一个MapTask可以使用的资源上限(单位:MB),默认为1024.如果MapTask实际使用的资源量超过该值,则会被强制杀死
·mapreduce.reduce.memory.mb
一个ReduceTask可使用的资源上限(单位:MB),默认为1024.如果ReduceTask实际使用的资源量超过该值,则会被强制杀死
·mapreduce.map.cpu.vcores
每个MapTask可使用最多cup core数目,默认为1
·mapreduce.reduce.cpu.vcoures
每个ReduceTask可使用的最多cup core数目,默认为1
·mapreduce.reduce.shuffle.parallelcopies
每个Reduce去Map中取数据的并行数,默认为5
·mapreduce.reduce.shuffle.merge.percent
Buffer中的数据达到多少比例开始写去磁盘.默认为0.66;也就是达到百分之66开始溢写
·mapreduce.reduce.shuffle.input.buffer.percent
Buffer大小占Reduce可用内存的比例。默认值0.7;也就是MapTask内存中百分之70是用来存储数据的
·mapreduce.reduce.input.buffer.percent
指定多少比例的内存用来存放Buffer中的数据,默认值为0.0;一般情况下雨开始溢写比例相同
·应该在YARN启动之前就配置子服务器的配置文件中才能生效yarn-site.xml
·yarn.scheduler.minimum-allocation-mb
给应用程序Container分配的最小内存,默认值为:1024
·yarn.scheduler.manimum-allocation-mb
给应用程序Container分配的最大内存,默认值:8192
·yarn-scheduler.minimum-allocation-vcores
每个Container申请的最小cup核数,默认值为1
·yarn-scheduler.maximum-allocation-vcores
每个Container申请的最大CUP核数,默认值为32
·yarn-nodemanager.resource.memory-mb
给每个Container分配的最大物理内存,默认值为8192
·Shuffle性能优化的关键参数,应在YARN启动之前就配置好mapred-site.xml
·mapreduce.task.io.sort.mb
Shuffle的环形缓冲区大小,默认为100MB
·mapreduce.map.sort.spill.percent
环形缓冲区溢写的阈值,默认我80%
·容错相关参数(MapReduce性能优化)
·mapreduce.map.maxattempts
每个Map Task最大重试次数,一旦重试次数超过该值,则认为Map Task运行失败,默认值:4
·mapreduce.reduce.maxattempts
每个Reduce Task最大重试次数,一旦重试次数超过该值,则认为Map Task运行失败,默认值:4
·mapreduce.task.timeout
Task超时时间,经常需要设置的一个参数,该参数表达的意思为:如果一个Task在一定时间内没有任何进入,即不会读取新的数据,也没有输出数据,则认为该Task处于Block状态,可能是卡住了,也许永远会卡住,为了防止因为用户程序永远Block住不退出,则强制设置了一个该超时时间(单位毫秒),默认是600000(10分钟)。如果你的程序对每条输入数据的处理时间过长(比如会访问数据库,通过网络拉取数据等),建议将该参数调大,该参数过小常出现的错误提示是:“AttemptID:attempt_14267829456721_123456_m_000224_0 Timed out after 300 secsContainer killed by the ApplicationMaster.”
Hadoop小文件优化方法
·弊端
每个小文件在NameNode中占150字节;每个小文件占一个切片,需要一个MapTask
·小文件优化方向
·在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。
·在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。
·在MapReduce处理时,可采用CombineTextInputFormat提高效率。
·开启uber模式,实现jvm重用
·Hadoop Aechive
是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件(类似于压缩),从而达到减少NameNode的内存使用
·SequenceFile
SequenceFile是由一系列的二进制k/v组成,如果为key为文件名,value为文件内容,可将大批小文件合并成一个大文件
·CombineTextInputFormat
·开启uber模式,实现jvm重用,默认情况下,每个Task任务都需要启动一个jvm来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个Jvm中,不必为每个Task都开启一个Jvm.
·可以理解为,将多个MapTask放进一个Container里面,如果太多可能出现装不下,发生内存泄漏
·最好关掉yarn虚拟内存,一个Container中占用1024MB的资源,同时申请2.1倍的虚拟资源
·开启uber模式,在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>
Hadoop新特性
hadoop2.x
·集群建数据拷贝
·scp实现集群间两个远程主机之间的文件复制
scp -r 文件地址 [主机用户@]主机ip:存放地址
如果在两个远程主机之间ssh没有配置的情况下可以使用该方式。
·distcp命令实现两个Hadoop集群之间的递归数据复制(广泛应用于版本的升级和服务器迭代)
bin/hadoop distcp hdfs://hadoop101:8020/文件地址 hdfs://hadoop102:8020/文件地址
·小文件存档
·HDFS存档文件或HAR文件<对内还是一个一个单独文件,对NameNode是一个整体>
·需要启动YARN进程,通过YARN计算
·归档文件
hadoop archive -archiveName 重命名.har -p 输入目录 输出目录
·查看归档
hadoop fs -ls har:目录
·解归档文件
hadoop fs -cp har://数据存在目录 输出目录
·回收站
通过程序删除文件不会经过回收站,需要调用moveToTrash()才能;网页直接删除也不会走回收站;只有命令行hadoop fs -rm 才会走
·core-site.xml
·fs.trash.interval=0表示禁用,其他值表示文件存活时间
<property>
<name>fs.trash.interval</name>
<value>1</value>
</property>
·fs.trash.checkpoint.interval=0,检查回收站的间隔时间,默认为0,表示与存活时间相等
·恢复数据
hadoop fs -mv /user/gq/.Trash/Current/user/gq/input 其他目录
hadoop3.x
·多NN的HA架构
·能够实现多个NN的存在
·纠删码
·查看集群支持的纠删码策略:hdfs ec -listPolicies