Hadoop学习之旅

学习一门新的技术,要先看其原理,然后再进行学习,进而就是在学习的过程中融会贯通

学习hadoop之旅:
           one:认识hadoop,首先hadoop是一个可靠的,可扩展的,分布式的计算框架,同样也是一套生态系统,我们都知道既然叫生态系统,就说明其中的成员都是相互依存,依赖从而得以生存的,比如现如今哪些商品最火热,这些的所有要在展示前全部算好.同理他是可以针对大量数据分析以及计算海量数据的一门技术(T/P),他的主要核心由大量数据的存储文件系统(HDFS)和海量数据的分析(MapReduce)还有海量数据资源调度与管理(yarn)这三部分组成;他的创始人是Doug Gutting,这位哥们是根据谷歌的三篇论文(GFS,MapReduce,BigTable)而受益,从而开发出来hadoop(JAVA编写)刚才说到hadoop是一个分布式的计算框架,那么什么是分布式那?个人认为:比如一头牛干不动的活,我们祖先不会想把这头牛培养的更加强壮而是另外再加几头牛和这头牛一起工作,那么这就是Hadoop分布式最基本的一个道理,既然叫大数据那么一台电脑存放不下的数据必然会分别存放在另外好几台电脑上,对,是分别.所以叫做分布式存储,计算,资源调度框架.hadoop和struts是一样的同样是分为一代和二代.现在用的多为第二代即2.0;而第二代又分为个人,和企业的.具体就不多说了,自己体会.
           two:深入学习hadoop,个人认为,在学习hadoop前夕,先要明白他是干什么的,然后再慢慢深入的学习,在学习中再揪其原理,这样融会贯通的学习,相辅相成.会更有效率.首先我们就来看一下这个hadoop的组成:刚才在one的时候说到了,三个部分(HDFS,MapReduce,yarn)那么我们在编写hadoop计算程序的时候就可以按其原理一步一步来.我们先用MapReduce API去写分布式程序,然后在程序执行过程中是通过yarn去调用资源从而执行你编写的程序,(没有钱工人怎么开工)那么同样的道理你既然是大数据处理框架,那么数据在哪里?当然是HDFS上(HDFS是一个基于本地磁盘操作系统的一个抽象文件系统),那这样工人,钱,砖头.这下子我们都有了.可以开始盖房子了.当然,这个你这个房子盖得怎么样主要还是取决于你的MapReduce程序编写的怎么样.以下我们会非常系统的学习这三个组成部分是怎么协调工作的.
           HDFS:我们刚才说过了,HDFS是一个基于本地磁盘文件系统的一个抽象文件系统,那么就像Windows和Linux的文件系统一样,都可以存放数据.这个HDFS是这样工作的:比如一个数据文件'aa.txt'(当然假设这个文件占用磁盘很大空间{海量数据}),HDFS分为:nameNode和dataNode(前者是存放元数据的,就相当于是一个图书管理员.而后者可以为很多台服务器,这些服务器就是真实存放aa.txt的,aa.txt被切成块存放在各个服务器的本地文件系统上.就相当于国家图书馆,而只有管理员知道西游记这本书在图书馆的哪里?而所谓的元数据就是dataNode中的实际存放的文件和存放的具体物理位置之间的关联关系)当然,对于客户端来说无须关注你这个aa.txt文件的每个块在哪个服务器上,因为HDFS给你提供了一个统一的抽象文件系统.你可以从上边直接执行对aa.txt的操作.而hadoop为了防止其中的某一台dataNode挂掉,所以比如存放在A服务器上的这个aa.txt的块会自动备份在B服务器上,而B服务器上被随机分到的aa.txt的这个块也会备份在C服务器上.以此类推.那这样算下来.就不用担心因为其中一台服务器挂掉而导致aa.txt文件读不出来.
           MapReduce:我们刚才在two上也已经说过了,MapReduce是一个分布式的运算框架而他的实现思想是:要将一个业务分成map和reduce两部分来执行.就比如1,2,3,4,5,6,7,8,9这些数字.我让你给我算出来sum;而你肯定不会一下子就出来最后的结果.而会两两相加的来算.所以map1的工作就是算1,2,3,4的和map2的工作就是算5,6,7,8,9的和然后两个map把最后的结果输入交给reduce然后reduce就会输出最后的结果.这就是MapReduce的一个最基本的实现思想.而MapReduce在开发初期,要把分布式计算中面临的公共问题封装成框架来实现(Jar包的开发,任务的启动,调度,中间结果的分组传递),从而使猿猴们,只关心业务即可.当然也没有多余的时间去关心他具体的实现.是不是很人性化....有木有....
           第一天总结:以上这些那,就是个人对初学hadoop的一些总结.以下的文章会持续讲解这个hadoop的深入,尤其是对那三个组成部门的实现思想细化.注:要想有个好开头,先自己去弄一个伪分布式,以及免密登录,还有HDFS的SHELL操作,这些基本操作指令.当你会了这三个之后,就可以进行下一步了.具体怎么弄,改哪个哪个配置文件.自己上百度一搜就有.因为格式太过于复杂,为了维护此博文整体的一个流畅性,不予copy.小狗崽子们,自己去整.........加油.
           
         继续向下挖掘:go go go
           HDFS细化:我们在上一天说过,hdfs中有两个东西,(nameNode,dataNode)我们先说nameNode,我们都知道nameNode是文件系统中的管理节点它维系着整个文件系统中的目录树,文件/目录的元数据(MetaData)而客户端为了快速的读取到nameNode中的MetaData(元数据)所以存在内存中一份,但是断电就会清空内存,所以MetaData会序列化到本地磁盘中一份,nameNode中的机制:在nameNode中有一个叫fsimage(元数据镜像文件,存储某一时段的nameNode内存元数据信息)edits(存放元数据的日志文件)fstime(保存最近的一次checkpoint的时间).hadoop中HDFS中的nameNode为了保证每一次存取时的元数据文件不出错,就要通过fsimage和edits的合并来进行每一次元数据文件的更新,以保证MetaData一致.而Secondary nameNode 就是用来合并edits和fsimage的.具体实现过程{首先Secondary nameNode会先从元数据节点上下载edits和fsimage文件(通过http)生成新的fsimage文件在本地保存,然后再推送给nameNode从而替换下来旧的fsimage也就是说fsimage就是用来更新MetaData的.也就是他刷新了每次存取时发生的文件调度信息从而能够保证每次的存取都无误.}那么既然是要合并才能够更新到MetaData那么多长时间才会合并一次那?这个时候就用到了checkpoint 而fs.checkpoint.period指定两次合并之间的时间间隔,默认是3600秒,而fs.checkpoint.size指定了当edits文件到达多大的时候才会合并.一旦超过这个值则会强制执行checkpoint不管是否到达了最大的时间间隔.默认是64M.......接下来我们再说说dataNode:dataNode是提供真实文件的存储服务,他的基本单位是文件块,也就是block而hadoop中的dataNode默认是3个block,默认block的大小是64M,为了解决当一台服务器挂掉的时候数据的问题,所以采用了心跳机制(有规律的跳动)为了保证数据的安全性,所以让每一个数据块在通过HDFS被存入到HDFS中的dataNode的时候就复制一个到另外一台服务器中.这样数据的安全性问题就解决了.无论挂掉几台,我还有其他服务器支持我的数据安全性.
           MapReduce细化:MapReduce是一个分布式计算框架,由Google提出主要用于搜索领域,解决海量数据的处理问题,MapReduce由两个部门组成(map,reduce)用户只需要实现map(在Map之后还有一个叫Combiners他的主要作用就是在map输出到reduce之间先做一次合并,从而降低了Reduce的任务量,提升了效率.当然这个Combiners是可以插拔的,也就是说可以有,也可以没有..)和reduce两个函数即可实现分布式的计算,这两个函数的形参是key,value的形式表示函数的输入和输出信息,首先我们对于MapReduce的实现思想有一个宏观的了解,然后再慢慢的向内分析,宏观:将海量的数据上传到HDFS上之后进行物理切块每一个block根据不同的标识再次发送给mapper进行运算然后Shuffle(排序,分区,分组...)然后再发送给reduce输出以上是reduce的一个宏观的理解,然后我们再细化,海量数据上传到HDFS那是实实在在存在的,所以当map开始运算的时候会先读取输入文件的内容,然后解析为key,value对,对输入文件的每一行,解析成key,value对,每一个键值对要调用一次Map函数.写自己的逻辑,把解析好的key,value对处理,输出新的key,value对.对输出的Key,value进行分区,对不同分区的数据根据key去排序,分组.相同Key的value放在一个集合中分组后的数据进行归约,(归并计算加或者减...)然后Reduce就会对多个map的输出,按照不同的分区通过网络copy到各reduce节点上去,然后对多个Map的输出进行排序,分组,再写自己的逻辑,把map解析为新的key,value值,输出.最后就是把reduce输出的值保存在文件中(HDFS).再次细化:(RM就是jobTrackerNM就是taskTracker)客户端提交了一个jar包给jobClient然后jobClient和jobTracker通信从而得到一个jar包的存储地址,然后返回给jobClient然后jobClient会把这个jar包存放到HDFS上也就是说把任务提交到了HDFS上去,然后jobTracker开始初始化任务,然后jobTracker读取到存放到HDFS上的要处理的文件,开始计算输入分片,每一个分片对应一个mapperTask 然后RM会根据文件的大小来计算出来通过NM(taskTracker)应该启动几个mapper和reduce然后taskTracker就会通过和jobTracker心跳机制领取任务,然后再交给mapper和reduce去执行,然后把reduce输出的文件输出到HDFS上去(以上细化为hadoop1.0)下面开始hadoop2.0的MapReduce执行的原理:其实2.0和1.0之间有一个相同点,就是都是使用HDFS,但是1.0却不支持高可用(HA)2.0中最显著的特点就是有了yarn也就是ResourceManager和NodeManager,而前者就是相当于1.0中的jobTracker后者就相当于是1.0中的taskTracker但是这两者之间也有很显著的差距,ResourceManager在接到jobClient给的任务的时候,他会去HDFS中调用出这个文件的大小然后再把这个任务分配给之下的NodeManager(这个过程是随机的,就是说每一个DataNode上边都有一个NodeManager,并且每一个NodeManager都会被分配给任务)然后这个被分配到任务的NodeManager会把任务随机的分配给平行节点的NodeManager然后这个最后被分配到任务的NodeManager才会去调用Map And Reduce 去执行,然后Reduce最后的执行结果输出给HDFS.
           第二天总结:关于今天的内容补充一点:序列化,和反序列化.个人认为当你在定义一个DataBean的class的时候会实现一个writable的接口然后会实现两个方法.这两个方法就是反序列化和序列化.以下为个人理解:因为在没有map参与运算之前,文件是一个对象状态文件,而要参与运算所以要转成一个字节流才能够运算,而当reduce运算完的时候又要输出成为一个对象状态文件.所以就会有反序列化的方法.that is
要写一个完整的一个自己逻辑的MapReduece程序,首先要知道自己的key是什么,因为MapReduce中的Shuffle机制是根据key来进行分组分区,和排序的.这是首先要明确的一点.

           The End:后期会陆续的分享Hadoop的生态系统一些框架,欢迎来访...上面内容仅代表个人己观,不代表官方说明,如有问题,可以联系我互相交流...QQ:1210958801,WX:lzy15933036380,Email:lzy17777786352@163.com
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值