【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节点信息

相关问答

更多
  • 是的,这是可能的,虽然我使用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 jar .. ...
  • 从这个错误: 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 忽略有关本机库的警告 - 即使使用该警告,该命令也应该正常工作。 当你运行没有路径的hdfs df ...
  • 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 Path(" ...
  • 使用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); Add th ...
  • 如何查看或查询元数据? 您可以在Offline Image Viewer的帮助下完成此操作。 它是一种将fsimage文件的内容转储为人类可读格式的工具,以便允许离线分析和检查Hadoop集群的命名空间。 用法: bin / hdfs oiv -i fsimage -o fsimage.txt 你可以在这里找到更多相关信息 。 我怎么看 - 我的输入文件是如何被阻止和分发的? 最简单的方法是将您的Web浏览器指向HDFS webUI ,即namemnode_machine:50070 。 然后浏览到相关文件 ...
  • 好的..我试一试。当你配置Hadoop时,它会在本地FS上放置一个虚拟FS,即HDFS。 HDFS以复制的方式将数据存储为块(类似于本地FS,但与之相比要大得多)。 但是HDFS目录树或文件系统命名空间与本地FS的命名空间相同。 当您开始将数据写入HDFS时,它最终会被写入本地FS,但您无法直接在那里看到它。 临时目录实际上有3个用途: 1- namenode存储其元数据的目录,默认值为${hadoop.tmp.dir}/dfs/name ,可由dfs.name.dir明确指定。 如果指定dfs.name. ...
  • 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.
  • 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 eithe ...
  • 绝对可能。 不要认为Hadoop是一个可安装的程序,它只是由一群在集群内不同节点上运行的java进程组成。 如果你使用hadoop tar ball,你可以只运行NameNode和DataNodes进程,如果你只想要HDFS。 如果您使用其他hadoop发行版(例如HDP),我认为HDFS和mapreduce来自不同的rpm软件包,但安装两个rpm软件包都有害。 如果您只需要HDFS,请再次运行NameNode和DataNodes。 Absolutely possible. Don't think Hado ...
  • Mappers从InputFormat的实现中读取输入数据。 大多数实现都来自FileInputFormat ,后者从本地计算机或HDFS读取数据。 (默认情况下,数据从HDFS读取,mapreduce作业的结果也存储在HDFS中。)当您希望从备用数据源读取数据而不是HDFS时,可以编写自定义InputFormat 。 TableInputFormat将直接从HBase读取数据记录, DBInputFormat将访问关系数据库中的数据。 您还可以想象一个系统,在特定端口上通过网络将数据流式传输到每台计算机; ...