zoukankan      html  css  js  c++  java
  • HDFS原理

    HDFS(Hadoop Distribute File System)基于谷歌发布的GFS论文呢设计(RPC通信方式)

    大文件、流式数据适合、大量小文件、随机写入、低延迟读取不适合。

    特点

    高容错、高吞吐量、大文件存储

    HDFS能做什么

    硬件失效

    流式数据访问:块方式读取、128M一个块(大文件的读取)

    存储数据大:

    数据的一致性:一次写入多次读取、支持追加不能修改

    多硬件平台:

    移动计算能力:就近原则(计算离数据最近的副本数据)、可减少网络负载、降低网络拥堵

    HDFS架构

    namenode:存储生成文件系统的元数据(目录树结构、文件块、块编号及datanode的分布)

    secondary namenode:

    datanode:

    流程:客户端-namenode-客户端-datanode

    HDFS关键设计

    主从模式

    统一文件系统命名空间

    数据副本机制

    元数据(持久化机制):

    统一通讯协议:

    健壮机制:

    数据组织:

    访问方式:

    空间回收机制:

    HDFS数据读取流程

    1、业务应用调用HDFS Client提供的API打开文件

    2、HDFS Client联系Namenode获取到文件信息(数据块、datanode位置信息)

    3、业务应用调用read API读取文件

    4、HDFS Client根据从Namenode获取到的信息,联系Datanode,获取的相应数据块(Client采用就近原则读取数据)

    5、HDFS Client会与多个Datanode通讯获取数据块

    6、数据读取完成后,业务调用close关闭连接

    HDFS写入流程

    1、业务应用调用HDFS Client提供的API创建文件,请求写入

    2、HDFS Client联系Namenode,namenode在元数据中创建文件节点

    3、业务应用调用write API写入文件

    4、HDFS Client收到业务数据后,从Namenode获取到数据块编号、位置信息,联系datanode并将需要与数据的datanode建立起流水线,完成后,客户端再通过自有协议写入数据到datanode1,再由datanode1复制到datanode2,datanode3

    5、写完的数据,将返回确认信息给HDFS Client

    6、所有数据确认完成后,业务调用HDFS Client关闭文件

    7、业务调用close flush后,HDFSClient联系Namenode,确认数据包写入完成,Namenode持久化元数据

    注:客户端执行完write操作后,写完的block才是可见的,正在写的block对客户端是不可见的,只有调用close方法时会默认调用sync方法,是否需要手动调用取决于你根据程序需要在数据健壮性和吞吐率之间权衡

    数据副本机制

    副本距离计算公式:

    Distance(Rack 1/D1 Rack1/D1)=0同一台服务器的距离为0

    Distance(Rack 1/D1 Rack1/D3)=2同机架不同服务器距离为2

    Distance(Rack 1/D1 Rack2/D1)=4不同机架服务器距离为4

    副本放置策略:

    第一副本在本地机器

    第二副本在远端机器

    第三副本首先确认之前的两个副本是否在同一个机架,如果是则选择其他的机架,否则选择和第一副本相同机架的不同节点

    第四副本及以上随机选择副本存放位置

    数据持久化

    1、主namenode接收文件系统操作请求,生成editlog,并回滚日志,向editlog.new中记录日子

    2、备用namenode从主namenode上下载FSImage,并从共享存储中读取editlog

    3、备用namenode将日志和旧的元数据合并,生成新的元数据FSImage.ckpt

    4、备用namenode将元数据上传到主用namenode

    5、主namenode将上传的元数据进行回滚

    6、循环操作

    元数据持久化健壮机制:HDFS主要目的是保证存储数据的完整性,对于 各个组件的失效,做了可靠性处理

    重建失效数据盘的副本

    datanode与namenode之间通过心跳周期回报状态数据,namenode管理数据块是否报完整,如果datanode因硬盘损坏未上报数据块,namenode将发起副本重建动作恢复丢失的副本

    集群数据均衡:HDFS架构设计了数据均衡机制,以此机制保证数据在各个datanode上存储是平均的

    数据的有效性保证:datanode存储在硬盘上的数据块,都有一个检验文件与之对应,在读取数据时,datanode会校验其有效性,若校验失败,则HDFS客户端将从其他数据节点读取数据,并通知namenode,发起副本恢复

    元数据可靠性保证:采用日志机制操作元数据,同时元数据存在主备namenode上,快照机制实现了文件系统常见的快照机制,保证数据误操作时能及时恢复

    安全模式:HDFS提供独有的安全模式机制,在数据节点故障,硬盘故障时,能防止故障扩散

    HDFS高可靠性

    在基本架构上增加了一下组件:

    ZK:分布式协调,主要用来存储HA下的状态文件,主备信息。ZK数量基数3个及以上

    namenode主备模式,主提供服务,备用于合并元数据并作为主的热备

    ZKFC(zookeeper Failover Controller)用于控制Namenode的节点主备状态

    JN(journalnode)用于共享存储,namenode生成的editlog

    HDFS常用Shell命令
    命令类别 命令 命令说明
    dfs -cat 显示文件内容
    -ls 显示目录列表
    -rm 删除文件
    -put 上传文件到hdfs
    -get 从hdfs下载文件到本地
    -mkdir 创建目录
    -chmod/-chown 改变文件属组
    ...  ...
    dfsadmin

    -safemode

    安全模式操作
    -report 报告服务状态
    balancer -threshold 容量均衡阙值
    HDFS服务关键配置说明
    参数 默认值 说明
    dfs.replication 3 HDFS存储数据的副本数,建议为3,修改后,hdfs将全局刷新副本数
    dfs.client.block.write.replace-datanode-on-failure.replication 2 客户端再写入数据时会强制要求所有数据写成功,否则就写入失败,当数据节点为3台时,建议修改为2,防止数据节点复位写入失败。
    dfs.namenode.rpc.port 8020 hdfs内部rpc的通讯端口
    dfs.namenode.http 25000 hdfs http服务端口
    namenode关键参数配置
    参数 默认值 说明
    dfs.namenode.image.backup.nums 48 元数据备份个数,元数据备份为每30分钟备份,48可以备份一天的元数据
    dfs.block.size 134217728 数据块大小,默认是128M,单位为字节,系统安装之后不建议修改
    dfs.namenode.handler.count 64 namenode并行处理任务数,调大可以提高性能
    fs.trash.checkpoint.interval 60 HDFS回收站扫描周期
    fs.trash.interval 1440 hdfs回收站文件删除时间,单位为1分钟,默认一天
    dfs.permissions.enabled true hdfs文件系统是否启用acl的安全管理,建议打开
    datanode关键配置
    参数 默认值 说明
    dfs.block.size 134217728 数据块大小,默认安装是128M,单位为字节,系统安装后不建议修改
    dfs.datanode.handler.count 8 datanode并行处理的任务数,调大可以提高性能
    dfs.datanode.directoryscan.interval 21600 datanode数据块校验周期,此功能用于检查损坏的数据块,默认是21天,参数单位为小时
    dfs.datanode.balance.bandwidthPerSec 20971520 hdfs balance功能的最高流量,调大后能缩短balance时间,但是会占用较大的网络带宽
    dfs.datanode.data.dir.perm 700 datanode创建存储目录的默认权限,能防止数据被非root账号非法读取。

      

      

      

  • 相关阅读:
    如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
    如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
    redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?
    SpringBoot项目jar包启动脚本-windows环境
    在IDEA中将SpringBoot项目打包成jar包的方法
    Freemarker在replace替换是对NULL值的处理
    移动端页面内容设定字号相同,但是显示出来字体大小不同的问题
    解决UEditor编辑时,只添加视频内容,不添加文字,视频信息不能保存到数据库的问题
    springboot项目打war包发布到外置tomcat
    Ueditor富文本添加视频内容,视频不显示以及编辑富文本时,视频不显示解决方案
  • 原文地址:https://www.cnblogs.com/cf532088799/p/7726027.html
Copyright © 2011-2022 走看看