自给定义:短时间快速产生大量多种多样的有价值的信息
如今数据越来越多,为了解决数据量过大的问题,垂直扩展机制,和横向扩展机制相继进入视线,
垂直扩展指的是再一台服务器上尽可能的扩大内存,而横向扩展指的是将许多个计算机联系起来,例如下图:
讲完这些,就不得不说一说hadoop生态圈和spark生态圈了,
hadoop包括以下模块
- Hadoop Common:支持其他Hadoop模块的常用实用程序。
- Hadoop分布式文件系统(HDFS™):一种分布式文件系统,可提供对应用程序数据的高吞吐量访问。
- Hadoop YARN:作业调度和集群资源管理的框架。
- Hadoop MapReduce:基于YARN的系统,用于并行处理大型数据集。
spark包括
- spark core
- sparkSQL 可以使用sql处理
- sparkStreaming----流式处理
- mllib -------机器学习库
- graphx------spark停止维护
hadoop的特点是一次写入多次读取
hadoop使用的HDFS分布式文件系统是通过主从架构进行数据的读写与保存,备份,下面为HDFS的详解
-
Block数据块;
-
1)基本存储单位,一般大小为64M(1.x,2.x128M)减少搜寻时间,一般硬盘传输速率比寻道时间要快,大的块可以减少寻道时间;2)减少管理块的数据开销,每个块都需要在NameNode上有对应的记录;3)对数据块进行读写,减少建立网络的连接成本)
-
一个大文件会被拆分成一个个的块,然后存储于不同的机器。如果一个文件少于Block大小,那么实际占用的空间为其文件的大小
-
基本的读写单位,类似于磁盘的页,每次都是读写一个块
- 每个块都会被复制到多台机器,默认复制3份
-
-
NameNode
-
存储文件的metadata,运行时所有数据都保存到内存,整个HDFS可存储的文件数受限于NameNode的内存大小
-
一个Block在NameNode中对应一条记录,如果是大量的小文件,会消耗大量内存。同时map task的数量是由splits来决定的,所以用MapReduce处理大量的小文件时,就会产生过多的map task,线程管理开销将会增加作业时间。处理大量小文件的速度远远小于处理同等大小的大文件的速度。因此Hadoop建议存储大文件
-
数据会定时保存到本地磁盘,但不保存block的位置信息,而是由DataNode注册时上报和运行时维护(NameNode中与DataNode相关的信息并不保存到NameNode的文件系统中,而是NameNode每次重启后,动态重建)
- NameNode失效则整个HDFS都失效了,所以要保证NameNode的可用性
-
-
DataNode
-
保存具体的block数据
-
负责数据的读写操作和复制操作
-
DataNode启动时会向NameNode报告当前存储的数据块信息,后续也会定时报告修改信息
- DataNode之间会进行通信,复制数据块,保证数据的冗余性
-
如果上面对于HDFS理解比较困难的话,下面两幅图可以帮助初学者建立一个很好的思维基础,从而更好的理解HDFS的运行机制
就如上图所表达的一样,NN如老板一般,他负责管理元数据,管理员工DN,和掌控全局,接受Client的请求,保持与DN之间的通信,而DN为员工,其作用为存储数据,实时向NN发送节点的状态,接受Client的指派。
当一个大文件进行 写操作 的时候,Client会将大文件进行切块,文件的默认大小为/128/m=block块,并且向NN进行汇报(块数,文件大小,文件的权限,文件的属主,文件的上传时间),当切块完成后,Client会去向NN申请资源,NN返回给Client一些负载量不高的DN的信息,这时候,Client会向DN里面发送block并且做好信息的备份,一般情况下,信息会被复制成三份,进行存储,最后,当DN信息接收完成之后,会向NN汇报信息的接收情况。详细分点如下图:
进行 读请求 的时候,
- NN会向Client发送一个请求,Client接收到请求之后,会向NN去申请节点信息,(blockid:指的是offset偏移量,在数据进行切块的时候会给数据块编号,blockid就是每个数据块的编号)。
- 之后,NN会向Client发送所读取的节点的信息,
- Client获取到节点的信息之后会去相应的DN上拿取数据,但其整个过程中遵循了一个就近原则,靠近NN的DN的信息优先读取
最后,详细说一下备份操作的机制
- 集群内提交,再提交的节点上放置block 集群外提交,选择一个负载不高的节点进行存储
- 放置在与第一个备份不同机架的任意节点上
- 放置在第二个机架的不同的节点上
按照存储的思路来讲,肯定是Client发送三次数据进行存储,那么这个时候就显得特别浪费资源了,如何解决这个问题呢,我们使用了一个管道叫做 pipeline管道,其具体流程请参照:
- NN在返回给Client一些DN的信息之后,
- Client会和这些DN形成一个管道,并且将block切割成一个个ackPackage(64k)的数据块
- DN会从管道中拿取相应的数据进行存储,
- 当存储完成之后,DN会向NN进行汇报