Hadoop简单的学习总结
Posted hyf199
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop简单的学习总结相关的知识,希望对你有一定的参考价值。
1.什么是Hadoop?
Hadoop是一款进行数据处理和分析的软件,包含HDFS(分布式文件存储系统),MapReduce(分布式计算框架),Yarn(分布式资源调度任务分配框架)。
Hadoop来源于谷歌2003-2004年发布的三篇论文,基于这三篇论文doug cutting( 来自 lucene ),用了两年业余时间,开发出来了 hdfs 和 mr 的代码雏形,2005年Hadoop项目进入apache项目基金会。
Hadoop特性:
①高容错性:Hadoop每个数据都有副本,也就是数据备份。
②高可靠性:Hadoop有故障恢复机制,如果有一个节点挂了,它所存储的数据会在另一个节点重生。
③高效性:Hadoop的mapreduce是并行运行的
④高扩展性:Hadoop集群几乎是可以扩展成千上万个
2.什么是HDFS?
HDFS是分布式文件存储系统(解决了海量数据存储问题)
hdfs文件系统架构为主从架构:
① NameNode:主节点,存储数据信息(元数据信息管理)
② DataNode:从节点,存储真实数据
hdfs分块存储:
1.x版本默认分块大小为64M
2.x版本默认为128M
hdfs副本机制:为了容错每个block都会有副本,每个文件的block大小副本系数都是可配置的,应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
hdfs适合作甚:
一次写入,多次读出。(适合海量数据存储)
不支持修改,不适合做网盘。
hdfs读写数据流程:
写流程:
①client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否存在,父目录是否存在,返回是否可以上传。
②client想NameNode请求第一个block该传输到哪一个DataNode服务器上。
③NamaNode根据配置文件中指定的备份数量及副本放置策略进行分配,返回可用的DataNode地址如:A,B,C;
注:Hadoop在设计时考虑到数据的安全与高效,数据文件默认在hdfs上存放三份,存储策略为本地一份,同机架其它某一节点一份,不同机架某一节点上一份。
④client请求3台DataNode中一台A上传数据(本质是一个RPC调用,建立pipeline),A收到请求后会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client
⑤client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64k),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
⑥数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终pipeline中第一个DataNode节点A将pipeline发送给client。
⑦当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
读流程:
①client向NameNode发送RPC请求,来确定block所在的位置。
②NameNode会视情况返回文件的部分或全部block列表,对于每个block,NameNode都会返回block副本的DataNode地址;这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端(client)的距离,然后进行排序,排序两个规则:网络拓扑结构中距离client近的靠前;心跳机制中超时汇报的DN状态为stale,这样的靠后;
③client选取排序靠前的DN来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)
④底层上本质是建立 SocketStream(FSFataputStream),重复调用父类DataInputStream的read方法,直到这个块上的数据读取完毕;
⑤当读完列表的block后,若文件还没有结束,客户端会继续想NameNode获取下一批的block列表;
⑥读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读;
⑦read方法是并行的读取block信息,不是一块一块读取;NameNode只是返回client请求包含块的地址,并不是请求快的数据;
⑧最终读取来所有block会合并成一个完整的最终文件。
3.什么是MapReduce?
MapReduce是一个分布式计算编程框架(解决了海量数据计算问题)
MapReduce的核心思想就是“分而治之”
MapReduce编程开发主要分成八个步骤:
Map阶段
①读取文件,解析成key,value键值对(k1,v1)
②自定义map类,接收读取的key,value键值对(k1,v1),通过我们自定义的逻辑进行转换,转换成新的key,value键值对进行输出(k2,v2)
Shuffle阶段(此阶段全部由框架完成,shuffle是Map产出输出到Reduce取得数据作为输出之前的过程)
③分区(相同k2的v2发送到同一个reduce里面去,形成一个集合)
④排序(根据字典序进行排序)
⑤规约(在 map 阶段的 reduce 操作:每一个分几期能算的先算一下,然后再发送给 reduce 统一计算,这样会减少 reduce 的任务量。)
⑥分组
Reduce阶段
⑦自定义reduce逻辑,接收我们的k2,v2(是一个集合),写上我们自己的业务逻辑,转换成新的k3,v3,准备输出
⑧输出文件,将我们reduce处理完成的数据进行输出
一个完整的MapReduce程序在分析运行时有三类实例进程:
①MRAppMaster:负责整个程序的过程调度及状态协调
②MapTask:负责map阶段整个数据的处理流程
③ReduceTask:负责reduce阶段整个数据处理流程
4.什么是Yarn?
Yarn是一个分布式资源调度框架,主要包含三大模块:
①ResourceManager:负责所有资源的监控,分配和管理
②ApplicationMaster:负责每一个具体应用程序的调度和协调
③NodeManager:负责每一个节点的维护,对于所有的Applications,RM有着绝对的控制权和对资源的分配权,而NM则会和RM协商资源,同时和NM通信来执行和监控task
Yarn的工作流程:
①client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必要信息,例如ApplicationMaster程序,启动ApplicationMaster的命令,用户程序等
②ResourceManager启动一个container用于运行ApplicationMaster。启动中的ApplicationMaster想ResourceManager注册自己,启动成功后与RM保持心跳
③ApplicationMaster向ResourceManager发送请求,申请相应数目的container
④ResourceManager返回ApplicationMaster的申请的container信息。申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NM进行通信,要求NM启动container。AM与NM保持心跳,从而对NM上运行的任务进行监控和管理。
⑤container运行期间,AM对container进行监控,container通过RPC协议向对应的AM汇报自己的进度和状态等信息。
⑥应用运行期间,client直接与AM通信获取应用的状态,进度更新等信息
⑦应用运行结束后,AM向RM注销自己,并允许属于它的container被收回
yarn的调度器Scheduler
第一种调度器:FIFO Scheduler(队列调度器)
一个任务结束后,下一个任务在开始
第二种调度器:capacity scheduler(容量调度器,Apache版本默认使用的调度器)
将集群的资源分成几部分,每个组可以获取一部分资源,组的内部也可以分组。
第三种调度器:Fair Scheduler(公平调度器,CDH版本的hadoop默认使用调度器)
Fair调度器的书记目标是为所有的应用分配公平的资源(对于公平的定义可以通过参数来设置)。公平调度也可以在多个队列间工作。举个例子,假设有两个用户A和B他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B 启动一个job后,A的job会继续运行,不过一会之后两个任务会各自获得一半的集群资源。如果B在启动一个job并且其他job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job回用于1/4的集群资源,而A的job依然用集群一般的资源,结果就是资源最终在两个用户之间平等共享。
Yarn常用参数配置:
第一个参数:container分配最小内存
yarn.scheduler.minimum-allocation-mb 1024 给应用程序container分配的最小内存
第二个参数:container分配最大内存
yarn.scheduler.maximum-allocation-mb 8192 给应用程序container分配的最大内存
第三个参数:每个container的最小虚拟内核个数
yarn.scheduler.minimum-allocation-vcores 1 每个container默认给分配的最小的虚拟内核个数
第四个参数:每个container的最大虚拟内核个数
yarn.scheduler.maximum-allocation-vcores 32 每个container可以分配的最大的虚拟内核的个数
第五个参数:nodeManager可以分配的内存大小
yarn.nodemanager.resource.memory-mb 8192 nodemanager可以分配的最大内存大小,默认8192Mb
我们可以在yarn-site.xml当中修改以下两个参数来改变默认值
定义每台机器的内存使用大小
yarn.nodemanager.resource.memory-mb 8192
定义每台机器的虚拟内核使用大小
yarn.nodemanager.resource.cpu-vcores 8
定义交换区空间可以使用的大小(交换区空间就是讲一块硬盘拿出来做内存使用)
这里指定的是nodemanager的2.1倍
yarn.nodemanager.vmem-pmem-ratio 2.1
以上是关于Hadoop简单的学习总结的主要内容,如果未能解决你的问题,请参考以下文章