hdfs 组件介绍:

nameNode:

集群的老大,主节点,存放元数据(Metedata)信息

处理客户端的读写请求;配置副本策略;管理HDFS的名称空间;

记录每一数据块在各个DataNode上的位置和副本信息

nameNode使用事物日志(EditsLog)记录HDFS元数据的变化信息,使用映像文件(FsImageLOg)来存储系统的命名空间,包括:文件映射、文件属性等;

通说检查点(Checkpoint)更新映像文件

hdfs 文件备份数参数 hdfs默认备份_数据

SecondarynameNode(秘书,冷备份):
nameNode的小秘书,排行老二,协助nameNode
是nameNode的备份,实质上相当于虚拟机的快照
SecondaryNameNode负责定时默认1小时,从namenode上,获取fsimage和edits来进行合并,然后再发送给namenode。减少namenode的工作量
尽量不要把SecondarynameNode和nameNode放在同一台机器上
热备份:b是a的热备份,如果a坏掉。那么b马上运行代替a的工作
冷备份:b是a的冷备份,如果a坏掉。那么b不能马上代替a工作。但是b上存储a的一些信息,减少a坏掉之后的损失。

DataNode:
Slave节点,奴隶,干活的。负责存储client发来的数据块block;执行数据块的读写操作。
一次写入,多次读取(不支持数据修改操作)
数据文件是以块存储的
数据块尽量分布在不同节点的不同DataNode上(保证读取效率的大大提升)

hdfs分布式文件系统:

hdfs 文件备份数参数 hdfs默认备份_安全模式_02

Hadoop DFS 中的两个Trtacker:

1、JobTracker 对应于 NameNode,TaskTracker 对应于 DataNode。

2、JobTracker是一个master服务,软件启动之后JobTracker接收Job,负责调度Job的每一个子任务task运行于TaskTracker上,并监控它们,如果发现有失败的task就重新运行它。一般情况应该把JobTracker部署在单独的机器上。.

HDFS什么特点?

优点
高容错性
1.上传的数据自动保存多个副本。它是通过增加副本的数量,来增加它的容错性。
2.如果某一个副本丢失,HDFS机制会复制其他机器上的复本,而我们不必关注它的实现。
适合大数据的处理
1.能够处理GB,TB,甚至PB级别的数据。
2.能够处理百万规模的数据,数量非常的大。
流式文件写入
1.一次写入,多次读取。文件一旦写入,不能修改,只能增加。
2.这样可以保证数据的一致性。
可以装在廉价的机器上
这里主要指的当然是linux啦。

劣势
低延时数据访问
1.比如毫秒级的数据存储,它是做不到的。
2.它适合高吞吐率的场景,就是在某一时间内写入大量的数据。但是它在低延时的情况下是不行的,比如毫秒级以内读取数据,这样它是很难做到的。
小文件的存储
1.存放大量小文件的话,它会占用namenode的大量的内存在存储文件、目录、块信息。这样是不可取的,因为namenode的内存总是有限的。
2.小文件存储的寻道时间会超过文件的读取时间,这违背了HDFS的设计目标。
并发写入、文件随机修改
1.一个文件只能一个线程写,不能多个线程同时写。
2.仅支持文件的追加(append),不支持文件的随机修改。

hdfs的设计目标:

1.自动快速检测应对硬件错误
2.l流式访问数据
3.移动计算比移动数据更划算
4.简单一致性模型
5.异构平台可 移植

数据损坏(corruption)处理

当DataNode读取block的时候,它会计算checksum
如果计算后的checksum,与block创建时值不一样,说明该block已经损坏。
Client读取其它DN上的block。
NameNode标记该块已经损坏,然后复制block达到预期设置的文件备份数
DataNode 在其文件创建后三周验证其checksum。

HDFS数据的Checksum

Datanode在把数据实际存储之前会验证数据的校验和.
client通过pipeline把数据写入datanode. 最后一个datanode会负责检查校验和.
当client从datanode读取数据时,也会检查校验和: 把真实数据的校和合同datanode上的校验和进行比较.
每个datanode都保存有一个checksum验证的持久化日志,日志中有当前datanode每个block最后的更新时间.
当client成功验证了一个block, 它会告诉datanode, 之后datanode会更新它的日志.
保存这些信息有助于检测坏磁盘.
除了会在client读取数据时验证block, 每个datanode还会在后台运行一个DataBlockScanner线程来周期性验证所有存储在
datanode上的block. 这用来防止物理存储媒介上出现"位衰减".
因为HDFS保存有同一个block的多个备份, 所以它可以用好的副本来替换损坏的数据副本.
如果某个client在读取数据时检测到数据错误, 在抛出ChecksumException之前, 它会向namenode上报信息告知具体
的bad block还有datanode. namenode会把指定的block标记为"corrupt", 之后的client就不会再被定位到此block,此block也不会
再被复制到其它datanode.之后namenode会调度一个此block的正常副本,以保证负载平衡.这之后,损坏的block副本会被删除.
可以在对FileSystem调用open()之前调用setVerifyChecksum()来禁止校验和检测.
也可以通过在shell中执行-get,-copyToLocal命令时指定-ignoreCrc选项做到.
LocalFileSystem在client端进行了检验和生成.如果你往hdfs写一个文件filename, 那么client会
在与filename相同的路径下透明的创建一个包含所有block校验和信息的隐藏文件.filename.crc,检验和的chunk size通过bytes.per.checksum属性来指定,
默认为512字节.chunk size也保存在.crc文件的元数据中, 所以即使bytes.per.checksum后来被改变了文件一样能被正确地解析.
当文件被读取时会进行Checksum检测,如果发生错误,LocalFileSystem会抛出一个ChecksumException.

NameNode 启动过程:

1、Name启动的时候首先将fsimage(镜像)载入内存,并执行(replay)编辑日志editlog的的各项操作;
2、一旦在内存中建立文件系统元数据映射,则创建一个新的fsimage文件(这个过程不需SecondaryNameNode) 和一个空的editlog;
3、在安全模式下,各个datanode会向namenode发送块列表的最新情况;
4、此刻namenode运行在安全模式。即NameNode的文件系统对于客服端来说是只读的。(显示目录,显示文件内容等。写、删除、重命名都会失败);
5、NameNode开始监听RPC和HTTP请求
解释RPC:RPC(Remote Procedure Call Protocol)——远程过程通过协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议;
6、系统中数据块的位置并不是由namenode维护的,而是以块列表形式存储在datanode中;
7、在系统的正常操作期间,namenode会在内存中保留所有块信息的映射信息。

Hadoop Safe Mode

1、查询当前是否安全模式
shell> hadoop dfsadmin -safemode getSafe mode is ON当然也可以通过Web UI查看
2、等待safemode关闭,以便后续操作
shell> hadoop dfsadmin -safemode wait
3、退出安全模式
shell> hadoop dfsadmin -safemode leaveSafe mode is OFF另一种方式,就是调小dfs.namenode.safemode.threshold-pct
dfs.namenode.replication.min 默认为1。
NameNode中设定所需要的数据块最低复制份数。只有大于等于这个值,才会认为块是有效的
dfs.namenode.safemode.threshold-pct 默认值 0.999f。
参数指定满足dfs.namenode.replication.min复制份数要求的Block数量的比率,超过这个比率后NameNode才能脱离安全模式。若小于0,则不需要等待DataNode的块报告就离开SafeMode,这会使得数据完整性无法保证;若大于1,则永远处于安全模式。
dfs.namenode.safemode.extension 默认30000,单位毫秒。
安全模式的延期时间,即到达dfs.namenode.safemode.threshold-pct设置的阈值后,会再等待这么长时间,可以认为是等待一个稳定的集群环境。
dfs.namenode.safemode.min.datanodes 默认0。
设置NameNode退出安全模式前确认活跃的DataNode数量。小于等于0表示不考虑活跃DataNode的影响,大于集群中DataNode总数则使得永远处于安全模式。

SafeMode 相关说明

安全模式下,集群属于只读状态。但是严格来说,只是保证HDFS元数据信息的访问,而不保证文件的访问,因为文件的组成Block信息此时NameNode还不一定已经知道了。所以只有NameNode已了解了Block信息的文件才能独到。而安全模式下任何对HDFS有更新的操作都会失败。
对于全新创建的HDFS集群,NameNode启动后不会进入安全模式,因为没有Block信息。