zoukankan      html  css  js  c++  java
  • hdfs基础

    Namenode作用?

    1 管理,维护文件系统的元数据/名字空间/目录树   管理数据与节点之间的映射关系(管理文件系统中的每个文件/目录的block信息)

    2 管理datanode汇报的心跳日志/报告

    3 客户端与datanode之间的桥梁(元数据信息共享)

    Datanode的作用?

    1 负责数据的读写操作

    2 周期性的向namenode汇报心跳日志 /报告

    3 执行数据流水线的复制

    Secondarynamenode存在的意义?

    1 进行fsimage和edit的合并操作,减少edit日志大小,加快集群的启动速度

    2 强fsimage与edit进行备份,防止丢失

    fsimage与edi的作用是什么?

    1 在集群二次启动时,使用fsimage和edits合并进行恢复元数据

    2  Secondarynamenode周期性的拉取fsimage和edits进行合并生成新的fsimage

    Secondarynamenode的工作机制是什么?

      1 namenode创建一个edits.new

      2 snn从NameNode节点拷贝fsimage和edits文件到snn

      3 snn将两个文件导入内存进行合并操作生成一个新的fsimage.ckpt文件

      4 snn将新的fsimage.ckpt文件发送到namenode节点

      5 重命名为fsimage替换原先的fsimage

      6 原先的edits生成edits.new文件

      7 将edits替换为新的edits.new

    HDFS数据完整性如何保证?

    数据写入完毕以后进行校验,数据读取之前进行校验对比判断是非有数据丢失

    namenode会周期性的通过datanode汇报的心跳信息中获取block的校验和进行检查数据完整性,如果发现校验不一致,会从其他副本节点复制数据进行恢复,从而保证数据的完整性

    hdfs特性?(适用场景:一次写入,多次读取)

    1.海量数据存储

    2.大文件存储

    3.高容错性

      数据自动保存多个副本,通过增加副本的形式,提高容错性      

      某一个副本丢失以后,可以自动恢复,这是hdfs内部机制实现的

    hdfs的缺点?

    1 不擅长低延时的数据访问,由于hadoop针对高数据吞吐做了优化,牺牲了数据的延迟,所有对于低延迟访问数据的业务需求不适合hdfs

    2 不擅长大量小文件存储,存储大量小文件的话,会占用NameNode大量的内存来存储文件,目录和块信息,这样是不可取,因为namenode的内存是有限的

    3 不支持多用户并发写入一个文本,同一个时间,只能有一个用户执行写操作

    4 不支持文件的随机修改(多次写入,一次读取),仅支持数据末尾append(追加),不支持随机修改

    hdfs的数据写入流程?

    1 client发起文件写入请求,通过rpc与namenode建立通讯,namenode检查目标文件,返回是否可以上传

    2 client请求第一个block该传输到哪些datanode服务器上

    3 namenode根据副本数量和副本放置策略进行节点分配,返回Datanode节点 如A,B,C

    4 client请求A节点建立pipline管道,A接收到请求会继续调用B,然后B调用C,将整个pipline管道建立完成,后逐级返回消息到client

    5 client收到A返回的消息之后开始往A上传第一个block块,block块被切分成64k的packet包不断的在pipline管道里传递,从A到B,B到C进行复制存储

    6 当一个block块传输完成之后,client在此请求namenode上传第二个block块的存储节点,不算往复存储

    7 当所有block块传输完成后,client调用fsdataoutputStream的close方法关闭输出流,最后调用fileSystem的complete方法告知namenode数据写入成功

    hdfs的数据读取流程?

    1 client发起文件读取请求,通过rpc与namenode建立通讯,namenode检查目标文件,来确定请求文件block的位置信息

    2 namenode会视情况返回文件的部分或者全部block块列表,对于每个block块,namenode都会返回有该block副本的datanode地址

    3 这些返回的datanode地址会按照集群拓扑结构得出datanode与客户端的距离,然后进行排序,排序规则:网络拓扑结构中距离client近的排靠前;心跳机制中超时汇报的DN状态为stale,这样的排靠后

    4 client选取排序靠前的datanode调用fsdatainputSteam的read方法来读取block数据,如果客户端本身就是datanode,那么将从本地直接获取block块数据

    5 当读完一批的block块后,若文件读取还没结束,客户端会继续向namenode获取下一批的block列表,继续读取

    6 所有block块读取完成后,client调用FSDataInputSteam.close()方法,关闭输入流,并将所有的block块合并成一个完整的最终文件

  • 相关阅读:
    git track
    npm 升级到最新版本
    三行代码实现垂直居中和cube
    布局之定位
    MongoDB的安装问题
    正则表达式
    javascript表单验证
    Oracle中创建表,行级触发器,序列
    查找某个字符在字符串中出现的次数
    oracle表中有一列id她是自动增长的,插入一条数据时怎么取得id的值
  • 原文地址:https://www.cnblogs.com/fengyouheng/p/15416897.html
Copyright © 2011-2022 走看看