2003-2004年,Google公布了部分GFS和MapReduce思想的细节,受此启发的Doug Cutting等人用2年的业余时间实现了DFS和MapReduce机制,使Nutch性能飙升。然后Yahoo招安Doug Gutting及其项目。
2005年,Hadoop作为Lucene的子项目Nutch的一部分正式引入Apache基金会。
2006年2月被分离出来,成为一套完整独立的软件,起名为Hadoop
Hadoop名字不是一个缩写,而是一个生造出来的词。是Hadoop之父Doug Cutting儿子毛绒玩具象命名的。
Hadoop 1.0
在Hadoop 1.0时代,Hadoop由两部分组成,一部分是做为分布式文件系统的HDFS,另一部分是作为分布式计算引擎的MapReduce。
Hadoop的研发团队在研发初期就意识到了NameNode的重要性,故将其部分功能拆离出来作为Secondary NameNode。Secondary NameNode作为NameNode的一个冷备节点,定期将NameNode的操作日志合并成集群的状态快照,这样在NameNode重启时可以加快启动速度。HDFS的整体架构图如下:
Hadoop 2.0
Hadoop 2.0对Hadoop 1.0中的每个组件都进行了升级扩展。就HDFS来说,它的整体架构并没有太大的改变,其新增的特性为HA(高可用)和Federation(联邦模式),这两个特性主要集中在NameNode中。
在Hadoop 2.0中,支持用两个NameNode提供HA功能,这两个NameNode分别为Active NameNode和Standby NameNode,前者负责对外提供服务,后则作为前者的热备节点,它们通过一个共享的存储结构QJM(Quorum Journal Manager)实现数据同步。
虽然NameNode的稳定性通过HA得到了增强,但是随着集群规模的扩大,NameNode的内存逐渐成为影响其扩容的主要因素,而Federation为其提供了横向扩展的能力。在Federation中,viewfs负责提供N个小集群的整体视图,对普通用户屏蔽内部架构细节,这样也方便集群管理员管理集群。基于Viewfs的Federation的整体架构如图所示:
Hadoop 2.0的另一个亮点是将Hadoop 1.0的MapReduce拆分为两个组件:一个组件专注于分布式计算,依然以MapReduce命名;另一个组件专注于资源管理,命名为YARN。
虽然Hadoop 2.0解决了很多问题,使其性能得以提升、集群规模得以扩大,但是在扩大的过程中,又出现了新的瓶颈,如:HDFS虽然在Federation下能够横向扩展,但是其使用方式并不利于维护,而且数据冗余存储的方式在大规模集群中暴露出了存储资源利用不足的问题。再则就是HDFS的横向扩展导致在集群达到一定规模时,ResourceManager对资源的调度成了新的瓶颈。为了解决这些问题,Hadoop3.0问世了。
Hadoop 3.0
Hadoop 3.0没有在架构上对Hadoop 2.0进行大的改动,而是将精力放在了如何提供系统的可扩展性和资源利用率上。因此,Hadoop 3.0提供了更高的性能、更强的容错能力以及更高的数据处理能力。
在提供可扩展性方面,Hadoop 3.0为YARN提供了Federation,使其集群规模可以达到上万台。此外,它还为NameNode提供了多个Standby NameNode,这使得NameNode又多了一份保障。
另外,Hadoop 3.0中还新增了两个成员,分别是Hadoop Ozone和Hadoop Submarine。Hadoop Ozone是专门为Hadoop设计的、由HDDS(Hadoop Distributed Data Store)构建成的可扩展的分布式对象存储系统;Hadoop Submarine 是一个机器学习引擎,可以运行TensorFlow、PyToch、MXNet等框架,可以运行在YARN、Kubenetes等资源管理平台之上。这两个模块都是新增的,它们正处在开发中,之后会使Hadoop更加强大。
在Hadoop 2.0中,基于viewfs的Federation是以客户端为核心的解决方案,对Hadoop客户端影响较大,在落地应用时有较多的限制,对上层应用模式有较强的依赖。于是社区在Hadoop 3.0中提出了新的用于解决统一命名空间问题的方案:基于Router的Federation。
基于Router的Federation并不像viewfs那样在各个子集群之上新增视图,而是在所有子集群之上新增一个拦截转发层,架构如下图:
拦截转发层新增的两个组件分别为Router和Srate Store。其中State Store存储远程挂载表(与viewfs相似,但是在客户端之间共享)和有关子集群的负载、空间使用信息。Router实现了与NameNode相同的接口,根据State Store的元数据信息将客户端请求转发给正确的集群。



