第1章 概述
分布式并行运算
用多台计算机参与同一堆数据的处理,这叫作分布式并行运算。实际上,大数据指的是一个分布式并行运算系统。
大数据系统的定位
大数据系统并不是通用计算平台,它仅用于处理数据、分析数据,然后将结果用于其他业务逻辑,而业务逻辑(比如登录注册)是不可以通过大数据系统处理的。
大数据系统的价值
大数据系统借助于普通计算机和普通网络就可实现分布式计算,对硬件没有特殊要求,很平民化,而且软件都是开源的,任何人、任何公司都很容易组建出自己的大数据平台。传统分布式系统需要昂贵的企业级硬件配合其软件系统,而且在扩展硬件时性能的提升比例也不如大数据。
大数据系统的原理
数据系统对被处理的数据是有要求的,数据结构必须是统一的或者可以被抽象成统一结构!这很好理解:**结构统一了,每条数据的处理逻辑也就相同了,于是才可以把数据分成多段并行处理。**人们把统一结构的一堆数据叫作结构化数据,比如数据库表中的各条记录。
大数据系统的组成
Hadoop由HDFS、Yarn和MapReduce组成:HDFS是分布式文件系统,解决了大量数据存储的问题;Yarn是分布式计算系统的节点资源管理和调度工具;MapReduce是数据计算框架,分成Map和Reduce两个阶段,其中Reduce又隐含了一个Shuffle过程。MapReduce与其他两个不是一个层面上的,MapReduce是帮助我们编写运行于Hadoop系统中的数据处理程序的库。
如何把数据处理分散到不同的计算机上,让每台计算机的计算资源被充分利用起来,比如把新任务分配给空闲的计算机。这就需要一套资源管理和调度系统,而Hadoop中的Yarn就是为了完成这个任务而生的。
第2章 HDFS原理详解
HDFS是建立在操作系统现有文件系统之上的,而不是代替它,也就是说,要访问HDFS时不能用系统文件IO API,而需要用一套更上层的API。
HDFS实现了以廉价计算机构建海量数据存储系统的方案。在集群上运行HDFS程序把它们管理起来,使它们对外看起来像一台硬盘无限大的计算机。
主从结点架构
HDFS最基本的构成就是一台主节点+多台数据节点。主节点叫NameNode(经常简写为NN),数据节点叫DataNode(经常简写为DN)。NameNode主要负责文件目录树管理,DataNode负责对客户端提供文件数据读写服务
数据冗余
客户端先向NameNode发出创建文件的请求(第二步),NameNode告诉它应该将文件放在哪个DataNode上,于是客户端连接那个DataNode,再向它发送要写的数据。DataNode收到数据后保存数据,同时将数据副本放到其他DataNode上,直到所有副本写完,才通知NameNode一次写操作完成。
一个文件在不同的DataNode上都存在,所以当客户端读取文件时可能从不同的DataNode上获取,这样也充分利用了分布式的优势,提高了并行性,
fsimage与edits
文件系统的目录树中的每个节点包含了文件的信息(比如文件名、文件属性等)以及文件与DataNode的对应关系,这些数据称为元数据(meta data)
要读写HDFS中的文件,必须经过NameNode(先从目录树中找到文件Meta数据),所以NameNode容易成为整个系统的瓶颈。为了提升响应速度,在NameNode中,整个文件系统的目录树是放在内存中的。这会带来一个问题:NameNode一旦关机或意外死掉,内存中的数据是无法保存的。
如何解决这个问题呢?其实思路很简单:HDFS引入了一个叫作fsImage的文件,用于保存NameNode的所有元数据(整个目录树就是HFDS文件系统的描述,所以叫fs镜像)。当执行改变文件系统的操作时,依然先写入edits中,只不过每隔一段时间要将edits合并到fsimage中,合并完的edits被扔掉,如此可以保证fsimage与当前最新的元数据没有太大的差距,而edits中保存的实际是fsimage与内存中元数据的差异。
SecondaryNameNode的作用是专门帮助NameNode更新fsimage文件。
ZooKeeper实现自动故障转移
ZooKeeper是一个分布式软件,主要作为其他分布式系统的辅助协调工具,协调各节点间如何相互配合。ZooKeeper可以存储小数据,其组织形式为树形结构,与文件系统类似
ZooKeeper还有一个功能—节点监视,一个客户端可以注册成为某个节点的监视者,当节点被删除时就会收到通知。
收到“大哥”去世的消息后,“小弟”们都试图去ZooKeeper取得一个同步锁(ZooKeeper支持分布式同步锁),一旦有人得到它,其他人便不能再得到,于是得同步锁者成为“大哥”,其他节点只能继续做“小弟”。
防脑裂
如果同时存在两个Active NameNode,客户端可以连接任何一个,客户端发出改变文件或目录的请求时,是不会在两个NameNode间同步的,因为两个Active NameNode都不屑去读edits,那么树目录也就对不上了,这就是脑裂。
HDFS的特点
HDFS也有一些天生的缺点很难克服。一是不支持随机写,只适合一次写入多次读取的使用方式。二是不适合存储大量的小文件。 原因很简单:由于同一时刻只有一个NameNode处于Active状态,因此NameNode的内存大小决定了目录树的最大容量,也就决定了HDFS系统能为多少个文件提供目录条目,如果你向HDFS中存入很多小文件,就很容易占满NameNode的内存而空闲DataNode的大量硬盘空间。