当写入一个文件到 HDFS 时,它被切分成数据块,块大小是由配置文件 hdfs-default.xml 中的参数 dfs.blocksize (自 hadoop-2.2 版本后,默认值为 134217728字节即 128M,可以在 hdfs-site.xml 文件中改变覆盖其值,单位可以为k、m、g、t、p、e等)控制的。每个块存储在一个或者多个节点,这是由同一文件中的配置 dfs.replication (默认为3)控制。块的每一个 copy 叫做 replica (副本)。
 
  replication 流程
  当在 HDFS 文件中写数据时,数据首先被写入到客户端本地缓存。当缓存达到块大小时,客户端请求 NameNode 并且获取 DataNode 列表。这个列表包含将承载这个块副本的 DataNode 。DataNode 数基于 replication 的系数,默认值为3。客户端组织从 DataNode 到 DataNode 和 flush 数据块到第一个 DataNode 的流程。第一个 DataNode 开始以小部分(文件系统大小4KB)接受该数据,每一部分写入其本地存储库,并转移同一部分数据至所述列表中的第二个 DataNode。第二个 DataNode 开始依次接受数据块的每一部分,这部分数据写入它的本地存储库,并且 flush 同一部分数据至第三个 DataNode。最后,第三个 DataNode 写数据至其本地存储库。因此,一个 DataNode可以从流程中前一个节点接受数据,并把同一部分数据转发到流程中的下一个节点。因此,数据是线性的从一个 DataNode 到下一个 DataNode。当第一个块被填满,客户端向 NameNode 请求下一个块的副本存储的节点主机以供选择。一个新的流程被组织起来,客户端开始发送文件更进一步的字节数据。这种流动一直进行,直到文件的最后一个块。对于每个块的 DataNode 的选择很可能是不同的。
注释:准备和成功的ACK(确认)
  在客户端写 File.txt 文件的"Block A"到集群之前,它想要知道所有预期准备接受这个块的 copy 的 DataNode。它选择对于 Block A 列表的第一个DataNode(DataNode 1),打开一个 TCP 50010 端口的连接并且说:“Hey,准备接受一个块,这儿有一个DataNode列表,包含 DataNode 5 和 DataNode 6。去确认他们也准备好接受这个块。”DataNode 1 打开一个 TCP 连接至 DataNode 5 并且说,“Hey,准备接受一个块,去确认 DataNode 6 也准备好接受这个块。”DataNode 5 将问 DataNode 6,“Hey,你准备好接受一个块了吗?”
  在同一个 TCP 管道准备好确认返回,直到初始 DataNode 1 发送一个“准备就绪”的消息回客户端。此时客户端准备好了开始写块数据到集群。
  它们也将发送成功的确认消息返回至流程,关闭 TCP 会话。客户端接收到一个成功消息,然后通知 NameNode 块写入成功。NameNode 更新元数据信息和文件 File.txt 的 Block A 的节点位置信息。
 
  副本存放策略
  默认的块存放策略如下:
  1、第一个副本的位置--随即的机架和节点(如果 HDFS 客户端存在于 hadoop 集群之外)或者在本节点(如果 HDFS 客户端运行在集群中的一个节点)。
  本地节点策略:
  在一个数据节点(这里使用 hadoop22)的本地路径复制一个文件至 HDFS :
  我们期望在节点 hadoop22 看到所有块的第一个副本。
  我们可以看到:
  文件 File.txt 的块 Block 0 在 hadoop22(rack2)、hadoop33(rack3)、hadoop32(rack3);
  File.txt 的块 Block 1 在 hadoop22(rack2)、hadoop33(rack3)、hadoop32(rack3);
  2、第二个副本写入与第一个不同的机架,并随机选择。
  3、第三个副本写入与第二个相同的机架,不过不是同一个节点。
  4、如果有其他副本,将被分散到其他机架。
 
  Replication 机架感知
  对于一个大的集群,它可能不会在一个扁平化的拓扑结构中直接的连接所有节点。通常的做法是,在多个机架的分散的节点。机架的节点共享一个开关,并且机架开关由一个或多个核心交换机连接。不同机架的两个节点的通信,要经历多个开关。大部分情况下,同一机架节点之间的网络带宽比不同机架之间的网络带宽要更大。
  HDFS使用一个简单的但高有效性的策略来分配块的副本。如果在 HDFS 集群的某些节点上正在执行打开一个文件以用来写入块的操作,那么第一个副本被分配到正在操作的客户端的这台机器上。第二个副本被随机分配到不同于第一个副本所在的机架的另一个机架上。第三个副本被随机分配到第二个副本所在机架的不同节点上。意思是,一个块被分配到了不同的机架上面。这个关键规则适用于数据的每一个快,两个副本在同一机架,另一个在不同的机架上。

Hadoop之block研究的更多相关文章

  1. ios之Block研究

    Block的好处,我总结了下主要有2点:1.用于回调特别方便,2.可以延长对象的作用区域.但是,Block的内存管理这个模块一直不是很清楚,这个周末好好的看了下Block的原理,有些许心得. 为了性能 ...

  2. hadoop中block副本的放置策略

    下面的这种是针对于塔式服务器的副本的放置策略

  3. 【转载】Hadoop机架感知

    转载自http://www.cnblogs.com/ggjucheng/archive/2013/01/03/2843015.html 背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机 ...

  4. hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

  5. Hadoop分布式配置

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 请先参照Linux安 ...

  6. Hadoop port to Jxta P2P Framework

    https://www.java.net/forum/topic/jxta/jxta-community-forum/hadoop-port-jxta-p2p-framework —————————— ...

  7. HADOOP实战

    一.软件版本Centos6.5.VMware 10CDH5.2.0(Hadoop 2.5.0)Hive-0.13 sqoop-1.4.5 二.学完课程之后,您可以:①.一个人搞定企业Hadoop平台搭 ...

  8. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

  9. 第十三章 hadoop机架感知

    背景 分布式的集群通常包含非常多的机器,由于受到机架槽位和交换机网口的限制,通常大型的分布式集群都会跨好几个机架,由多个机架上的机器共同组成一个分布式集群.机架内的机器之间的网络速度通常都会高于跨机架 ...

随机推荐

  1. HTML5开篇定义(更新中)

    以下介绍的两种属性是为后面的属性支持左铺垫,大概一看就OK了. 通用属性 id 用于为HTML元素指定唯一标识 style 用于为HTML元素指定CSS指定样式 class 用于匹配CSS样式的cla ...

  2. node.js使用Sequelize 操作mysql

    Sequelize就是Node上的ORM框架 ,相当于java端的Hibernate 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, SQLite ...

  3. laravel4.2 union联合,join关联分组查询最新记录时,查询条件不对,解决方案

    需求: 分组联合查询,或者最新记录. 问题:  mysql分组的时候默认会查询第一条记录,存在gourp by时 order by 无效. 一般解决办法就是 ,select * from ( sele ...

  4. Hive(5)-DDL数据定义

    一. 创建数据库 CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_pat ...

  5. jz2440_lcd

    VDEN      使能信号 HSYNC    水平方向的同步信号 VSYNC    垂直方向的同步信号 LED-/LED+   背光信号 VCLK       时钟信号 VD0~VD23    数字 ...

  6. 【AD】自己画板的备忘

    快捷键: [Ctrl + M ]计算出两点之间的距离,画电路板时会用到 [Ctrl + Q ]在设定X.Y..等等的地方,快捷键可以公英制快速切换 [shift + 空格键 ]在布线的同时,此快捷键可 ...

  7. BugkuWeb本地包含

    知识点:$_REQUEST不是一个函数,它是一个超全局变量,里面包括有$_GET $_POST $_COOKIE的值,$_REPUEST 是接收了 $_GET $_POST $_COOKIE 三个的集 ...

  8. React 源码中的依赖注入方法

    一.前言 依赖注入(Dependency Injection)这个概念的兴起已经有很长时间了,把这个概念融入到框架中达到出神入化境地的,非Spring莫属.然而在前端领域,似乎很少会提到这个概念,难道 ...

  9. 在window10平台下安装TensorFlow(only cpu)

    这是我在安装tensorflow遇到的问题记录 希望可以给大家一些帮助(2019年1月6日) 1. 需要安装的环境及软件 python3.6 Anaconda Tensorflow 2. 先安装ana ...

  10. 传说是小米家的一道面试题难倒了某Java程序员。扑克牌排序问题。

    网上说的是有位网友在面试小米Java岗三次后,终于挺进了第三轮面试,结果还是败在了两道算法题上面. 1.写个读方法和写方法,实现读写锁 2.一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆 ...