体系结构
Hadoop1的核心组成包括HDFS和MapReduce。HDFS和MapReduce的共同点就是他们都是分布式的。
HDFS是包括主节点NameNode,只有一个,还有很多从节点DataNode,还有很多个。
NameNode含有我们用户存储的元数据的信息,把这些数据存储在硬盘上,但是在运行时是加载在内存中的。
Hadoop1HDFS缺点:
1) 当我们的NameNode无法在内存中加载全部的元数据信息的时候,集群的寿命到头了。为了集群的寿命更长,我们需要设定NameNode的节点是大内存的,内存越大越好。
2) Namenode只有一个节点,所以权限设计不够合理。 不能完全物理隔离。举例:10个用户共用linux权限隔离彻底还是每个用户在独立的机器上隔离的彻底,很明显是后者。
3) HDFS存储数据有blocK概念,默认是64MB,可以改成128或者256。如果上传的数据都是大量的小文件,比如都是1MB,2MB的小文件,那么对我们的HDFS集群会造成NameNode的元数据信息会急剧膨胀,每个小文件都是独立元数据信息。
改进:
1) 一个NameNode装不下数据,硬件上已经无法突破,那么我们从软件体系中进行改进。一个NameNode不够用,那么就2个NameNode一起共存。它们组成hdfs federation。
2) 实现高可靠,可以实现NameNode的核心元数据同时存放在多个节点上。也可以使用SecondNameNode,NameNode宕了,SecondNameNode还可以做事。默认的情况下全是手动恢复或者手动切换,没有自动化。HDFS 高可靠自动化需要第三方软件。
Hadoop2 实现了HA,它有两个NameNode。
写数据的NameNode处于active状态,读数据的NameNode处于standby状态。
HA两个NameNode使用相同的命名空间。与HDFS联盟不一样,联盟使用的是两个独立的命名空间。
两个NameNode到底谁提供服务?如果一个NameNode宕了,是否还要改程序(IP、主机变了)?
我们不需要去管。不用改程序。我们只看到一个HDFS,根本看不到两个NameNode的不同。对外提供的是统一的接口。
Active宕了,standby要转为Active,谁去做这样的事情?
两种方式,一手工做,二自动切换。
如何实现HA自动切换,需要Zookeeper.
MapReduce包括主节点JobTracker,只有一个;还有从节点TaskTracker,有很多个。
JobTracker主要的工作是管理用户提交的作业和分配资源。每个TaskTracker有两个slot,也就是在一个TaskTracker最多有两个运行任务,默认是两个,可以更多,但是占有的内存也就多了。
MapReduce处理的作业都是批处理的作业,对实时性要求不高的作业。
Hadoop1MapReduce缺点:
1) 对于实时性作业和批处理作业,需要搭建不同的集群环境。意味着硬件投入会多,需要很多服务器去做这样的事。并且相同的数据分散在两套不同的集群体系中,数据需要同时传在两套不同的集群体系中。不同的环境运行的是不同的作业类型,从另一个角度讲每个集群环境的资源利用率是不高的。集群可能是这样的情况,用户要求实时性的作业,那么使用spark或者storm,运行完之后,处理完的数据我们进行批处理,又由hadoop集群来做,从时间轴上来看,前面的集群是在前段时间有作业,后面的集群在后段时间有作业,资源利用率不高是从这个角度上讲。为了提高资源的利用率最好把它们合并到一套平台上。
2) MapReduce职责过多,需要分解。
hadoop2:Yarn用于处理资源分配和任务调度。
Yarn:
ResourceManeger:分配资源的(CPU、内存)
NodeManeger:它管理Hadoop集群中单个计算节点
Yarn的RM接收到我们客户提交的MapReduce程序后,把程序交给NodeManager,启动一个进程xxxAppMaster(在某个NodeManager上), xxxAppMaster再在其他节点上分配tasktracker。
源码编译
为什么要进行hadoop的源码编译?
看这篇文章:http://blog.csdn.net/xuefengmiao/article/details/25182323
hadoop2的学习资料很少,只有官网的少数文档。如果想更深入的研究hadoop2,除了仅看官网的文档外,还要学习如何看源码,通过不断的调试跟踪源码,学习hadoop的运行机制。
当你发现hadoop 存在bug而你又有能力修复的时候,可以尝试改源码bug然后重新编译,这样你就可以使用你fix bug 后的hadoop了。
如何进行hadoop源码的编译?
可以看我之前写过的一篇文章: