【HDFS】HADOOP DISTRIBUTED FILE SYSTEM

2019-03-28 13:30|来源: 网络

【HDFS】Hadoop DISTRIBUTED FILE SYSTEM

THE CAST
CLIENT:人们都坐在客户端前,向客户端输入/输出数据
NAMENODE:服务端只有一个,负责协调HDFS存储系统,例如数据分配情况,备份策略,故障诊断等
DATANODE:用于存储数据的集合,结构为一个cluster包含诺干个racks,一个racks包含诺干个datanode,datanode也就相当于我们磁盘,而racks相当于磁盘阵列
 
HDFS系统write操作
一个人对client说:请帮我写入200M数据好吗?
Client speak:我很荣幸,但你没有忘记什么嘛?
一个人说:a划分块大小128M(用于存放数据) b复制一个块到三个地方
Client speak:一个合格的client要知道2件事
(1)块大小:一个大文件存储在若干个块中,每个块通常64M or 128 M
(2)多路复用:一个块要保存到多个地方,通常为3
 
uClient ask Namenode
第一步 client划分一个大文件的块大小,用于存储文件内容
第二步 client对Namenode说请帮助我分配一个128M的块(datanode上)并多路复用到3个地方
 
unamenode分配datanode
第一步 Namenode需要找到3个datanode
第二步 Namenode整理一下3个datanode地址,发送给client
 
uClient开始写数据
第一步  Client发送数据只到第一个datanode节点,当第一个datanode节点接收到数据的同时会同步到第二个datanode节点,第二个也会同步到第三个节点,以此类推直到最后一个节点为止
第二步  一旦所有的数据都写入磁盘后,所有的datanode就向Namenode发送完成信号
第三步  Namenode就会显示块已保存,并且已经复用
第四步  Client会用同样的步骤完成后续数据写入
 
u当写完所有块后
第一步  当写完所有块后,Client就会关闭文件,并告之Namenode停止传输
第二步  Namenode此时就会知道所有的数据信息都保存在磁盘中
 
uRecap重述
Client         用于划分保存文件的块
Namenode 用于提供保存块的datanode节点信息,包括所有的多路复用节点
Datanode  用于保存数据
 
HDFS 集群read操作
一个人对client说:请帮我读取相关文件
Client speak:Roger好的知道了!
 
u交互Namenode
Client -> Namenode:请给我关于这个文件的信息(传输filename到Namenode)
Namenode –> Client:回复存储这个文件所有的块信息给Client,按datanode到Client的距离进行排序,实际上就是知道块存储在哪个datanode上,先从最近的节点读取数据
例 Block1:at DN x1 y1 z1
   Block2:at DN x2 y2 z2
   Block3:at DN x3 y3 z3
Client:a.知道有多少个块(关于这个文件)需要下载
      b.还知道每个块保存在哪些datanode上
因此Client会依次下载这些块到本地
 
u数据下载流程
Client:先从最近的datanode节点下载数据,它要跟datanode作一个交互,申请获取相关块信息,datanode返回块数据
 
可能你会问到,如果datanode硬件损坏啦,没有相关数据啦,数据本身造破坏不能恢复啦,这些不幸的事情时我们有没有好的办法呢,呵呵木要担心下面我们就会讲到故障容错的理念
 
HDFS故障容错第一部分故障类型与检测
1.三种典型故障
1)node failure节点故障(namenode服务器  datanode数据节点)节点硬件故障
2)communication failure通信故障
不能发送和接收数据,有可能datanode脱离了网络,找不到大家了
3)data corruption数据损坏,两种可能
当数据传输到网络中时损坏
当在磁盘存储时数据损坏
 
2.检测节点故障
1)如果Namenode服务器不可用了,那么整个分布式集群也就不可用了,namenode是单点故障
2)相对于Namenode服务器我们更专注于检测datanode数据节点
3)那么我们如何检测呢?方法如下
Datanode每三秒发送心跳给namedata,说明我们还存活着。如果在10分钟之内namenode还没有获取到心跳消息,就认为datanode不可用了。但有可能datanode还活着,只是网络故障造成的,但namenode还是认为datanode不可用。
 
3.检测网络故障
1)Client每当向datanode写数据时,datanode都会给一个确认ACK信号,表示接收无误
2)Client没有收到ACK信号,就假设datanode或网络故障
 
4.检测数据损坏故障
1)Client给datanode传输信息时,信息包括2部分,checksum校验和、真实数据
2)Datanode即存储数据也存储校验和 【Linux公社 http://www.linuxidc.com 】
检测损坏硬盘,由datanode定期发送块报告给namenode,这个块报告列出了所有的块信息。
注释:Datanode先检查checksum校验和是ok的,才发送块报告,因为块报告不包括坏块信息
举例:Datanode发送块报告时不包括坏块信息(假如发送4个块),Namenode在和原来“校验和”对比后认为原来应该有5个块,那么说明有一个块损坏了
 
5.重述心跳信息和块报告
1)Datanode每3秒钟向Namenode发送心跳信息,表示我还活着
2)datanode在发送块报告的时候会自动跳过坏块信息,只发送好块信息
3)namenode在接收到块报告后与原来的校验和进行对比,总块数-好块数=坏块数
 
HDFS故障容错第二部分处理读写故障
1.处理写错误
1)我们写入块的最小数据单位是包(通常64K),记住多路复用流水线
注意:此外datanode要给client端发送接收到包的ACK确认信息,以便确认datanode完全接收到了数据包。
2)如果client端从一些datanode节点上不能获得ACK确认信息,就认为这些datanode已不可用,因此client需要调整多路复用流水线,以跳过这个损坏的datanode节点,但不会影响其他的正常的datanode。
3)在调整多路复用之后namenode将会查看损坏的datanode
 
2.处理读错误
1)当client端询问一个块位置时,namenode将返回client端所有的datanode节点地址。
2)如果client发现一个datanode不可用了,将会从其他的datanode处获取数据
 
HDFS故障容错第三部分处理数据节点故障
1.首先,Namenode保存了2个重要的表
1)块信息表,包含块保存在哪些datanode节点上
2)节点信息表,包含datanode节点保存哪些块
2.再次,Namenode不间断更新这2个表
1)如果namenode在datanode上发现一个坏块,就会更新块信息表,在表里标识坏块在哪个datanode上
2)如果namenode发现datanode节点不可用了,就会更新2个表(块信息表,节点信息表),在2个表中同时标识不可用datanode节点信息

相关问答

更多

是否可以在没有HDFS的情况下以伪分布式操作运行Hadoop?(Is it possible to run Hadoop in Pseudo-Distributed operation without HDFS?)

是的,这是可能的,虽然我使用0.19.2。 我对0.18.3不太熟悉,但我确信它不应该有所作为。 只要确保将fs.default.name设置为默认值(这是file:/// ),并将mapred.job.tracker设置为指向托管jobtracker的位置。 然后使用bin / start-mapred.sh启动守护进程。 您不需要启动namenode或datanode。 在这一点上,你应该能够使用bin/hadoop jar ...来运行你的map / reduce作业bin/hadoop j ...

hadoop错误:util.NativeCodeLoader(hdfs dfs -ls不起作用!)(hadoop error: util.NativeCodeLoader (hdfs dfs -ls does not work!))

从这个错误: hdfs dfs -ls 16/09/27 09:43:42 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable ls: `.': No such file or directory 忽略有关本机库的警告 - 即使使用该警告,该命令也应该正常工作。 当你运行没有路径的hd ...

Hadoop:从HDFS映射/减少(Hadoop: map/reduce from HDFS)

JobConf conf = new JobConf(getConf(), ...); ... FileInputFormat.setInputPaths(conf, new Path("stored.xls")) ... JobClient.runJob(conf); ... setInputPaths将做到这一点。 JobConf conf = new JobConf(getConf(), ...); ... FileInputFormat.setInputPaths(conf, new P ...

无法从hadoop hdfs检索文件(Can't retrieve files from hadoop hdfs)

使用HDFS配置参数添加XML文件: Configuration conf = new Configuration(); conf.addResource(new Path("your_hadoop_path/conf/core-site.xml")); conf.addResource(new Path("your_hadoop_path/conf/hdfs-site.xml")); FileSystem fs = FileSystem.get(URI.create(uri),conf); A ...

hadoop - HDFS文件分发(hadoop - HDFS file distribution)

如何查看或查询元数据? 您可以在Offline Image Viewer的帮助下完成此操作。 它是一种将fsimage文件的内容转储为人类可读格式的工具,以便允许离线分析和检查Hadoop集群的命名空间。 用法: bin / hdfs oiv -i fsimage -o fsimage.txt 你可以在这里找到更多相关信息 。 我怎么看 - 我的输入文件是如何被阻止和分发的? 最简单的方法是将您的Web浏览器指向HDFS webUI ,即namemnode_machine:50070 。 然后浏览 ...

HDFS与LFS - Hadoop如何区分。(HDFS vs LFS - How Hadoop Dist. File System is built over local file system?)

好的..我试一试。当你配置Hadoop时,它会在本地FS上放置一个虚拟FS,即HDFS。 HDFS以复制的方式将数据存储为块(类似于本地FS,但与之相比要大得多)。 但是HDFS目录树或文件系统命名空间与本地FS的命名空间相同。 当您开始将数据写入HDFS时,它最终会被写入本地FS,但您无法直接在那里看到它。 临时目录实际上有3个用途: 1- namenode存储其元数据的目录,默认值为${hadoop.tmp.dir}/dfs/name ,可由dfs.name.dir明确指定。 如果指定dfs. ...

Hadoop(HDFS) - 文件版本控制(Hadoop (HDFS) - file versioning)

HDFS无法进行版本控制。 相反,您可以使用Amazon S3 ,它提供版本控制并且还与Hadoop 兼容 。 Versioning is not possible with HDFS. Instead you can use Amazon S3, which provides Versioning and is also compatible with Hadoop.

Hadoop的HDFS与Spark(Hadoop's HDFS with Spark)

Apache Spark独立于Hadoop。 Spark允许您使用不同的数据源(包括HDFS),并且能够在独立群集中运行,或者使用现有的资源管理框架(例如,YARN,Mesos)。 因此,如果您只对Spark感兴趣,则无需安装Hadoop。 Apache Spark is independent from Hadoop. Spark allows you to use different sources of data (incl. HDFS) and is capable of running ...

有可能只安装Hadoop HDFS吗?(It's possible only install Hadoop HDFS?)

绝对可能。 不要认为Hadoop是一个可安装的程序,它只是由一群在集群内不同节点上运行的java进程组成。 如果你使用hadoop tar ball,你可以只运行NameNode和DataNodes进程,如果你只想要HDFS。 如果您使用其他hadoop发行版(例如HDP),我认为HDFS和mapreduce来自不同的rpm软件包,但安装两个rpm软件包都有害。 如果您只需要HDFS,请再次运行NameNode和DataNodes。 Absolutely possible. Don't think ...

Hadoop HDFS依赖(Hadoop HDFS dependency)

Mappers从InputFormat的实现中读取输入数据。 大多数实现都来自FileInputFormat ,后者从本地计算机或HDFS读取数据。 (默认情况下,数据从HDFS读取,mapreduce作业的结果也存储在HDFS中。)当您希望从备用数据源读取数据而不是HDFS时,可以编写自定义InputFormat 。 TableInputFormat将直接从HBase读取数据记录, DBInputFormat将访问关系数据库中的数据。 您还可以想象一个系统,在特定端口上通过网络将数据流式传输到每 ...