Hadoop优化以及新特性

文章目录

          • HDFS-多目录
          • HDFS-集群扩容以及缩容
          • HDFS故障排查
            • NameNode数据丢失
            • 集群安全模式&磁盘修复
          • Hadoop企业优化
            • 常用的调优参数
            • Hadoop小文件优化方法
          • Hadoop新特性
            • hadoop2.x
            • hadoop3.x

HDFS-多目录
1、NameNode多目录配置
 ·hdfs-site.xml
	<property>
     <name>dfs.namenode.name.dirname>
     <value>file://${hadoop.tmp.dir}/dfs/name1,file://${hadoop.tmp.dir}/dfs/name2value>
	property>
·如果已经存在NameNode,需要删除之前的data、logs目录;再格式化NameNode
	hdfs namenode -format
2、DataNode多目录配置
 ·hdfs-site.xml
 	·hdfs-site.xml
	<property>
     <name>dfs.datanode.data.dirname>
     <value>file://${hadoop.tmp.dir}/dfs/data1,file://${hadoop.tmp.dir}/dfs/data2value>
	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.hostsname>
	    	 <value>/opt/module/hadoop-3.1.3/etc/hadoop/whitelistvalue>
		property>
	
		
		<property>
	     	<name>dfs.hosts.excludename>
	    	 <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklistvalue>
		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.enablename>
			  <value>truevalue>
			property>
			
			 
			<property>
			  <name>mapreduce.job.ubertask.maxmapsname>
			  <value>9value>
			property>
			
			<property>
			  <name>mapreduce.job.ubertask.maxreducesname>
			  <value>1value>
			property>
			
			<property>
			  <name>mapreduce.job.ubertask.maxbytesname>
			  <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.intervalname>
			<value>1value>
		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

你可能感兴趣的:(Hadoop,hadoop)