当写入一个文件到 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. Java 创建线程的方式

    想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?” 稍稍了解过,或者在日常开发中也都会用到以下几种方式: ①继承Thread类(真正意义上的线程类 ...

  2. 一条sql 执行查询列表 返回分页数据以及总数 totalCount

    SELECT ID,Name,Age,Addr,Tel,COUNT(1) OVER() AS totalFROM dbo.Student WHERE Age>22 ORDER BY id DES ...

  3. python--模块之sys与python解释器交互模块

    作用:sys模块是与python解释器交互的一个接口.它提供了一系列有关python运行环境的变量和函数. 常用函数:import sys sys.argv #命令行参数list,第一个元素是程序本身 ...

  4. Python学习笔记三:数据类型

    数据类型 整数int 32位机器,-2**31~2**31-1,即-2147483648~2147483647(4亿多) 64位机器,-2**63~2**63-1,非常大了. 长整型long 没有位数 ...

  5. java 用接口计算圆柱的体积和面积并添加颜色

    import java.util.Scanner; class Test { public static void main(String[] args) { fangfa i = new fangf ...

  6. 清华大学《C++语言程序设计基础》线上课程笔记04---指针

    指针 static int i; static int* ptr = &i; 此处的*表示ptr是指针类型(地址类型),用来存放目标数据的地址 其本身也有地址,所以又指向指针的指针; *前面的 ...

  7. Java多线程一些基础知识

    最近复习了一些多线程方面的基础知识,做一下总结,多以自己的理解来文字叙述,如果有漏点或者理解错的地方,欢迎各位大佬多多指出: ps:线程分为用户线程和守护线程,当程序中的所有的用户线程都执行完了之后, ...

  8. java 关键字super和this

    super关键字 作用:调用父类的构造器 只能出现在子类的构造其中,并且必须是第一行 super()中的参数,决定了调用父类的那个构造器 注:如果子类构造器中没有出现super,则默认加上super( ...

  9. 20145202马超《java》【课堂实验】P98测试

    当时在加水印所以没来得及提交,然而我回宿舍第一时间就提交了,希望老师额能够看到

  10. 成都Uber优步司机奖励政策(3月14日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...