700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 打怪升级之小白的大数据之旅(五十九)<Hadoop优化方案>

打怪升级之小白的大数据之旅(五十九)<Hadoop优化方案>

时间:2022-08-06 18:28:05

相关推荐

打怪升级之小白的大数据之旅(五十九)<Hadoop优化方案>

打怪升级之小白的大数据之旅(五十八)

Hadoop优化方案与扩展知识点

上次回顾

上一章,我们对Hadoop的扩展知识HA进行了学习,本章是我们在使用Hadoop过程中的一些优化方案和其他几个需要了解的扩展知识,因为压缩和HA更加重要一些,所以我单独抽出来了

Hadoop优化方案

为什么要优化

我们在为Hadoop优化之前,首先要了解,我们要优化的地方在哪里,我们的程序哪一个部分可以进行优化,如果不了解、我们可能会适得其反通常情况下,Hadoop的优化大部分都是在MR程序中,因为MR程序是我们整个Hadoop的核心工作

MapReduce可能导致运行缓慢的原因

计算机性能 这个问题的解决很简单:一个字,钱,当然了,这是在我们可承受的情况下,一般我们程序猿们几乎不需要关注这个问题 I/O操作 数据倾斜Map和Reduce数量设置不合理Map运行时间过长导致Reduce等待过久小文件过多大量的不可分块的超大文件spill次数过多Merge次数过多

MapReduce优化方法

MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数

数据输入

数据输入造成MR运行缓慢的原因通常情况下都是因为小文件比较多,因为每个小文件,会产生一个Map任务,任务的装载比较耗时我们可以采用ComBineTextInputFormat作为输入来解决输入端大量小文件的问题

Map阶段

Map阶段有两个造成运行缓慢的原因,分别是溢写Spill阶段和Merge阶段

溢写阶段

减少溢写次数:Map阶段后,会将数据存储到环形缓冲区,然后对其进行分区排序、溢写,溢写次数过多会造成频繁的IO,所以我们可以增加Spill内存上限来减少溢写Spill的次数

Merge阶段

减少合并次数:通过IO.sort.factor参数,增大Merge的文件数目,从而减少Merge的次数

如果情况运行,我们可以在不影响业务逻辑的前提下,先对数据进行Combine处理,这样可以减少IO操作

Reduce阶段

合理设置Map和Reduce的数量,可以减少一定的运行时间 因为两个都不能设置太少或者太多,太少会导致Task处于等待状态,增加处理时间太多会导致Map和Reduce任务间竞争资源,造成处理超时等问题 如果有可能,我们可以尽量规避使用Reduce。因为Reduce阶段在连接数据集的时候会产生大量的网络资源如果无法规避Reduce,我们也要尽量使得Map和Reduce共存 因为在Map运行时,Reduce会等待,我们可以通过调整参数,让Map运行一段时间后,Reduce就开始工作,这样就可以在一定程度上提高MR的工作效率 我们知道,MR的Buffer阶段分为Map的后半段和Reduce的前半段 在Reduce那段时,默认情况下,数据到达一定阈值时Buffer会对数据进行落盘,也就是写入磁盘,此时如果频繁落盘就会造成很多的IO操作我们可以通过修改配置参数,使得Buffle中一部分数据直接从内存输送到Reduce而不再进行落盘,从而减少IO的开销

IO传输

通过前面我们学习的压缩知识,想必大家一看到IO传输就知道如何进行优化了吧?没错,我们可以进行数据压缩的方式来完成数据的IO操作通常情况下,我们都会采用Snappy和Lzo的方法进行压缩,因为它们快!

数据倾斜

在我们的工作中,数据倾斜问题是一个普遍的现象,数据倾斜我在前面提到过,数据倾斜分为两种情况

数据频率倾斜:某一区域的数据量远远大于其他区域数据大小倾斜: 部分记录的大小远远大于平均值既然数据倾斜问题是无法根治的,那么我们可以通过一些调优方法来减少数据倾斜

减少数据倾斜的方法

抽样和分区 这个很好理解,我们直接对数据进行抽样然后自定义分区,这样就可以一定程度上减少数据倾斜问题 Combine 万金油的Combine,我们通过Combine合并大量小数据来减少数据倾斜 采用Map Join尽量避免Reduce Join 在前面讲MR的时候,提到过数据连接Join并通过代码来演示具体的实现方法, 我们知道Map Join 和 Reduce Join的主要区别就是 Map Join是通过将一个小文件存储在内存中实现Join的,而Reduce通过磁盘中文件合并的方式进行,所以,如果硬件Hold住的话,我们尽量采用Map Join

常用的调优参数

资源相关参数

下面的参数是默认值,我们可以通过用户自定义来更改。例如修改mapred-default.xml参数,我们就可以根据下面的表格,添加参数到 mapred-stie.xml中进行修改

mapred-default.xml

yarn-default.xml

shuffle性能优化的关键参数

容错相关参数

HDFS小文件优化方法

有关小文件会造成HDFS运行缓慢的原因我前面提过了很多次了,我再重复一次哈

- HDFS上每个文件都要在NameNode上建立一个索引,这个索引的大小约为150byte,这样当小文件比较多的时候,就会产生很多的索引文件,一方面会大量占用NameNode的内存空间,另一方面就是索引文件过大使得索引速度变慢

针对小文件的优化方案如下

在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS。在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并。在MapReduce处理时,可采用CombineTextInputFormat提高效率开启JVM重用机制 对于大量小文件job,开启JVM重用会减少45%的运行时间JVM重用原理就是:每一个Job的运行会有很多的MapTask和Reduce,每一个Task都会创造一个单独的JVM,开启JVM重用,就是指当一个Task运行完成,在此JVM上运行下一个Task

Hadoop扩展知识点

集群间数据拷贝

scp实现两个远程主机之间的文件复制

// 推push,将当前节点文件推送到hadoop103服务器上scp -r hello.txt root@hadoop103:/user/conpany/hello.txt// 拉pull,从103服务器上获取一个文件scp -r root@hadoop103:/user/conpany/hello.txt hello.txt// 将hadoop103的文件,复制到hadoop104上scp -r root@hadoop103:/user/conpany/hello.txt root@hadoop104:/user/hadoopuser

采用distcp命令实现两个Hadoop集群之间的递归数据复制

因为我没有两个集群,就不写示例了,大家可以查官网文档hadoop distcp这个命令hadoop distcp 这个命令就是用于集群间数据的拷贝的

小文件存档

小文件存档指的是在小文件存储时,采用HDFS存档文件或HAR文件对小文件进行存储 通俗一些来说,小文件通过HDFS存档或HAR存档在我们看来没什么区别,但是对NameNode而言,是一个整体,这样可以减少元数据的体量,从而减少NameNode的内存消耗

小文件存储示例

启动Yarn进程

start-yarn.sh

归档文件

# 把/user/company/input目录里面的所有文件归档成一个叫input.har的归档文件,并把归档后文件存储到/user/company/output路径下bin/hadoop archive -archiveName input.har -p /user/company/input /user/company/output

查看归档

hadoop fs -ls -r /user/company/output/input.harhadoop fs -ls -r har:///user/atguigu/output/input.har

解归档文件

hadoop fs -cp har:/// user/company/output/input.har/* /user/company

回收站

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用回收站工作机制就类似我们windows中的回收站,只不过它可以设置定时时间,自动对回收站进行清理

回收站参数说明 fs.trashinterval=0, 默认0表示禁用回收站,其他非0的数值表示开启回收站fs.trash.checkpoint.interval=0, 默认0表示这个值的设置和上面的参数值相等,它代表检查回收站的间隔时间 一般要求 fs.trash.checkpoint.interval<= fs.trashinterval

回收站的使用

启用回收站

# 修改core-site.xml,配置垃圾回收时间为1分钟<property><name>fs.trash.interval</name><value>1</value></property>

查看回收站

回收站在集群中的路径:/user/hadoopuser/.Trash/….

修改访问垃圾回收站的用户名称

# 进入垃圾回收站用户名称,默认是dr.who,修改为hadoopuser用户,修改配置文件core-site.xml<property><name>hadoop.http.staticuser.user</name><value>hadoopuser</value></property>

通过程序删除的文件不会经过回收站,需要调用moveToTrash()才进入回收站

Trash trash = New Trash(conf);trash.moveToTrash(path);

恢复回收站数据

hadoop fs -mv/user/hadoopuser/.Trash/Current/user/hadoopuser/input /user/hadoopuser/input

清空回收站

hadoop fs -expunge

多NN的HA架构

在我们上一章学习HA的时候提到过,并且我们的HA就采用的是多NN的方法,在hadoop2.0版本中,HA架构只允许两个NN但是当我们需要更高的容错性来保证数据完整是就要采用多NN的方法,具体方法参考上一章的HA即可

纠删码

HDFS中的默认3副本方案在存储空间和其他资源(例如,网络带宽)中具有200%的开销。但是,对于I / O活动相对较低暖和冷数据集,在正常操作期间很少访问其他块副本,但仍会消耗与第一个副本相同的资源量。纠删码(Erasure Coding)能够在不到50% 的数据冗余情况下提供和3副本相同的容错能力,因此,使用纠删码作为副本机制的改进是自然而然的

总结

本章节主要是对Hadoop的一些优化方法和一些扩展知识进行分享,优化方法的原则是根据实际情况,灵活变化,就如同我在压缩那一章所说,合适的压缩会提高工作效率,反之还会减少工作效率甚至出现各种各样的问题发生好了,我们Hadoop框架的知识点告一段落了,下一章我为大家带来Hive的相关知识

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。