博主自主知识产权《springboot深入浅出系列课程》(16章97节文档) 已经上线,请关注

HDFS简介

HDFS 字母哥 0评论

HDFS(Hadoop Distributed FileSystem)hadoop 分布式文件系统

把数据文件分布到不同的节点上的目的是什么?在不同的节点上分布式计算,计算靠近数据的原则。

Hadoop集群硬件部署结构:


* Rack为机架,Switch为交换机(千兆,百兆)
* 浅黄色服务器为Master节点(雇主,负责统一管理)
* 灰蓝色服务器为Slave节点(奴隶,负责具体任务)

HDFS数据存储集群模型

  • 一个HDFS集群是由一个Namenode和一定数目的Datanodes组成。(在hadoop2.0中解决了单点问题)
  • Namenode:负责管理文件系统的名字空间,记录数据块的位置和副本信息。统一调度datanode进行数据块的创建、删除和复制。
  • Datanode:一般是一个节点一个,负责管理它所在节点上的存储。负责处理文件系统具体的读写工作。
  • SecondaryNameNode:
  1. conf/masters文件指定的为Secondary NameNode节点主机名
  2. 监控HDFS的辅助后台进程,一个集群只有一个,
  3. 与NameNode通讯,保存HDFS元数据快照
  4. 当NameNode故障,可以做为备用NameNode使用(必须人为手工接入,无法自动切换,hadoop2.0解决)

注:masters文件用于指定secondary的主机而不是namenode。slaves文件用于指定datanode和tasktracker,
namenode由core-site.xml fs.default.name指定,jobtracker由mapred-site.xml mapred.job.tracker指定

HDFS冗余机制


* HDFS提供分布式的存储机制,一个文件分成很多的数据块,很多的数据块有分布在不同的节点上
* HDFS认为硬件错误是常态,因此提供自动数据冗余,一个数据块可以有多个副本(可配置副本系数)。当一个副本所在节点硬件错误,可自动使用其他副本数据块。

  • conf/ hdfs-site.xml里面配置副本系数
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
  • 在大多数情况下,副本系数是3.
    HDFS的存放数据块策略是将一个副本存放在本地机架的节点上,一个副本放在同一机架的另一个节点上,最后一个副本放在不同机架的节点上。为了降低整体的带宽消耗和读取延时,HDFS会尽量让读取程序读取离它最近的副本

机架感知策略

  • 可以降低网络传输次数,提高效率
  • 只需修改namenode和jobtracker节点的配置即可,打开conf/core-site.xml里面设置
    <property>
        <name>topology.script.file.name</name>
        <value>/opt/modules/hadoop/hadoop-1.0.3/bin/RackAware.py</value>
     <!--机架感知脚本路径-->
    </property>
    <property>
        <name>topology.script.number.args</name>
        <value>20</value>
     <!--机架服务器数量,由于我写了20个,所以这里写20-->
    </property>
  • 机架感知脚本内容
#!/usr/bin/python
#-*-coding:UTF-8 -*-
import sys

rack = {"hadoop-node-31":"rack1",
        "hadoop-node-32":"rack1",
        "hadoop-node-33":"rack1",
        "hadoop-node-34":"rack1",
        "hadoop-node-49":"rack2",
        "hadoop-node-50":"rack2",
        "hadoop-node-51":"rack2",
        "hadoop-node-52":"rack2",
        "hadoop-node-53":"rack2",
        "hadoop-node-54":"rack2",
        "192.168.1.31":"rack1",
        "192.168.1.32":"rack1",
        "192.168.1.33":"rack1",
        "192.168.1.34":"rack1",
        "192.168.1.49":"rack2",
        "192.168.1.50":"rack2",
        "192.168.1.51":"rack2",
        "192.168.1.52":"rack2",
        "192.168.1.53":"rack2",
        "192.168.1.54":"rack2",
        }

if __name__=="__main__":
        print "/" + rack.get(sys.argv[1],"rack0")

由于hadoop没有明确的说明机架感知是感知IP还是感知主机名,所以就都写上。
然后将脚本赋予可执行权限chmod u+x RackAware.py,并放到bin/目录下。
重启namenode,如果配置成功,namenode启动日志中会输出:0
2011-12-21 14:28:44,495 INFO org.apache.hadoop.net.NetworkTopology: Adding a new node: /rack1/192.168.1.15:50010

心跳机制

  • NameNode周期性的从datanode接收心跳信号和块报告
  • NameNode根据块报告验证元数据
  • 没有按时发送心跳的datanode会被标记为宕机,不会再给它IO请求
  • 如果datanode失效照成副本数量下降,并且低于预先设置的阀值,namenode会检测出这些数据块,并在合适的时机进行重新复制
  • 引发重新复制的原因还有副本本身损坏,磁盘错误,复制印子增大等

回收站

在etc/hadoop/core-site.xml添加配置:

<property>
<name>fs.trash.interval</name>
<value>10080<value>
</property>

设置回收站数据保存时间:毫秒

喜欢 (1)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址