在介绍HDFS读写流程时,先介绍下Block副本放置策略。

Block副本放置策略

  • 第一个副本:放置在上传文件的DataNode;如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
  • 第二个副本:放置在与第一个副本不同的机架的节点上。
  • 第三个副本:与第二个副本相同机架的节点。
  • 更多副本:随机节点。

HDFS写流程

  • 客户端发请求给NameNode,我想保存一个文件A,这时候在NameNode会有一个标识,标识为A_copy(文件不可用)。
  • 根据副本放置策略,返回三个副本的可放置位置列表,且默认为sort排好顺序的。
  • 客户端主动去和离自己最近的DataNode连接(暂且叫DN1),然后DN1后续的DN2进行连接,DN2在和DN3进行连接。(串联方式Pipeline)
  • 客户端读取源文件,对该Block进行更小的切割,
    • 第一次:传递第一个Block中的第一个小包给DN1。
    • 第二次:传递第一个Block中的第二个小包给DN1,与此同时,DN1中的第一个小包传递给DN2。
    • 第三次:传递第一个Block中的第三个小包给DN1,与此同时,DN1中的第二个小包传递给DN2,DN2传递第一个小包给DN3.
    • 依次类推

(Block切割更小的小包,这里这么设计的好处是时间不重叠。如果不切,一次性传递例如64M,当传递DN1时,等待,传递DN2时,继续等待,传递DN3时,还在等,造成时间浪费。另外的一个好处时,如果增加节点,时间影响不大)

  • 最后通过DataNode与NameNode心跳,通知是否文件彻底传递完毕,补全NameNode中元数据的位置信息。

HDFS读流程

  • 客户端发请求给NameNode,NameNode将这个文件的元数据找到,告知给客户端(例如文件A,被切割为5个Block,元文件会纪录Block1:DN1,DN2,DN3,Block2:DN1,DN4,DN5等等依次类推)
  • 客户端直接向DataNode请求Block数据(遵循距离优先)
  • 当把所有的Block下载回本地后,进行验证每个Block元信息的MD5。如果每个Block都是正确的,没有被破坏,开始进行拼接,最终文件就被还原回来了。

HDFS文件权限

  • 与Linux文件权限类似

    • r:read;w:write;x:execute
    • 权限x对应文件忽略,对于文件夹表示是否允许访问其内容
  • 如果Linux系统用户zhangyongli使用Hadoop命名创建一个文件,那么这个文件在HDFS中owner就是zhangyongli
  • HDFS的权限目的,阻止好人做错事,而不是阻止坏人做坏事。HDFS相信,你告诉我你是谁,我就认为你是谁。

解释:

  • 阻止好人做错事:例如AB两个用户,A用户创建了一个X文件,B用户创建了一个Y文件,B用户删除不了A用户的文件X。
  • 阻止坏人做坏事:如果AB两个用户中的某个坏人,装了一台全新的linux系统,也创建AB用户,补全Hadoop部署文件内容,客户端程序,然后用新系统的A向NameNode去删除X文件,由于NameNode是被动受信,所以未来需要集成kerberos来防止这种操作。
    (转发请注明出处:http://www.cnblogs.com/zhangyongli2011/ 如发现有错,请留言,谢谢)

大数据系列文章-Hadoop的HDFS读写流程(二)的更多相关文章

  1. 大数据系列文章-Hadoop基础介绍(一)

    Hadoop项目背景简介 2003-2004年,Google公开了部分GFS个Mapreduce思想的细节,以此为基础Doug Cutting等人用了2年的业余时间,实现了DFS和Mapreduce机 ...

  2. 大数据系列之Hadoop框架

    Hadoop框架中,有很多优秀的工具,帮助我们解决工作中的问题. Hadoop的位置 从上图可以看出,越往右,实时性越高,越往上,涉及到算法等越多. 越往上,越往右就越火…… Hadoop框架中一些简 ...

  3. 大数据技术之Hadoop(HDFS)

    第1章 HDFS概述 1.1 HDFS产出背景及定义 1.2 HDFS优缺点 1.3 HDFS组成架构 1.4 HDFS文件块大小(面试重点) 第2章 HDFS的Shell操作(开发重点) 1.基本语 ...

  4. 【大数据系列】hadoop集群设置官方文档翻译

    Hadoop Cluster Setup Purpose Prerequisites Installation Configuring Hadoop in Non-Secure Mode Config ...

  5. Hadoop之HDFS读写流程

    hadoophdfs 1. HDFS写流程 2. HDFS写流程 1. HDFS写流程 HDFS写流程 副本存放策略: 上传的数据块后,触发一个新的线程,进行存放. 第一个副本:与client最近的机 ...

  6. 【大数据系列】Hadoop DataNode读写流程

    DataNode的写操作流程 DataNode的写操作流程可以分为两部分,第一部分是写操作之前的准备工作,包括与NameNode的通信等:第二部分是真正的写操作. 一.准备工作 1.首先,HDFS c ...

  7. 【大数据系列】hadoop核心组件-MapReduce

    一.引入 hadoop的分布式计算框架(MapReduce是离线计算框架) 二.MapReduce设计理念 移动计算,而不是移动数据. Input HDFS先进行处理切成数据块(split)   ma ...

  8. 【大数据系列】hadoop集群的配置

    一.hadoop的配置文件分类 1.只读类型的默认文件 core-default.xml     hdfs-default.xml    mapred-default.xml   mapred-que ...

  9. 大数据系列之Hadoop分布式集群部署

    本节目的:搭建Hadoop分布式集群环境 环境准备 LZ用OS X系统 ,安装两台Linux虚拟机,Linux系统用的是CentOS6.5:Master Ip:10.211.55.3 ,Slave ...

随机推荐

  1. mac上的xampp出现Access forbidden! You don’t have permission to access the requested object. It is either

    一个Joomla!程序,之前是在win上的xampp上运行得非常好的,当我把它拿到mac下面的xampp上去运行的时候,发现有问题,没法运行,报以下的错误: Access forbidden!  Yo ...

  2. Vue 基础

    1. data 数据 methods 方法 watch 监听变化 2. 模版指令(类似 angular) {{}} v-text 渲染数据 v-html html 结构 3. v-if v-show ...

  3. npm的常用配置

    第一次使用需要初始化 npm init -y npm-tut { "requires": true, "lockfileVersion": 1, "d ...

  4. jquery事件手冊

    方法 描写叙述 bind() 向匹配元素附加一个或很多其它事件处理器 blur() 触发.或将函数绑定到指定元素的 blur 事件 change() 触发.或将函数绑定到指定元素的 change 事件 ...

  5. centos 7.xx 安装LAMP环境

    一.安装Apache 1.安装yum -y install httpd2.开启apache服务systemctl start httpd.service3.设置apache服务开机启动systemct ...

  6. windows下使用F2PY编译fortran文件的问题

    在windo系统下F2PY不支持gcc+gfortran的组合,解决的办法: 1.安装mingw和msys,在msys环境下使用F2PY调用gcc+gfortran进行编译 2.放弃F2PY,直接gf ...

  7. Redis+EJB实现缓存(一)

        上篇博客大概的对Redis做了一个主要的了解.由于刚刚接触自己也不太明确.所以上篇博客写的乱七八糟的.这篇由于项目须要,学习了一下Redis和EJB集成. 如今脑子相对照较清晰了一些. 实现思 ...

  8. hadoop eclipse插件生成

    hadoop eclipse插件生成 做了一年的hadoop开发.还没有自动生成过eclipse插件,一直都是在网上下载别人的用,今天有时间,就把这段遗憾补回来,自己生成一下,废话不说,開始了. 本文 ...

  9. Hihocoder #1527 : 快速乘法 DP

    时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 在写代码时,我们经常要用到类似 x × a 这样的语句( a 是常数).众所周知,计算机进行乘法运算是非常慢的,所以我们需 ...

  10. string和int互相转化

    1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...