《从0开始学习大数据》笔记
1. 移动计算
(1)移动计算 --- 大规模数据的计算处理问题
传统软件计算处理模型为:输入 --- 计算 --- 输出
但这种方法不能满足大数据时代的计算要求(PB级数据计算)
解决PB级数据计算的解决方法遵循了“分布式架构思路” :采用分布式集群的解决方案,用数千台或上万台计算机构建大数据计算处理集群,利用更多的带宽、内存空间、磁盘容量、CPU核心数去计算处理。
大数据计算处理通常针对于网站的存量数据,即为全部用户在一段时间内请求产生的数据。这种问题的解决方案即为“移动计算”
移动计算:将程序分发到数据所在地进行计算,而不用将所有数据输入到程序 ,且移动计算比移动数据更划算
移动计算的实现方法:
2. 水平伸缩&垂直伸缩 --- 大规模数据的存储问题
(1)核心问题:
i. 数据存储容量问题
ii. 数据读写速度问题
iii. 数据可靠性问题
(2)单机时代的解决方案: RAID --- 独立磁盘冗余阵列 --- 将多块普通磁盘组成阵列,共同对外提供服务
i. 数据存储容量问题: RAID用N块磁盘构成存储阵列,RAID5中,数据可存储在N-1块磁盘中,存储空间则扩大了N-1倍
ii. 数据读写速度问题:RAID根据使用的磁盘数量,将待写入数据分为多片,并发进行写入和读取。但寻址时间并未得到提升,因为寻址时间是延迟的主要原因
iii. 数据可靠性问题: 由于数据有冗余存储或存储校验信息,故可通过其他磁盘上的数据和校验数据将丢失的数据进行还原
(3)水平伸缩与垂直伸缩:
a. 水平伸缩 --- 采用分布式系统 --- 无限 --- RAID HDFS
b. 垂直伸缩 --- 升级计算机 --- 有限
3. HDFS --- Hadoop分布式文件系统
(1)根据RAID的原理,设计HDFS:在一个大规模分布式服务器集群上,及群众所有服务器磁盘供HDFS使用,是的整个HDFS的存储空间可达PB级
(2)HDFS关键组件:
a. DataNode:负责文件的存储和读写操作。HDFS将文件分割为多个block,每个DataNode存储一部分block,是的文件分布存储在整个HDFS服务器集群中。client可以并行对这些block进行访问,从而可以在服务器集群规模上实现数据并行访问,提高访问速度。
b. NameNode:负责整个分布式文件系统的元数据管理(文件路径名、数据块ID、存储位置信息等)。
注:为保证数据的高可用,会将数据块复制为多份(Default:3份),并将多份相同数据块存储在不同的服务器上,甚至不同的机架上。当出现磁盘损坏、服务器宕机等故障时,客户端会查询备份数据块进行访问。
(3)架构图:
(4)HDFS高可用设计:
a. 数据存储故障容错 --- 对于存储在DataNode上的数据块,计算并存储校验和(checkSum),在读取数据的时候,重新计算读取出来的数据的校验和,如果不正确则抛出异常,捕捉到异常后则到其他DataNode上读取备份数据。
b. 磁盘故障容错 --- 如果DataNode检测到本机某块磁盘损坏,则将该磁盘上的blockID报告给NameNode,NameNode检查哪里有备份,然后通知相应的DataNode将对应的数据块复制到其他server上,以保证数据块的被分数满足要求。
c. DataNode 故障容错 --- DataNode利用心跳机制和NameNode保持通信。若DataNode超时未发送心跳,则NameNode认为该DataNode宕机失效,并立即查找该DataNode上的数据块的信息,通知其余有这些数据块的服务器再复制一份数据块到其他服务器,保证HDFS存储的数据块被分数符合用户设置的数目,即使再出现服务器宕机,也不会丢失数据。
d. NameNode 故障容错 --- 采用主从热备的方式提供高可用服务。
常用三种策略:
i. 冗余备份(程序至少部署到两台服务器,实现异地多活)
ii. 失效转移(将访问请求转移到备份程序或服务器上,但需注意失效鉴定)
iii. 限流降级(计算资源有限,无法处理大量请求时,拒绝部分请求,关闭部分功能)
4. MapReduce --- 编程模型 + 计算框架
MapReduce编程模型:
eg: 统计词频的MapReduce:
(1)map:将一行文本的单词提取出来,针对每个单词输出一个<word, 1>
(2)合并:将相同word放在一起,形成:<word, <1,1,1,1,1>>
(3)reduce:将集合中的1求和,再讲word和sum组成一个<key, value>对,从而获得词频总和 ----> <word, sum>
MapReduce计算框架:
为使上述的编程模型在分布式环境中运行,并处理大规模数据,则需一个计算框架可调度执行MapReduce程序,该计算框架也成为MapReduce
(1)两个关键问题:
a. 如何为每个数据块分配一个Map计算任务
b. 如何将处于不同服务器的<key, value>中的相同的key聚合在一起发送给reduce处理
(2)MapReduce的作业启动和运行机制
a. 大数据应用进程:
i. MapReduce的启动入口,由用户启动
ii. 制定Map和reduce类、输入输出文件路径等,提交作业给Hadoop集群的JobTracker进程
b. JobTracker进程:
i. 根据要处理的数据的输入量,命令TaskTracker启动相应数量的map和reduce进程任务
ii. 管理整个作业生命周期的任务调度和监控
iii. Hadoop集群的常驻进程,全局只有一个
c. TaskTracker进程:
i. 负责启动和管理Map进程和Reduce进程
ii. 通常和HDFS的DataNode进程启动在同一个服务器。集群中大多数服务器同时运行DataNode和TaskTracker进程。
总结:MapReduce的主服务器是JobTracker,从服务器为TaskTracker。
(HDFS主服务器是NameNode,从服务器是DataNode)
架构模式:可重复使用的架构方案。一主多从是大数据领域的最主要的架构模式。主服务器仅一台,掌控全局;从服务器多台,负责具体任务。
MapReduce计算过程:
上述整个过程在程序中,仅需要编写map和reduce函数即可,而不用关心如何分布到集群等问题,因为底层问题皆由MapReduce计算框架完成。
MapReduce数据合并与连接机制 ---- shuffle
分布式计算需要将不同服务器上的相关数据合并到一起进行下一步计算
每个Map任务计算结果写入本地文件系统,map任务快计算完成的时候,MapReduce计算框架会启动shuffle进程,在map任务进程调用一个partitioner接口,对map产生的每个<key, value>进行reduce分区选择,然后发给对应的reduce进程。
所以,不管map在哪个服务器节点,相同的key一定会发送给相同的reduce进程,组合成<key, value集合>给reduce执行。
MapReduce框架默认的Partitioner用key的哈希值对reduce任务数量取模,相同的key一定会落在相同的reduce任务ID上。
5. YARN --- 分布式集群资源调度框架 --- Yet Another Resource Negotiation
(1)资源管理器 Resource Manager:负责整个集群的资源调度管理
i. 调度器:资源分配算法。根据client提交的资源申请和当前服务器集群的资源状况进行资源分配
ii. 应用程序管理器:负责应用程序的提交、监控应用程序运行状态
(2)节点管理器 Node Manager:负责具体服务器上的资源和任务管理,在集群每一台计算服务器上启动,基本上同HDFS的DataNode一起出现
YARN和MapReduce是框架,但是HDFS不是框架,仅为系统。
因为YARN和MapReduce遵循依赖倒转原则。
依赖倒转原则:
高层模块不能依赖底层模块,他们应该共同依赖一个抽象,这个抽象由高层模块定义,由底层模块实现
1)只要实现了MapReduce的编程接口,并遵循MapReduce编程规范,就可以被MapReduce框架调用,在分布式集群中计算大规模数据
2)只要实现yarn的接口规范,就可以被yarn调度管理,统一安排服务器资源
3)HDFS的使用时直接调用HDFS提供的api接口,HDFS作为底层模块被直接依赖