Hadoop总结

Hadoop是一个能够对大量数据进行分布式处理的软件框架。以一种可靠、高效、可伸缩的方式进行数据处理。主要包括三部分内容:Hdfs,MapReduce,Yarn

HDFS

一、什么是?
    HDFS即Hadoop Distributed File System的简称,是Hadoop抽象文件系统的一种实现;是Hadoop的核心子项目,是分布式计算中数据存储管理的节点,是基于流式数据访问和处理超大文件的需求而开发的分布式文件系统,非常适合在大规模数据集上应用,同时也是一个具备高度容错的系统;适用于一次写入多次查询的流式数据访问情况,不是随机访问模式;修改只能先删除再重新上传,不支持并发写,不适合小文件操作;是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色;HDFS允许文件通过网络在多台主机上分享存储文件,使应用或者用户看起来和访问本地磁盘一致。
二、优点或特点
优点:
1、高容错性
    数据自动保存多个副本。它通过增加副本的形式,提高容错性
    某一个副本丢失以后,它可以自动恢复
2、适合处理大数据
    数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
    文件规模:能够处理百万规模以上的文件数量,数量相当之大。需要注意不适合使用大量小文件
    可构建在廉价机器上,通过多副本机制,提高可靠性
缺点:
1、不适合低延时数据访问,比如毫秒级的存储数据,是做不到的
2、无法高效的对大量小文件进行存储
    存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
    小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标
3、不支持并发写入、文件随机修改
    一个文件只能有一个写,不允许多个线程同时写
    仅支持数据append追加,不支持文件的随机修改。
三、适用场景
适用场景:适合一次写入,多次读出的场景,除了append操作之外,不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用
1、适用于流式的数据访问
2、HDFS适用于批量数据的处理,不适用于交互式处理。它设计的目标是通过流式的数据访问保证高吞吐量,不适合对低延迟用户响应的应用。可以选择HBase满足低延迟用户的访问需求。
3、支持简单的一致性模型
4、HDFS中的文件支持一次写入、多次读取,写入操作是以追加的方式添加在文件末尾,不支持多个写入者的操作,也不支持对文件的任意位置进行修改。
5、计算向数据靠拢
6、在Hadoop系统中,对数据进行计算时,采用将计算向数据靠拢的方式,即选择最近的数据进行计算,减少数据在网络中的传输延迟。
不适用场景:
1、对延时有要求,低时间延迟数据访问的应用,例如几十毫秒范围。HDFS是为高数据吞吐量应用优化的,这样就会造成以高时间延迟为代价。
2、多方读写,任意修改文件,现在HDFS文件只有一个writer,而且写操作总是写在文件的末尾。
3、大量小文件,NameNode启动时,将文件系统的元数据加载到内存,因此文件系统所能存储的文件总数受限于NameNode内存容量。,那么需要的内存空间将是非常大的。
四、原理架构
HDFS是一个主从体系结构,它由四部分组成,分别是HDFS Client、NameNode、DataNode以及Seconary NameNode
1、NameNode就是Master,它是一个主管、管理者
    管理HDFS的名称空间
    配置副本策略
    管理数据块 Block 映射信息
    处理客户端读写请求
2、DataNode就是Slave。NameNode下达命令,DataNode执行实际的操作
    存储实际的数据块
    执行数据块的读/写操作
3、Client就是客户端
    文件切分。文件上传HDFS的时候,Client将文件切分成一个一个的Block,然后进行上传
    与NameNode交互,获取文件的位置信息
    与DataNode交互,读取或者写入数据
    Client提供一些命令来管理HDFS,比如NameNode格式化
    Client可以通过一些命令来访问HDFS,比如对HDFS增删查改操作
4、Secondary NameNode辅助NameNode
    辅助NameNode定期合并Fsimage和Edits,并推送给NameNode
    NameNode宕机后实际上也可以通过SNN上存储的数据进行恢复
一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。

HDFS写数据流程
1)客户端通过 DistributedFileSystem 模块向 NameNode 请求上传文件,NameNode 检查目标文件是否已存在,父目录是否存在。
2)NameNode 返回是否可以上传。
3)客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。
4)NameNode 返回 3 个 DataNode 节点,分别为 dn1、dn2、dn3。
5)客户端通过 FSDataOutputStream 模块请求 dn1 上传数据,dn1 收到请求会继续调用 dn2,然后dn2 调用 dn3,将这个通信管道建立完成。
6)dn1、dn2、dn3 逐级应答客户端。
7)客户端开始往 dn1 上传第一个 Block(先从磁盘读取数据放到一个本地内存缓存),以 Packet 为单位,dn1 收到一个 Packet 就会传给 dn2,dn2 传给 dn3;dn1 每传一个 packet 会放入一个应答队列等待应答。
8)当一个 Block 传输完成之后,客户端再次请求 NameNode 上传第二个 Block 的服务器。(重复执行3-7 步)
HDFS读数据流程
1)客户端通过 Distributed FileSystem 向 NameNode 请求下载文件,NameNode 通过查询元数据,找到文件块所在的 DataNode 地址。
2)挑选一台 DataNode(就近原则,然后随机)服务器,请求读取数据。
3)DataNode 开始传输数据给客户端(从磁盘里面读取数据输入流,以 Packet 为单位来做校验)。
4)客户端以 Packet 为单位接收,先在本地缓存,然后写入目标文件。

五、优化策略
1、控制小文件个数
    背景:HDFS NameNode将所有文件元数据加载在内存中,在集群磁盘容量一定的情况下,如果小文件个数过多,则会造成NameNode的内存容量瓶颈。
    建议:尽量控制小文件的个数。对于存量的小文件,建议合并为大文件。
2、配置HDFS单目录文件数量
    背景:当集群运行时,不同组件(例如Spark和YARN)或客户端可能会向同一个HDFS目录不断写入文件。但HDFS系统支持的单目录文件数目是有上限的,因此需要您提前做好规划,防止单个目录下的文件数目超过阈值,导致任务出错。
    建议:您可以在EMR控制台HDFS服务的配置页面,单击hdfs-site页签,然后单击新增配置项,新增参数dfs.namenode.fs-limits.max-directory-items,以设置单个目录下可以存储的文件数目,最后保存配置。
3、配置可容忍的磁盘坏卷
    背景:如果为DataNode配置多个数据存放卷,默认情况下其中一个卷损坏,则DataNode将不再提供服务。
    建议:您可以在EMR控制台HDFS服务的配置页面,在配置搜索区域,搜索参数dfs.datanode.failed.volumes.tolerated,您可以修改此参数,小于该参数值,DataNode可以继续提供服务。 
4、使用Balancer进行容量均衡
    背景:HDFS集群可能出现DataNode节点间磁盘利用率不平衡的情况,例如集群中添加新DataNode的场景。如果HDFS出现数据不平衡的状况,则可能导致个别DataNode压力过大。
    建议:您可以使用Balancer操作进行容量均衡。 

MapReduce

一、什么是?
    MapReduce是hadoop项目中的分布式运算程序的编程框架,是用户开发基于hadoop的数据分析应用的核心框架,MapReduce程序本质上是并行运行的。分布式程序运行在大规模计算机集群上,可以并行执行大规模数据处理任务,从而获得巨大的计算能力。
    MapReduce是基于磁盘的面向大数据并行处理的计算模型、框架和平台。借助函数式编程以及分而治之的思想,在无需了解分布式系统底层的情况下编写分布式应用并运行在分布式系统上。MR处理过程可以大致分为切分split、映射map、混洗shuffle和归并reduce四大步骤。
二、优点或特点
优点:
1、MapReduce易于编程。它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduc 编程变得非常流行。
2、良好的扩展性。当计算资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。
3、高容错性。MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上面上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。
4、适合PB级以上海量数据的离线处理。适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce 很难做到。
缺点:
1、不擅长做实时计算。MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。
2、不擅长做流式计算。流式计算的输入数据时动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
3、不擅长做DAG有向图计算。多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。
三、适用场景
    MapReduce的典型应用场景中,目前日志分析用的比较多,还有做搜素的索引,机器学习算法包mahout也是之一,当然它能做的东西还有很多,比如数据挖掘、信息提取。MapReduce得到广泛的应用,主要集中在分布排序、Web连接图反转和Web访问日志分析。 
    MapReduce擅长进行离线数据处理,即处理硬盘上静态的大规模数据。MapReduce不擅长实时计算,MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果;MapReduce也不擅长流式计算,由于流式计算的输入数据是动态的,而MapReduce因为自身设计的原因,输入数据集必须是静态的,不能动态变化。MapReduce进行DAG(有向图)计算的效率也非常低,在多个应用程序存在依赖关系的场景下,后一个应用程序的输入为前一个的输出,使用MapReduce作业会进行大量的磁盘IO操作,导致性能非常的低下。
四、原理架构
MapReduce核心思想是分而治之,将一个大的数据集拆分成多个小数据集在多个机器上并行执行。
    MapReduce使用InputFormat做map前的预处理,然后将输入文件切分为逻辑上多个InputSplit。InputSplit记录了要处理的数据的偏移量
    InputSplit是逻辑切分,还需要通过RecordReader根据InputSplit中的信息处理split中的具体记录,加载数据并转换为适合map任务读取的键值对,输入给map任务
    map任务根据用户自定义的映射规则,输出一系列的 <key,value> 作为中间结果在shuffle结果中对map输出进行分区partition、排序sort、聚合Combine和合并merge操作,得到 <key, value-list> 形式的中间结果,再交给对应的reduce进行处理
Reduce以一系列 <key,value-list> 中间结果作为输入,执行用户定义的逻辑,输出结果交给OutputFormatOutputFormat验证输出目录是否存在,输出结果类型是否正确,最后将Reduce结果输出到分布式文件系统中
五、优化策略
MapReduce优化方法主要从五个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题。
    一、数据输入:(针对大量小文件场景)
        1、合并小文件:在执行MR任务前将小文件进行合并,因为大量小文件会产生大量的Map任务,增大Map任务装载次数,任务的装载又比较耗时,导致MR运行较慢,所以我们需要在MR开始前及进行合并。
        2、采用CombintTextInputFormat来作为输入,解决输入端大量小文件的场景。
    二、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的次数,从而缩短处理时间
        3、在map之后,不影响业务逻辑前提下,先进行combine处理,减少IO。
    三、Reduce阶段:
        1、设置Map、Reduce共存:调整mapreduce.job.reduce.slowstart.comletedmaps参数,使Map运行到一定程序后,Reduce也开始运行,减少Reduce等待时间。
        2、合理设置Reduce端的Buffer:默认情况下,数据达到一个阈值的时候,Buffer中的数据就会写入磁盘,然后Reduce从磁盘中获取所有数据,所以Buffer和Reduce使没有直接关联的,这就导致了会有多次IO进行,那么我们可以设置参数,使得buffer中的一部分数据可以直接输送到Reduce,从而减少IO。参数:mapreduce.reduce.input.buffer.percent,默认为0.0,当值大于0时,会保留指定比例的内存读Buffer中的数据直接拿给Reduce,这样一来,设置Buffer需要内存,读取数据需要内存,Reduce计算也需要内存,所以我们对这个参数进行调整即可。
    四、IO传输阶段:
        1、采用数据压缩的方式:没啥好解释的,就是合并文件,可以减少IO的时间,安装Snappy和LZO压缩编码器。这两最好用,用就完事了。Snappy速度非常快,系统自带。LZO速度也可以,并且LZO支持切片。
        2、使用SequenceFile二进制文件。
    五、数据倾斜问题:
       就是某一区域数据量远远大于其他区域,好比你一台服务器满了,另一台啥都没存,我们肯定不允许这种事情发生。
        方案:
        1、抽样和范围分区:通过对原始数据进行抽样得到的结果集来预设分区边界值
        2、自定义分区:打个比方:如果Map输出键是某个学校里的学生,而其中某个班的学生较多,那么就可以自定义分区,将这个班的学生发送给固定的Reduce实例,其他的都发送给剩下的rudece实例。
    3、Combiner:它的目的就是聚合并精简数据,上面map阶段已经介绍过了。
        4、采用MapJoin,尽量避免ReduceJoin。根据情况选择,ReduceJoin有数据倾斜的情况,MapJoin不会,不过MapJoin适用于一张表很小,另一张表很大的情况,如果两张表都很大,就不太适用了。它是先将小表加载,然后在进行MapReduce操作,比方说:超市,有商品id是一个小表,有商品数量,进货售出详细情况,流水这是一个大表,那么采用MapJoin就很适合。

Yarn

一、什么是?
Yarn是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。
资源管理:
    1、它会对集群中各类的资源进行抽象,然后根据各种应用程序或者服务的要求,按照一定的调度策略将资源分配给她们使用
    2、资源管理采用一定的隔离机制防止应用程序或者服务之间因为抢占资源而互相干扰。它弱化了计算框架之争,是他们都可以发挥自己的优势
    3、yarn进行统一的管理,可以使各大框架有条不紊的运行在一个大的集群上
二、优点或特点
    1、资源利用率高。在使用YARN作为资源管理系统之前,往往是一个集群运行一种计算框架,一个企业可能存在多个集群。各集群之间的负载很不平均,繁忙集群的负载无法分发到空闲的集群上,导致了计算资源的浪费。YARN实现“一个集群多个框架”,可以统一调度群内的计算资源,这就大大提高了资源利用率。
    2、运维成本低。管理员仅需要管理一个集群,大大降低了运维成本。
    3、数据共享方便。不同的计算框架有时候肯需要处理同样的数据,存在不同集群时,要实现数据共享比较麻烦,也会造成及集群间大量的数据传输开销。使用YARN做资源管理,可以在同个集群内部署不同的计算框架,实现了不同的计算框架的数据共享。
缺点:
    1、各个应用无法感知集群整体资源的使用情况,只能等待上层调度推送信息。
    2、资源分配采用轮询、ResourceOffer机制(mesos),在分配过程中使用悲观锁,并发粒度小。
    3、缺乏一种有效的竞争或优先抢占的机制。
三、适用场景
    在企业实际的生产环境中,同时存在不同的业务应用场景,对于计算的要求各有不同,常常需要应用多个计算框架来满足企业的需求。如用MapReduce做大规模数据的批处理离线计算,用Storm实现流数据的实时分析。由于Hadoop1.0时没有统一的资源管理平台,为了避免不同类型应用之间发生资源抢占冲突,往往需要在企业内部建立多个集群,在不同集群内运行不同的计算框架。不同集群之间无法直接共享数据,资源利用率低,多个集群大大增加了管理人员的运维工作。
    针对Hadoop1.0本身的局限性及企业内计算资源统一管理的需求,Hadoop2.0对自身架构做了改良。Hadoop2.0推出来资源管理调度系统YARN(Yet Another Resource Negotiator,另一种资源协调器),YARN可以支持MapReduce以及Spark、storm等计算框架,实现了“一个集群多个框架”。
四、原理架构
架构:
YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成
1、ResourceManager
ResourceManager 通常在独立的机器上以后台进程的形式运行,它是整个集群资源的主要协调者和管理者。ResourceManager 负责给用户提交的所有应用程序分配资源,它根据应用程序优先级、队列容量、ACLs、数据位置等信息,做出决策,然后以共享的、安全的、多租户的方式制定分配策略,调度集群资源。
2、NodeManager
NodeManager 是 YARN 集群中的每个具体节点的管理者。主要负责该节点内所有容器的生命周期的管理,监视资源和跟踪节点健康。具体如下:
    启动时向ResourceManager 注册并定时发送心跳消息,等待ResourceManager 的指令;
    维护Container的生命周期,监控Container的资源使用情况;
    管理任务运行时的相关依赖,根据ApplicationMaster的需要,在启动Container之前将需要的程序及其依赖拷贝到本地;
3、ApplicationMaster
在用户提交一个应用程序时,YARN 会启动一个轻量级的进程ApplicationMaster。ApplicationMaster负责协调来自ResourceManager的资源,并通过NodeManager监视容器内资源的使用情况,同时还负责任务的监控与容错。具体如下:
    根据应用的运行状态来决定动态计算资源需求;
    向 ResourceManager 申请资源,监控申请的资源的使用情况;
    跟踪任务状态和进度,报告资源的使用情况和应用的进度信息;
    负责任务的容错;
4、Container
Container是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。当 AM 向 RM 申请资源时,RM 为 AM 返回的资源是用Container表示的。YARN 会为每个任务分配一个Container,该任务只能使用该Container中描述的资源。ApplicationMaster可在Container内运行任何类型的任务。如MapReduce ApplicationMaster请求一个容器来启动 map 或 reduce 任务,而Graph ApplicationMaster请求一个容器来运行Graph 任务。
原理:
1. Client提交作业到 YARN 上;
2. Resource Manager选择一个Node Manager,启动一个Container并运行Application Master实
例;
3. Application Master根据实际需要向Resource Manager请求更多的Container资源。如果作业很
小,应用管理器会选择在其自己的 JVM 中运行任务;
4. Application Master通过获取到的Container资源执行分布式计算。
或者
1、MR程序提交到客户端所在的节点。
2、YarnRunner向ResourceManager申请一个Application。
3、RM将该应用程序的资源路径返回给YarnRunner。
4、该程序将运行所需资源提交到HDFS上。
5、程序资源提交完毕后,申请运行mrAppMaster。
6、RM将用户的请求初始化成一个Task。
7、其中一个NodeManager领取到Task任务。
8、该NodeManager创建容器Container,并产生MRAppmaster。
9、Container从HDFS上拷贝资源到本地。
10、MRAppmaster向RM 申请运行MapTask资源。
11、RM将运行MapTask任务分配给另外两个NodeManager,另两个NodeManager分别领取任务并创
建容器。
12、MR向两个接收到任务的NodeManager发送程序启动脚本,这两个NodeManager分别启动
MapTask,MapTask对数据分区排序。
13、MrAppMaster等待所有MapTask运行完毕后,向RM申请容器,运行ReduceTask。
14、ReduceTask向MapTask获取相应分区的数据。
15、程序运行完毕后,MR会向RM申请注销自己。
五、优化策略
1、配置NodeManager的注册资源
    cpu核数=逻辑核数-其他应用数(datanode?work?zk?等)cat /proc/cpuinfo | grep “processor” | wc -l
可以查看集群的逻辑核数
    内存建议是CPU的整数倍,给系统预留好足够用的内存
2、ApplicationMaster配置
    cpu和内存比例和 nm的分配比例保持一致
3、Container 配置优化
    在调度器中,很多资源计算部分会转化为这个最小值的N倍进行计算。所以,设定可分配内存等资源的时候,最好是刚好为这个最小值的倍数
    cpu和内存比例保持一致
    YARN采用了线程监控的方法判断任务是否超量使用内存,一旦发现超量,则直接将其杀死。由于Cgroups对内存的控制缺乏灵活性(即任务任何时刻不能超过内存上限,如果超过,则直接将其杀死或者报OOM),而Java进程在创建瞬间内存将翻倍,之后骤降到正常值,这种情况下,采用线程监控的方式更加灵活(当发现进程树内存瞬间翻倍超过设定值时,可认为是正常现象,不会将任务杀死),因此YARN未提供Cgroups内存隔离机制来控制容器。
4、mapreduce参数设置
    如果集群主要使用mr进行计算,那么建议map的内存和cpu和容器最小的相等。
    一个容器里面最多跑几个map?yarn.scheduler.maximum-allocation-mb/mapreduce.map.memory.mb=4
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值