【前言】无聊,看了下前面自己零零散散的记录对hadoop的各种理解,随着学习hadoop3、4个月了,写MR也更加熟练了,看看一路走来也对hadoop有一些自己的见解,也不知道对不对,写的比较口语化,大家不要见怪,如果有错误欢迎大家留言指正,谢谢!
一、Hadoop1和hadoop2进行比较:
Hadoop平台:分布式的存储与计算平台,主要还是因为目前的存储和计算体系满足不了一些企业业务的需求,像数据膨胀而导致目前的存储体系无法满足需求,所以催生出了HDFS分布式存储平台;在没有分布式计算框架之前,大多数是在单机上进行的计算,虽然也可以计算,但是数据量过大会导致速度下降而满足不了需求,这些原因使得Hadoop的发展成为必然。如果是批量处理数据的话是比较适合Hadoop来处理的,也就是批处理了,就是不太要求及时返回结果的,像及时性要求性很高的,可能就需要考虑使用spark了。
二、对于Hadoop版本的问题:
主要有三种apache版的,cloudera版本的,hortonworks版本的,三种,一般企业可能用cloudera版的会多一些(apache用的也还挺多的),因为这个稳定,然后也有商业支持,也完善了apache版的hadoop的一些patch,推荐使用。
Hadoop1的问题:
(1)Hdfs的namenode和mapreduce的jobtracker(主要负责资源管理、应用管理)都是单点,一旦单点跪了,集群就没法工作了,这是个比较严重的问题,一个掌管着HDFS,一个掌管中mapreduce的总调配。
(2)hdfs存储海量数据是按照block来存储的,block有大有小,但是最终只能规定一个统一的大小,这样的话,就会造成一些(HDFS空间)浪费而且namenode所在的服务器的内存也会有压力,一旦内存不够用了,集群也差不多该跪了!
(3)mapreduce的问题:在处理数据的时候速度比较慢,两段式的处理会从磁盘中读取数据,处理完了还要通过网络分发到reduce,中间比较费时间,而且还有个问题就是hadoop的计算框架只支持一种,如果单独又部署另一种的话,会出现资源的浪费。
三、hadoop2的两个核心项目:
HDFS(分布式存储)和MapReduce(分布式计算)。可以单独部署HDFS,不一定非要部署MapReduce。
3.1、HDFS理解:
就像仓库里面放东西一样,一个仓库里面放不下了,就需要放到多个仓库来存放,但是仓库多了,就会出现对多个仓库进行管理,那么就需要一个专门来进行管理的部门,HDFS也是一样,单机放不下了,就放到多个机器上,同样需要一个系统来进行管理,这个管理是跨机器,跨系统的。HDFS目的就是存储数据,因为数据是分散存储的,所以会出现各种不方便,像上传文件、查找、删除等都不方便,所以需要一个namenode来进行管理,让客户端的各种不方便得以解决,namenode主要是用来维护文件系统的目录结构的,在前面我部署hadoop的经验来看,就是被称作命名空间的那个。namenode就像一个用户对HDFS操作的入口,屏蔽了底层的复杂的各种数据操作。
datanode存在的必要性:如果只有一个namenode来管理整个集群,不要datanode,那么namenode就需要深入到每个存储节点进行深入的管理,但是namenode就需要承担太大的压力。所以才会分出datanode,每个datanode负责管理各自所在结点的数据,namenode负责控制每个节点的datanode,这样将职责分散开,datanode直接管理数据,namenode不直接跟各个节点的数据打交道。
3.2MapReduce理解:
在HDFS的基础上,Hadoop2 增加了一层YARN(资源管理框架)在YARN上面再部署mapreduce和其他的计算框架,这些计算框架或者说应用都需要用到hadoop集群的资源,而这些资源(CPU、内存、硬盘、网络等)是由YARN进行分配的。其实hadoop2就是将hadoop1的mapreduce的一部分功能抽出来了(资源管理),其他的应用就像插件一样插在YARN平台上,这类的应用有很多(spark等)
HDFS2与YARN如何进行通信?应用是需要HDFS2上的数据,所以应用和HDFS2的通信应该就是在数据的索取上,而YARN是管理集群资源的,应用的运行还离不开这些资源,所以应用和YARN也会进行通信
Jobtracker中原来监督任务的执行的功能这个时候就是由安装在YARN上的各种应用自己进行管理
四、HA:高可靠
解决NAMENODE的单点问题,namenode这个点容易出现问题,一旦namenode宕机,集群就崩溃了,hadoop2的产生,解决了这个问题,在hadoop2中有两个namenode,这两个namenode都会存储元数据,两个namenode是分状态的,一个是处在active状态,一个是处在standby状态(时刻准备着,一旦那个active着的namenode宕机,这个马上顶上),这里HDFS2提供了一个统一的域名,用户不需要管访问哪一个namenode,只需要访问namenode所在的域名即可,由集群进行管理到底访问哪一个。
两个namenode数据同步的问题,这个分为两个层面的数据同步,一个是软件层面的数据同步,一旦namenode发生变化,journalNode会受到active的namenode的变化,然后同步处在standby状态的namenode,如果处于active的namenode宕机了,可以通过手工切换到处于standby的namenode来接管宕机了的namenode;当然还可以通过自动切换,这就需要zookeeper(实现namenode之间状态切换的)来配合使用,zookeeper会和namenode还有journalnode进行通信,当一个namenode宕机的时候,journalnode会收到通知,然后通过程序将另一个namenode变为active状态(这个命令是由zookeeper发的)。
五、HDFS2的federation
在hadoop1 中,一旦namenode内存满了,集群就不能继续工作了,而在hadoop2中,federation允许搭建多个集群,datanode共享,但是namenode不共享,namenode如果共享,内存会出现问题,而datanode上面的硬盘是非常充裕的,一般都存不满,而且硬盘是可以随时扩展的,共用有很多好处,如解决了单节点造成的内存不足而导致集群无法使用的问题。Datanode共享不会造成数据的混乱,因为datanode就是用来存储数据的,数据是会做标记的,那块数据是属于哪个namenode的,对于namenode存满的问题,这个是很容易预估数据的情况的,一般对于数据的增长率来说是可以预估的,当数据快满的时候,就不应该再往里面填数据了,就只访问就好了。
六、HA的自动failover:
使用zookeeper之后可以自动的进行状态切换,就是这个意思。Zookeeper实现了NN的状态监管,failloverController/active和standby会监控NN的状态,然后给zookeeper。