大数据学习笔记(三)

1.HDFS架构


一个HDFS 文件系统包括一个主控节点NameNode 和一组DataNode 从节点。

NameNode是一个主服务器,用来管理整个文件系统的命名空间和元数据,以及处理来自外界的文件访问请求。NameNode 保存了文件系统的三种元数据: 
1) 命名空间, 即整个分布式文件系统的目录结构; 
2 ) 数据块与文件名的映射表; 
3) 每个数据块副本的位置信息,每一个数据块默认有3 个副本

DataNode 用来实际存储和管理文件的数据块
文件中的每个数据块默认的大小为64MB; 同时为了防止数据丢失, 每个数据块默认有3 个副本,且3 个副本会分别复制在不同的节点上,以避免一个节点失效造成一个数据块的彻底丢失。
每个DataNode 的数据实际上是存储在每个节点的本地Linux 文件系统中。

NameNode 上可以执行文件操作,比如打开、关闭、重命名等; 而且NameNode 也负责向DataNode分配数据块并建立数据块和DataNode 的对应关系。
DataNode 负责处理文件系统用户具体的数据读写请求,同时也可以处理NameNode 对数据块的创建、删除副本的指令。
典型的部署模式采用NameNode单独运行于一台服务器节点上,其余的服务器节点,每一台运行一个DataNode。

二、数据块

在传统的块存储介质中,块是读写的最小数据单位 (扇区)
传统文件系统基于存储块进行操作
为了节省文件分配表空间,会对物理存进行储块整般合,一般大小为4096字节
HDFS也使用了块的概念,但是默认大小设为64M字节
可针对每个文件配置,由客户端指定
每个块有一个自己的全局ID
HDFS将一个文件分为一个或数个块来存储
每个块是一个独立的存储单位
以块为单位在集群服务器上分配存储
与传统文件系统不同的是,如果实际数据没有达到块大小,则并不实际占用磁盘空间
如果一个文件是200M,则它会被分为4个块: 64+64+64+8

使用块的好处:

当一个文件大于集群中任意一个磁盘的时候,文件系统可以充分利用集群中所有的磁盘
管理块使底层的存储子系统相对简单
块更加适合备份,从而为容错和高可用性的实现带来方便
最重要的是,采用块方式,实现了名字与位置的分离,实现了的存储位置的独立性

块的冗余备份:

每个块在集群上会存储多份(replica)
-默认复制份数为3
-可针对每个文件配置,由用户指定
-可动态修改
某个块的所有备份都是同一个ID
-系统无需记录 “哪些块其实是同一份数据”

系统可以根据机架的配置自动分配备份位置
-第一份在集群的某个机架的某台机器上
-其他两份在另外的一个机架的两台机器上
此策略是性能与冗余性的平衡
-机架信息需要手工配置

三、元数据

元数据包括
-文件系统目录树信息
 --文件名,目录名
 --文件和目录的从属关系
 --文件和目录的大小,创建及最后访问时间
 --权限
-文件和块的对应关系
 --文件由哪些块组成
-块的存放位置
 --机器名,块ID

HDFS对元数据和实际数据采取分别存储的方法
-元数据存储在一台指定的服务器上(NameNode)
-实际数据储存在集群的其他机器的本地文件系统中(DataNode)

四、读写策略

     数据读取:


1.客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream
2.通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。
3.获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。
4.如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。
5.到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。
6.不断执行第2 - 5 步直到数据全部读完
7.客户端调用close ,关闭输入流DF S InputStream


数据写入:


1.客户端调用Fi leSystem 实例的create 方法,创建文件。NameNode 通过一些检查,比如文件是否存在,客户端是否拥有创建权限等;通过检查之后,在NameNode 添加文件信息。注意,因为此时文件没有数据,所以NameNode 上也没有文件数据块的信息。
2.创建结束之后, HDFS 会返回一个输出流DFSDataOutputStream 给客户端。
3.客户端调用输出流DFSDataOutputStream 的write 方法向HDFS 中对应的文件写入数据。
4.数据首先会被分包,这些分包会写人一个输出流的内部队列Data 队列中,接收完数据分包,输出流DFSDataOutputStream 会向NameNode 申请保存文件和副本数据块的若干个DataNode , 这若干个DataNode 会形成一个数据传输管道。DFSDataOutputStream 将数据传输给距离上最短的DataNode ,这个DataNode 接收到数据包之后会传给下一个DataNode 。数据在各DataNode之间通过管道流动,而不是全部由输出流分发,以减少传输开销。

5.因为各DataNode 位于不同机器上,数据需要通过网络发送,所以,为了保证所有DataNode 的数据都是准确的,接收到数据的DataNode 要向发送者发送确认包(ACK Packet ) 。对于某个数据块,只有当DFSDataOutputStream 收到了所有DataNode 的正确ACK. 才能确认传输结束。DFSDataOutputStream 内部专门维护了一个等待ACK 队列,这一队列保存已经进入管道传输数据、但是并未被完全确认的数据包。

6.不断执行第3 - 5 步直到数据全部写完,客户端调用close 关闭文件。
7.DFSDataInputStream 继续等待直到所有数据写人完毕并被确认,调用complete 方法通知NameNode 文件写入完成。NameNode 接收到complete 消息之后,等待相应数量的副本写入完毕后,告知客户端。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一部分 Spark学习 ....................................................................................................................... 6 第1章 Spark介绍 ................................................................................................................... 7 1.1 Spark简介与发展 ...................................................................................................... 7 1.2 Spark特点 .................................................................................................................. 7 1.3 Spark与Hadoop集成 ................................................................................................ 7 1.4 Spark组件 .................................................................................................................. 8 第2章 Spark弹性分布数据集 ............................................................................................... 9 2.1 弹性分布式数据集 .................................................................................................... 9 2.2 MapReduce数据分享效率低..................................................................................... 9 2.3 MapReduce进行迭代操作 ........................................................................................ 9 2.4 MapReduce进行交互操作 ...................................................................................... 10 2.5 Spark RDD数据分享 ............................................................................................... 10 2.6 Spark RDD 迭代操作 .............................................................................................. 10 2.7 Spark RDD交互操作 ............................................................................................... 10 第3章 Spark安装 ................................................................................................................. 11 第4章 Spark CORE编程 ....................................................................................................... 13 4.1 Spark Shell ........................................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值