Hadoop
Hadoop是处理大数据的关键设施,常见的数据处理方法(例如使用MySQL存储数据,使用Java分析数据)在处理TB、PB级别的数据时,无论是存储数据、还是读写数据,都十分乏力。物理上不存在PB级别的硬盘,因此海量的数据要被划分为多个部分,存储在多台机器上;而查询数据的时候,又需要将计算任务分成多个子任务在多台机器上并行计算。Hadoop就是为了简化大量数据的处理逻辑而存在的软件。
Hadoop内部由多个组件构成,包括MapReduce,HDFS,Yarn等组件,每个组件都有各自独特的功能。

HDFS
HDFS全名 Hadoop Distributed File System,Hadoop分布式文件存储系统,是将文件分布存储在多个计算机上并管理的软件。HDFS将数据分成一个个128MB的 Block(数据块),然后将所有 Block分别存储在多台计算机上,并且为了防止部分数据损坏,HDFS将会存储一定的冗余数据块,用于恢复数据。
HDFS架构
如果是简单的将数据分为多个128MB的小块存储在多个服务器上,那么需要查找数据的时候我们怎么知道要去哪台服务器上找呢?HDFS将集群中的所有结点分为两部分,一部分叫NameNode master节点,另一部分叫做DataNode slave节点——NameNode负责管理数据,而DataNode负责存储数据。
为什么不适用分布式哈希表 DHT 呢,IPFS就是用这个算法做内容寻址的
NameNode
DataNode结构简单,只需要能够存储文件即可,并且即便文件存储坏了,还有冗余的数据备份可供恢复。NameNode负责管理集群中的DataNode,一旦报废整个集群将不可用,因此NameNode设计会稍微复杂一点。
NameNode分为两个部分,负责两个主要功能:第一个部分Namespace,负责记录文件的元数据,例如文件的名字、大小、地址、文件Namespace还将文件以文件树的形式组织起来,为外部提供访问的API;而第二个部分Block Manager负责记录哪些块存储在了哪些DataNode上。
为了支持高性能,NameNode将数据存储在内存中,但是一旦服务器宕机,数据就全消失了,因此我们还需要持久化NameNode的数据。NameNode会定期将Namespace和Blockmanager中的内容存储在磁盘上的fsimage文件中。NameNode采取经典的AOF技巧,维护一份EditLog记录,里面记录的所有修改记录,并且定期将EditLog中的内容flush到硬盘上。这样就算服务器宕机,我们也可以尽可能从fsimage和EditLog恢复。
如果请求在被flush到磁盘上之前,服务器就宕机了,那么请求会丢失。因此我们需要知会外部请求的人请求是否完成,只要请求被flush到editlog中后,就可以返回请求成功。
为了进一步提高系统的可靠性(可用性),我们把另寻一台机器备份NameNode中的数据,一旦NameNode宕机,另一台机器就可以直接顶上接管整个系统。
Federation水平拓展
HDFS系统受限与NameNode节点的服务器内存和CPU上限,我们可以准备多台NameNode一起向外提供服务。Namespace本质是一棵目录树,我们可以根据业务的属性,将目录树拆分,分为多个Namespace。再新增NameNode,每个NameNode独立维护一棵目录树。

MapReduce
在解决的存储数据的情况下,如何查询、修改数据成为了应用瓶颈,如果沿用MySQL数据库的思路,将数据挨个加载进内存挨个查找,效率将非常低下。因此我们需要一套通用的计算范式来帮助我们使用多个计算机并行查找、修改数据,这个就是MapReduce框架。
MapReduce将数据进一步分为多个分片(Split),然后把多个分片分给多个服务器做计算,最后再将所有计算结果汇总起来。在使用MapReduce中,我们需要定义map()函数告诉每台服务器怎么做计算每一条数据,再定义一个reduce()函数,告诉计算机怎么将每个分片中的计算结果汇总起来。
YARN
YARN(Yet Another Resource Negotiator)是负责统一调度计算资源的调度器,YARN将需要计算的任务抽象为一个个“容器”,然后通过“资源申请 + 协调调度”的方式,将任务分配到一台台计算机上去完成计算任务。
Hive
Hive是一个SQL和MapReduce之间的中间层,它可以将类似SQL的语句转化成map和reduce任务,这样程序员就能少些一些 map() reduce()代码了 。
Spark 和 Flink
MapReduce会将中间计算结果缓存在硬盘上,以减少计算资源的消耗,但是将计算结果缓存在硬盘上会带来多次硬盘读写的损耗,因此Spark将中间计算结果优先缓存在内存中,以优化性能。同时Spark通过 Hive on Spark 的中间层,让Hive也可以运用Spark。

由于Hive on Spark会带来性能损耗,因此又有Spark SQL来直接替代Hive。
Spark 和 MapReduce都是为了处理离线数据的,而Flink则添加了实时在线处理数据的功能。
Hbase
即便有了则么多组件,查询一条数据仍需要使用分钟级别的耗时,于是设计了Hbase,能够在毫秒级别读写分布式数据库中的内容。
