但数据集的大小超过一台独立物理计算机的存储能力时,就有必要对它进行分区并存储到若干台单独的计算机上。管理网络上跨多台计算机存储的文件系统称为分布式文件系统。
Hadoop的核心是HDFS和Map-Reduce,两者只是理论基础,不是什么具体可使用的高级应用。
Hadoop有一个称为HDFS的分布式系统(Hadoop Distributed FileSystem)
HDFS
HDFS以流式数据访问模式来存储超大文件,它是谷歌的GFS提出之后出现的另外一种文件系统,它有一定高度的容错性,而且提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。其设计特点为
大数据文件
文件分块存储
HDFS会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以从多个主机读取不同区块的文件,多主机读取比单主机读取效率要高得多。
硬件故障
HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。
流式数据访问:
HDFS的构建思路是这样的:一次写入,多次读取是最高效的访问模式。每次数据分析都涉及该数据集的大部分数据甚至全部,因此读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。
廉价硬件:
Hadoop并不需要运行在昂贵可靠的硬件上,它是设计运行在商用硬件的集群上的。因此对于庞大的集群来说,节点故障的几率还是非常高的。HDFS遇到上述故障时,被设计成能够继续运行且不让用户察觉到明显的中断。
低时间延迟的数据访问:
要求低时间延迟数据访问的应用,不适合在HDFS上运行。HDFS是为高数据吞吐量应用优化的,这可能会以高时间延迟为代价。
大量的小文件:
由于namenode将文件系统的元数据存储在内存中,所以因此该文件系统能够存储的文件总数受限于namenode的内存容量
多用户写入,任意修改文件:
HDFS中的文件可能只有一个writer,而且写操作总是将数据添加到文件的末尾。它不支持具有多个写入者的操作,也不支持在文件的任意位置进行修改。
HDFS优点
高吞吐量访问:HDFS的每个block分布在不同的rack上,在用户访问时,HDFS会计算使用最近和访问量最小的服务器给用户提供。由于block在不同的rack上都有备份,所以不再是单数据访问,所以速度和效率是非常快的。另外HDFS可以并行从服务器集群中读写,增加了文件读写的访问带宽。
高容错性:上面简单的介绍了一下高度容错。系统故障是不可避免的,如何做到故障之后的数据恢复和容错处理是至关重要的。HDFS通过多方面保证数据的可靠性,多分复制并且分布到物理位置的不同服务器上,数据校验功能、后台的连续自检数据一致性功能,都为高容错提供了可能。
容量扩充:因为HDFS的block信息存放到namenode上,文件的block分布到datanode上,当扩充的时候,仅仅添加datanode数量,系统可以在不停止服务的情况下做扩充,不需要人工干预。
HDFS的关键元素
block:
HDFS也有块的概念,默认为64MB,与单一磁盘上的文件系统相似,HDFS上的文件也被划分为块大小的多个分块,作为独立的存储单元。
对分布式文件系统中的块进行抽象会带来很多好处:
- 文件的所有块并不需要存储在同一个磁盘上,因此它们可以利用集群上的任意一个磁盘进行存储。
- 块非常适用于数据备份进而提供数据容错能力和可用性。将每个块复制到少数几个独立的机器上(默认为3个)。可以确保在发生块,磁盘或机器故障后数据不丢失。如果发现一个快不可用,系统会从其他地方读取另一个副本,而这个过程对于用户来说是透明的。一个因损坏或机器故障而丢失的块可以从其他候选地点复制到另一台可以正常运行的机器上,以保证副本的数量回到正常水平。
namenode 和 datanode
HDFS集群有两类节点,并以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。namenode管理文件系统的命名空间,它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上。namenode也记录着每个文件中各个块所在的数据节点信息。
客户端通过namenode与datanode交互来访问整个文件系统。客户端提供一个文件系统接口,因此用户在编程时无需知道namenode和datanode也可实现其功能。
datanode是文件系统的工作节点,用于存储block块文件。它们根据需要存储并检索数据块(受客户端或namenode调度),并且定期向namenode发送它们所存储的块的列表。
MapReduce
将文件分布式存储到硬盘是第一步,而从海量数据中提取我们需要的内容就是MapReduce做的事了。其是一套从海量源数据提取分析元素最后返回结果集的编程模型。MapReduce的基本原理就是:将大的数据分析分成小块逐个分析,最后再将提取出来的数据汇总分析,最终获得我们想要的内容。当然怎么分块分析,怎么做Reduce操作非常复杂,Hadoop已经提供了数据分析的实现,我们只需要编写简单的需求命令即可达成我们想要的数据。
Hadoop经典案例
词典统计:对每次出现的词,词频+1,。但是当数据量非常大时,没办法在内存中维护一个这么大的字典,就需要map-reduce过程了。
大概是分为下面几个环节:
Map阶段:
主要完成key-value对生成,这里是每看到一个单词,就输出(单词,1)的kv对
排序阶段
对刚才的kv对进行排序,这样相同单词就在一块儿了
Reduce阶段
对同一个单词的次数进行汇总,得到(词,频次)对