感谢兄弟们的关注与支持,如果觉得有帮助的话,还请来个点赞、收藏、转发三操作

该文章已更新到语雀中,后台回复“语雀”可获取公众号:进击吧大数据整个职业生涯持续更新的所有资料

在前面介绍了Hadoop三部曲搞起~,简单理解了HDFS底层是如何完成读写功能的,在存储层面,HDFS采用了块抽象的方式简化了存储系统设计,即一个文件会被切分成多个块进行存储,在Hadoop 1.x中块的大小是64MB;在Hadoop 2.x中块的大小是128MB,当然在实际生产环境中,也有设置为256MB。

那么这里大家思考一下,Hadoop为什么要设计块大小为64、128或者256呢?为什么不能是100、200、300呢?为什么在Hadoop 1.X设置的块大小是64MB?为什么在Hadoop2.X就调整为128MB呢?

当然这个问题在面试中也会经常被问到。本文将来为大家详细介绍一下其中的设计思想,通过本文你将可以了解到:
1、系统磁盘块原理
2、磁盘读写流程
3、通过实际生活中的借款例子来诠释HDFS块设计思想
如有错误的地方,欢迎大佬指出~

首先大家应该要先清晰的知道,HDFS支持的文件语义是属于一次写入多次读取的,文件被切分成块在不同的机器上存储。

假设我们有一个500MB的文件存储到HDFS上,那么Hadoop就会将文件进行切块存储,我们按照128MB来计算大概会生成4个块。如下图可见,最后一个Block实际大小不足128MB,但仍会占用一个块。这里需要和操作系统中的磁盘块区分开来,下文会简单介绍下磁盘块的知识点(这块属于操作系统层面的东西,不想看的同学直接往下翻就行);

什么是磁盘块?

我们先来简单复习了解下系统层面的知识,因为这和下面讲解HDFS的块设计是有关系的。我们就拿日常的硬盘举例
比如常使用的移动硬盘是由多个盘片叠加组成的(可以想象成以前我们玩的的光碟),盘片上面有一层特殊的磁性材质是由刚性材料制成,这也是硬盘名称的由来,和硬盘相对应的还有一种叫做软盘,可想而知,软盘是由一种软性材料组成的。硬盘的一个主轴上通常能安装好几个盘片,盘片是有正反两面的(也称为盘面),每一面都有这种磁性物质,而且 都能存储二进制信息,所以每个盘片需要两个磁头来读写数据。

磁头采用了非接触式头,与盘片之间的间隙只有0.1~0.3um,这样可以获得很好的数据传输率。而且磁头靠近主轴(转轴)接触的表面,即线速度最小的地方,是一个特殊的区域,它不存放任何数据,又被称为启停区或者是着陆区(Landing Zone),启停区外就是数据区。在最外圈,离主轴最远的地放是“0”磁道,硬盘数据的存放就是从最外圈开始的

硬盘内部结构中还有一个电动机来带动盘片旋转,副电动机会带动一组磁头到相对应的盘片上并确定是读取正面还是反面,当磁盘旋转的时候,磁头要是保持在一个位置上,则每个磁头都会在磁盘表面上划出一个圆形轨迹,这些圆形轨迹就叫做磁道(Track)
磁道会被等分为多个弧段,这些弧段就是扇区(Sector),等分的目的就是在读取和写入数据的时候,磁盘会以扇区为单位进行读取和写入这样可以提高运行速度。数据硬盘的第一个扇区又叫做引导扇区。每个扇区就是一个个磁盘块,存储固定数量用户可访问的数据,原来的扇区设计都是512Byte(即0.5KB)的容量,但目前大多数硬盘驱动器使用4KB扇区来存储大量的数据减少数据的拆解。

上图展示了关于磁道、扇面、扇区、扇区组之间的关系:A代表的是磁道;B代表的是扇面;C代表的是扇区;D代表的是簇(扇区组)。

磁盘读写流程

磁盘写

当我们写入文件到磁盘的时候,内部是按照柱面、磁头、扇区的方式进行的,即先是在第一磁道的第一个磁头下的所有扇区下存储,然后是同一个柱面的下一个磁头,直到把所有的内容写入到磁盘中。

磁盘读

当我们需要从磁盘中读取数据的时候,系统会把数据逻辑地址传给磁盘,磁盘内部的控制电路会按照寻址逻辑将逻辑地址翻译成物理地址,即要先确定读取的数据在哪个磁道上的哪个扇区(物理地址由柱面号、磁头号、扇区号三部分组成),当拿到物理地址后,需要将磁头放到这个扇区上方,为了能够到达这个扇区,那么磁头需要移动,这个过程就是我们常说的寻道,这个过程所花费的时间又叫做寻道时间,寻道时间越短,IO操作越快;同时磁盘会将目标扇区进行旋转,到达磁头下,这个过程花费得时间又叫做旋转时间,该时间延迟取决于磁盘转速;最后才开始读取数据,然后将数据存放到系统缓冲区中,这个传输过程所花费的时间是传输数据,该部分的时间和前面两个时间相比可以几乎忽略不计。因此在磁盘上读取数据所花费的总时间=寻道时间+旋转时间+实际传输时间,但真正决定一个硬盘读写速度的是它的平均存取时间(也就是平均寻道时间和平均旋转延迟之和)。
如上图所示,一次完整的磁盘读请求会经过cache层,Mapping层、通用层、I/O调用层和块设备驱动层,最后是物理设备层。

HDFS设计思想-“借钱事件”

那么我们继续回到今天的主题上,磁盘读写跟HDFS 块的大小又有什么关系呢?我们来举一个现实生活中真实的例子:相信大家都借出去过钱吧,假如你手里有10w块钱可以借出去,那么这里有几种借钱选择:
● 第一种情况:借给100个人,每个人1000块
● 第二种情况:借给10个人,每个人1w块
● 第三种情况:借给2个人,每个人5w块
● 第四种情况:借给1个人,10w全借出去

如果是你的话,第1,2种情况是不是肯定不会选择,想想看,你会时刻惦记着10个人以上还债情况吗?你有那么多精力吗?同样的道理,如果HDFS的块大小越大,那么即使大文件那么切分的块个数也不会太多,在NameNode中存储也是能够cover住的,如果设置的块太小,那么就会生成大量的块,恐怕很快会消耗完NameNode的内存,这个和小文件危害问题其实是一样的,而且也会加大NN恢复加载元数据的时间。假设你设置的块大小为1MB,有一个1G的文件要存储,那么就会切分1024个块存储到DataNode上,这里还有一个问题就是1024个块有可能会分布到很多的DataNode上,在数据读写和副本复制的时候,无非增加了网络IO资源,这些也是要考虑进去的。

那既然块大小不能太小,如果设置块大小非常大呢?那么就和前面介绍的磁盘原理挂钩了,如果设置的块大小非常大,虽然切分的块个数是少了,对NameNode保存元数据信息也不会有太大压力,但是并行度就低了(想想MR模型),效率就会下降了,你说是不是呢?
那么既然块大小不能太大,也不能太小,那为什么在Hadoop2.x之后把块大小调整为128MB呢?这个其实是跟早期的Hadoop设计有关系的,在学习Hadoop的时候,我们知道该系统是参考了Google的GFS论文,在GFS设计中就是使用的64MB作为默认的块大小(感兴趣的朋友可以再回过头来看看该论文中的Chunk Size部分),这里列出文中提到的几点原因:

  1. Lower the loading of master(减少NameNode负载). The master server of GFS only provides metadata of the chunk instead of chunk content. Therefore, less requests will be sent to master server if the chunk is relative large.

  2. Reduce network overhead(降低网络IO), it encourage applications to finish many operations on a single chunk and persistent network connection. Applications also get their data in fewer request.

  3. Reduce metadata size stored in the master(减少NameNode元数据存储). There is only one master server in GFS’s design. All metadata of chunks are stored in the memory of master server in order to reduce the latency and increase the throughput. Large chunks means less metadata, and less metadata means less load time of the metadata.

    介绍到这里,可能会有朋友说既然这样的话,那为什么不是设置成256MB呢?其实这个块的大小设置并不是固定的,128MB是属于比较通用的配置,也是做过基准测试的,具体还要根据你的实际情况来抉择,如果说你们的数据量非常大,而且机器配置也很高,那么可能设置256MB或者512MB性能会更好;如果数据量很少,那么128MB的块大小可能更适合。如果要调整块大小,可以修改hdfs-site.xml文件中的dfs.block.size属性

进击吧大数据

从事大数据行业多年,涉及范围包括不局限于基础支撑、计算引擎、数据整合、数据应用等多方向,参与过大型企业数仓体系建设、对数据建模、数据治理、业务增长有一定的理解;曾收获过多家一线大厂offer,目前带领团队建设企业实时数仓;欢迎大佬们一起加入交流成长

面试官把我问懵了....相关推荐

  1. 为什么面试官总喜欢问String?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者:tan日拱一兵 来源:公众号「日拱一兵」 关于 Java String,这是面试的基础 ...

  2. 面试官上来就问:Java 进程中有哪些组件会占用内存?

    本文的内容来自 StackOverflow 的一个问答:Java using much more memory than heap size (or size correctly Docker mem ...

  3. 安卓application_阿里面试官刁钻连问:安卓 UID的分配、查看及相关知识

    面试难度还行,但是如果不好好复习,有几个点还真是答不上来. uid机制 uid:Android系统中uid用于标识一个应用程序,uid在应用安装时被分配,并且在应用存在于手机上期间,都不会改变.一个应 ...

  4. 面试官最爱问的并发问题

    转载自  面试官最爱问的并发问题 在Java相关的岗位面试中,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(J ...

  5. 今天来谈谈面试官最喜欢问JS中的闭包问题吧

    今天来谈谈面试官最喜欢问JS中的闭包问题吧 1.什么是闭包? 闭包是指有权访问另外一个函数作用域中的变量的函数,闭包就是函数的局部变量集合,只是这些局部变量在函数返回后会继续存在.闭包就是函数的&qu ...

  6. 面试官最爱问的Redis(三)Redis的基本知识

    面试官最爱问的redis,继续整理了Redis的学习笔记,动力节点的redis视频,13个小时搞定redis,笔记分享给大家. 视频资源:https://www.bilibili.com/video/ ...

  7. 如果我说熟悉SpringBoot 面试官会怎么问?

    SpringBoot 因简化了 Spring 框架使用难度,极大地提高了Java企业级应用开发的效率,成为企业考核人才的重要标准之一.但随着现今互联网行业快速发展.企业业务不断深入,相应地对 Spri ...

  8. 阿里的面试官都喜欢问哪些问题?

    作者:徐刘根 | 公众号:Java之间 金九银十是招聘的旺季,小编在这里也给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题,助校招或者社招路上的你一臂之力! 首先我们需要明白一个事实,招 ...

  9. 技术面试官应该怎么问?面试者应该怎么答?

          每年年初都是招聘.求职的旺季,不管你是企业面试官,还是职场小鸟,都应该要清楚对方问的是什么,意图在哪里,不要答非所问,一脸迟疑. 年初以来,面试过很多人,面试的内容无非就那么几类,反反复复 ...

最新文章

  1. bash mysql_解决bash: mysql: command not found 的方法
  2. Received status code 403 from server: ForbiddenDisable Gradle ‘offline mode‘ and sync project
  3. 数据库-SQL中like的用法
  4. python里有常量吗?(没有,但可自行定义)
  5. Java 类在 Tomcat 中是如何加载的?
  6. RESTful API 设计指南 (转)
  7. mysql使用jtable_jtable 的简单使用
  8. boost.asio学习-----reslover 域名解析
  9. js判断中文字符串长度和js截取中文字符串
  10. 基于矩阵分解的隐因子模型
  11. Java根据国家二字码获取国家英文名称,中文名称实例
  12. MYSQL数据库脱库写马写一句话
  13. java oracle驱动_oracle11g jdbc驱动(jdbc最新驱动)
  14. winform textbox文本框根据内容自动调整高度
  15. php+后台+限制+登录次数,THINKSNS取消后台登录密码错误次数限制的办法详解
  16. java试题汽车接口_Java接口和包的实现之小汽车实例
  17. a href点击无效_a标签失效的问题
  18. 微信是怎么打造平台型生态商业模式的?
  19. PMP®项目管理|项目干系人如何管理?
  20. android逆向开发工程师需要掌握的技能--实习一个月总结报告

热门文章

  1. ant+dva Ract系统前端开发教程
  2. 法学硕士可以调剂计算机专业吗,法学研究生可以调剂为法律硕士吗?
  3. 基于Fundation框架的简单管理系统
  4. 企业微信分享出来的小程序提示找不到页面
  5. 用python做卡片管理系统
  6. 【无人机】基于Fast行军树(FMT)求解无人机故障路径规划问题附matlab代码和论文
  7. python utf-8还原中文
  8. day02-抽象类,接口、代码块、final、单例、枚举
  9. java计算机毕业设计慧学IT精品课程网站源码+mysql数据库+系统+lw文档+部署
  10. Blackberry 10 JAM - 黑莓开发者的新的开始!