赞
踩
自给定义:短时间快速产生大量多种多样的有价值的信息
如今数据越来越多,为了解决数据量过大的问题,垂直扩展机制,和横向扩展机制相继进入视线,
垂直扩展指的是再一台服务器上尽可能的扩大内存,而横向扩展指的是将许多个计算机联系起来,例如下图:
讲完这些,就不得不说一说hadoop生态圈和spark生态圈了,
hadoop包括以下模块
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进行汇报
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。