HDFS知识点

本文由用户“chen542734588”分享发布 更新时间:2021-03-20 11:10:36 举报文档

以下为《HDFS知识点》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

Hadoop最早起源于Nutch。Nutch是一个开源的网络搜索引擎,由Doug Cutting于2002年创建。

Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引,查询等功能,

随着网页抓取数量的增加,遇到严重的可扩展问题,即不能解决数十亿网页的存储和索引的问题,

之后,Google发布三篇论文为该问题提供了可行的解决方案。

一、HDFS特点

HDFS的优点

1、高吞吐量。大数据文件,非常适合上T级别的大文件或者一堆大数据文件的存储,如果文件只有几个G甚至更小就没啥意思了。

2、文件分块存储,HDFS会将一个完整的大文件平均分块存储到不同计算器上,它的意义在于读取文件时可以同时从多个主机取不同区块的文件,多主机读取比单主机读取效率要高得多得都。

3、简单的一致性模型,无需更改创建,写入和关闭的文件。简化了数据一致性问题并实现了高吞吐量数据访问,一次写入多次读写,一个文件存储在HDFS上后,适合一次写入,多次写出的场景once-write-read-many。因为存储在HDFS上的文件都是超大文件,当上传完这个文件到hadoop集群后,会进行文件切块,分发,复制等操作。如果文件被修改,会导致重新出发这个过程,而这个过程耗时是最长的。所以在hadoop里,不允许对上传到HDFS上文件做修改(随机写),在2.0版本时可以在后面追加数据。但不建议。

4、廉价硬件,HDFS可以应用在普通PC机上,这种机制能够让给***用几十台廉价的计算机就可以撑起一个大数据集群。

5、高容错性。硬件故障,HDFS认为所有计算机都可能会出问题,为了防止某个主机失效读取不到该主机的块文件,它将同一个文件块副本分配到其它某几个主机上,如果其中一台主机失效,可以迅速找另一块副本取文件。

HDFS缺点

1、不能做到低延迟

由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟数据访问,不适合hadoop,对于低延迟的访问需求,HBase是更好的选择,

2、不适合大量的小文件存储

由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量,根据经验,每个文件、目录和数据块的存储信息大约占150字节。因此,如果大量的小文件存储,每个小文件会占一个数据块,会使用大量的内存,有可能超过当前硬件的能力。

3、不适合多用户写入文件,修改文件

Hadoop2.0虽然支持文件的追加功能,但是还是不建议对HDFS上的 文件进行修改,因为效率低。对于上传到HDFS上的文件,不支持修改文件,HDFS适合一次写入,多次读取的场景。HDFS不支持多用户同时执行写操作,即同一时间,只能有一个用户执行写操作。

二、 HDFS体系结构

HDFS是一个主/从(Master/slave)体系结构,HDFS集群拥有一个NameNode和一些DataNode。NameNode管理文件系统的元数据,DataNode存储实际的数据。客户端通过同NameNode和DataNode的交互访问文件系统。客户端联系NameNode以获取文件的元数据,而真正的文件I/O操作是直接和DataNode进行交互的。HDFS以块的形式保存文件,默认大小是128M,三个副本。

/

/

NameNode

NameNode职责

负责客户端请求的响应

元数据的管理

元数据:如文件名,文件目录结构,文件属性(生成时间,副本数,文件权限),每个文件的块列表以及块所在的DataNode等。

元数据管理

1. Namenode始终在内存中保存metadata,用于处理“读请求” 到有“写请求”到来时,namenode会首先写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回.

2. Hadoop会维护一个fsimage文件,也就是namenode中metadata的镜像,但是fsimage不会随时与namenode内存中的metadata保持一致,而是每隔一段时间通过合并edits文件来更新内容。

fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。

edits:保存对对元数据的修改信息。

以上这些文件是保存在linux的文件系统中

在NameNode启动的时候,它会将fsimage文件中的内容加载到内存中,之后再执行edits文件中的各项操作,使得内存中的元数据和实际同步,存在内存中的元数据支持客户端的读操作。NameNode起来之后,HDFS中的更新操作会重新写到edits文件中,因为fsimage文件一般都很大,(GB级很常见),如果所有的更新操作都往fsimage文件中添加,这样会导致系统运行的十分缓慢,但是如果往edits文件里写就不会这样,每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新。如果一个文件比较大,使得写操作需要向多台机器进行操作,只有当所有的写操作都执行完成之后,写操作才会返回成功,这样的好处是任何的操作都不会因为机器的故障而导致元数据的不同步。

DataNode

DataNode是文件存储的基本单元,他将Block存储在本地文件系统中,保存了Block的meta-data,同时周期性的将所有存在的Block信息发送给NameNode。slave存储实际的数据块,执行数据块的读写。

定期向namenode汇报自身所持有的block信息(通过心跳信息上报)

datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:

timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

而默认的heartbeat.recheck.interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。

需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。所以,举个例子,如果heartbeat.recheck.interval设置为5000(毫秒),dfs.heartbeat.interval设置为3(秒,默认),则总的超时时间为40秒。

文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.

不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间

Secondary NameNode

SecondaryNameNode定期合并fsimage和edits日志,将edits日志文件大小控制在一个限度下。

每隔一段时间,会由secondary namenode将namenode上积累的所有edits和一个最新的fsimage下载到本地,并加载到内存进行merge(这个过程称为checkpoint)

checkpoint触发的条件可以在core-site.xml文件中进行配置:

fs.checkpoint.period 指定两次checkpoint的最大时间间隔,默认3600秒。

fs.checkpoint.size 规定edits文件的最大值,一旦超过这个值则强制checkpoint,不管是否到达最大时间间隔。默认大小是64M。

/

1. secondary通知namenode切换edits文件

2. secondary从namenode获得fsimage和edits(通过http)

3. secondary将fsimage载入内存,然后开始合并edits

4. secondary将新的fsimage发回给namenode

5. namenode用新的fsimage替换旧的fsimage

备注;secondary namenode和namenode的工作目录存储结构完全相同,所以,当namenode故障退出需要重新恢复时,可以从secondary namenode的工作目录中将fsimage拷贝到namenode的工作目录,以恢复namenode的元数据

副本存放策略

Hadoop集群,由于hadoop的HDFS对数据文件的分布式存放是按照分块block存储,每个block会有多个副本(默认为3),并且为了数据的安全和高效,所以hadoop默认对3个副本的存放策略为:

对于常见情况,当复制因子为3时,HDFS的放置策略是将一个副本放在本地机架中的一个节点上,另一个放在本地机架中的另一个节点上,将最后一个放在另一个机架中的另一个节点上。

此策略可以减少机架间写入流量,从而提高写入性能。

三、 Shell操作(常用操作)

ls

用法1:hadoop fs -ls /

功能:列出hdfs文件系统根目录下的目录和文件

用法2:hadoop fs -ls -R /

功能:列出hdfs文件系统所有的目录和文件

put

用法:hadoop fs -put

功能:hdfs file的父目录一定要存在,否则命令不会执行

moveFromLocal

用法:hadoop fs -moveFromLocal

功能:与put相类似,命令执行后源文件 local src 被删除

copyFromLocal

用法:hadoop fs -copyFromLocal

功能:与put相类似

get

用法:hadoop fs -get

功能:local file不能和 hdfs file名字不能相同,否则会提示文件已存在,没有重名的文件会复制到本地

moveToLocal

当前版本中还未实现此命令

copyToLocal

用法:hadoop fs -copyToLocal

功能:与get相类似

rm

用法1:hadoop fs -rm

功能:删除文件

用法2:hadoop fs -rm -r

功能:删除目录

mkdir

用法1:hadoop fs -mkdir

功能:只能一级一级的建目录,父目录不存在的话使用这个命令会报错

用法2:hadoop fs -mkdir -p

功能:所创建的目录如果父目录不存在就创建该父目录

cp

用法:hadoop fs -cp

功能:目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件还存在

mv

用法:hadoop fs -mv

功能:目标文件不能存在,否则命令不能执行,相当于给文件重命名并保存,源文件不存在

四、HDFS工作原理

RPC机制

RPC(Remote Procedure Call)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

HDFS写过程

/

图1 HDFS写过程示意图

NameNode负责管理存储在HDFS上所有文件的元数据,它会确认客户端的请求,并记录下文件的名字和存储这个文件的DataNode集合。它把该信息存储在内存中的文件分配表里。

例如,客户端发送一个请求给NameNode,说它要将“zhou.log”文件写入到HDFS。那么,其执行流程如图1所示。具体为:

第一步:客户端发消息给NameNode,说要将“zhou.log”文件写入。(如图1中的①)

第二步:NameNode发消息给客户端,叫客户端写到DataNode A、B和D,并直接联系DataNode B。(如图1中的②)

第三步:客户端发消息给DataNode B,叫它保存一份“zhou.log”文件,B并且发送一份副本给DataNode A。(如图1中的③)

第四步:DataNode A发消息给DataNode D,叫它保存一份“zhou.log”文件。(如图1中的⑤)

第五步:DataNode D发确认消息给DataNode A。(如图1中的⑤)

第六步:DataNode A发确认消息给DataNode B。(如图1中的④)

第七步:DataNode B发确认消息给客户端,表示写入完成。(如图1中的⑥)

在分布式文件系统的设计中,挑战之一是如何确保数据的一致性。对于HDFS来说,直到所有要保存数据的DataNodes确认它们都有文件的副本 时,数据才被认为写入完成。因此,数据一致性是在写的阶段完成的。一个客户端无论选择从哪个DataNode读取,都将得到相同的数据。

HDFS读过程

/

图2 HDFS读过程示意图

为了理解读的过程,可以认为一个文件是由存储在DataNode上的数据块组成的。客户端查看之前写入的内容的执行流程如图2所示,具体步骤为:

第一步:客户端询问NameNode它应该从哪里读取文件。(如图2中的①)

第二步:NameNode发送数据块的信息给客户端。(数据块信息包含了保存着文件副本的DataNode的IP地址,以及DataNode在本地硬盘查找数据块所需要的数据块ID。) (如图2中的②)

第三步:客户端检查数据块信息,联系相关的DataNode,请求数据块。(如图2中的③)

第四步:DataNode返回文件内容给客户端,然后关闭连接,完成读操作。(如图2中的④)

客户端并行从不同的DataNode中获取一个文件的数据块,然后联结这些数据块,拼成完整的文件。

HDFS读过程

/

1. 初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件

2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。

4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)

5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

8.失败的数据节点将被记录,以后不再连接。

HDFS写过程

/

1. 初始化FileSystem,客户端调用create()来创建文件

2. FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

3. FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。

4. DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

5. DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

6. 当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

7. 如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

权限

Hadoop的安全控制非常简单,只包含简单的权限,即只根据客户端用户名,决定使用权限。它的设计原则是:“避免好人做错事,但不阻止坏人做坏事”。

如果你知道某台NN的IP和端口,则可以很轻松获取HDFS目录结构,并通过修改本机机器用户名伪装成HDFS文件所属owner,对该文件进行删除操作。

安全模式

在Hadoop的实践过程中,系统启动的时候去修改和删除文件有时候会报以下错误:

org.apache.hadoop.dfs.SafeModeException: Cannotdelete/user/hadoop/input. Name node is in safe mode.从字面上来理解:“Name nodeis in safe mode.”hadoop的namenode处于安全模式。

出现上述现象由于NameNode在启动的时候首先进入安全模式。

安全模式启动过程:

启动时,NameNode进入一个名为Safemode的特殊状态。当NameNode处于Safemode状态时,不会发生数据块的复制。NameNode从DataNode接收Heartbeat和Blockreport消息。Blockreport包含DataNode托管的数据块列表。每个块都有指定的最小副本数。当使用NameNode检入该数据块的最小副本数时,会认为该块是安全复制的。在可配置百分比的安全复制数据块使用NameNode检入(再加上30秒)后,NameN 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 性的设置:

安全模式的相关属性都在文件conf/hdfs-site.xml中指定,有如下几个:

dfs.replication.min 指定数据块要达到的最小副本数,默认为1;

dfs.safemode.extension 指定系统退出安全模式时需要的延迟时间,默认为30(秒);

dfs.safemode.threshold.pct 指定退出条件,需要达到最小副本数的数据块比例

安全模式常用命令:

hadoop dfsadmin-safemode 命令:

enter - 进入安全模式

leave - 强制NameNode离开安全模式

五、Java接口及常用API

5.1新建maven工程,导入依赖

org.apache.hadoop

hadoop-client

2.7.1

5.2常用API

/

/

/

/

/

/

/

/

/

/

/

/

/

[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。

  1. 存储基础知识白皮书
  2. 测井数据读取实验实践报告
  3. 学习资料:数据中台的云原生机会
  4. 大学计算机实验报告-EXCEL电子表格实验
  5. _2018年度IDC分类排行榜
  6. 下半年 软件设计师 详细答案
  7. 北师大小学数学4上教案
  8. ISO20000体系文件清单
  9. 企业大数据战略指南
  10. 学校办学条件规范与管理
  11. 2018⼼心理理咨询⾏行行业⼈人群洞洞察报告
  12. 箩筐***介绍01.09
  13. Excel实验说明
  14. 火电企业档案分类表(6-9大类)
  15. 《数据的分析》单元测试3-学生用卷
  16. 高丽平EXCEL教学设计方案
  17. 表格数据的图形化教学设计
  18. 崔广学表格图形化ppt
  19. 管理驾驶舱解决方案-商业银行版
  20. 年报填报员和审核员操作手册

以上为《HDFS知识点》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览