摘要:从HDFS的写入和读取中,我们能学习到什么?

本文分享自华为云社区《从HDFS的写入和读取中,我们能学习到什么》,作者: breakDawn 。

最近开发过程涉及了一些和文件读取有关的问题,于是对hdfs的读取机制感到兴趣,顺便深入学习了一下。

写入

  1. 客户端向NameNode发出写文件请求,告诉需要写的文件名和路径、用户
  2. NameNode检查是否已存在文件、检查权限。如果通过,会返回一个输出流对象
  • 注意此时会按照“日志先行“原则,写入NameNode的editLog
  1. 客户端按照128MB的大小切分文件。 也就是block大小
  2. 客户端把nameNode传来的DataNode列表和Data数据一同发送给 最近的第一个DataNode节点。
  3. 第一个dataNode节点收到数据和DataNode列表时, 会先根据列表,找到下一个自己要连接的最近DataNode, 删除自己后,再一样往下发。以此类推,发完3台或者N台。
  • 传输单位是packet,包,比block小一点。
  1. dataNode每写完一个block块, 则返回ACK信息给上一个节点进行确认。(注意是写完block才确认)
  2. 写完数据, 关闭输出流, 发送完成信息给DataNode

写过程的核心总结:

  • 客户端只向一个dataNode写数据,然后下一个dataNode接着往另一个dataNode写,串联起来。
  • 按128MB分block。 每次传数据按pack传。 校验按照chunk 校验,每次chunk都会写入pack。
  • 写完block才发ACK确认。

Q: NameNode的editlog有什么用?怎么起作用的?
A:作用:

  • 硬盘中需要有一份元数据的镜像——FSImage
  • 每次要修改元数据就信息时,必须得改文件(hdfs没有数据库)
  • 可能会比较久,改的时候如果断电了,就丢失这个操作了

为了避免丢失,引入editlog,每次修改元数据前,先追加方式写入editlog, 然后再处理,这样即使断电了也能修复。

一般都是那些更改操作有断开风险,为了确保能恢复,都会引入这类操作。

Q: 什么时候发送完成信号? 全部节点都写入完成吗
A:发送完成信号的时机取决于集群是强一致性还是最终一致性,强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报,HDFS一般情况下都是强调强一致性

Q: 怎么验证写入时的数据完整性?
A:

  • 因为每个chunk中都有一个校验位,一个个chunk构成packet,一个个packet最终形成block,故可在block上求校验和。
  • 当客户端创建一个新的HDFS文件时候,分块后会计算这个文件每个数据块的校验和,此校验和会以一个隐藏文件形式保存在同一个 HDFS 命名空间下。就是.meta文件

  • 当client端从HDFS中读取文件内容后,它会检查分块时候计算出的校验和(隐藏文件里)和读取到的文件块中校验和是否匹配,如果不匹配,客户端可以选择从其他 Datanode 获取该数据块的副本。

Q: 写入时怎么确定最近节点?
A:按照按照hadoop时设置的机架、数据中心、节点来估算

假设有数据中心d1机架r1中的节点n1。该节点可以表示为/d1/r1/n1。利用这种标记,这里给出四种距离描述。

  • Distance(/d1/r1/n1, /d1/r1/n1)=0(同一节点上的进程)
  • Distance(/d1/r1/n1, /d1/r1/n2)=2(同一机架上的不同节点)
  • Distance(/d1/r1/n1, /d1/r3/n2)=4(同一数据中心不同机架上的节点)
  • Distance(/d1/r1/n1, /d2/r4/n2)=6(不同数据中心的节点)

读取

读取就比较简单了,没有那种复杂的串行过程。NameNode直接告诉客户端去哪读就行了。

  1. client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。
  2. 就近挑选一台datanode服务器,请求建立输入流 。
  3. DataNode向输入流中中写数据,以packet为单位来校验。
  4. 关闭输入流

点击关注,第一时间了解华为云新鲜技术~

从HDFS的写入和读取中,我发现了点东西的更多相关文章

  1. HDFS 03 - 你能说说 HDFS 的写入和读取过程吗?

    目录 1 - HDFS 文件的写入 1.1 写入过程 1.2 写入异常时的处理 1.3 写入的一致性 2 - HDFS 文件的读取 2.1 读取过程 2.2 读取异常时的处理 版权声明 1 - HDF ...

  2. HDFS写入和读取流程

    HDFS写入和读取流程 一.HDFS HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而 ...

  3. HDFS数据流-剖析文件读取及写入

    HDFS数据流-剖析文件读取及写入 文件读取 1. 客户端通过调用FileSystem对象的open方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例.2. Distrib ...

  4. iOS中plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...

  5. 蜗牛爱课- iOS中plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{    NSArray *paths=NSSearchPathForDirect ...

  6. Java 实现Excel表数据的读取和写入 以及过程中可能遇到的问题

    问题1:Unable to recognize OLE stream 格式的问题要可能是因为给的数据是2010年的数据表后缀为.xlsx,要先转化成2003版的后缀为.xls 问题2: Warning ...

  7. [转]VC++中对文件的写入和读取

    本文转自:http://blog.csdn.net/fanghb_1984/article/details/7425705 本文介绍两种方法对文件进行读取和写入操作:1.采用fstream类:2.采用 ...

  8. 在C#程序中,创建、写入、读取XML文件的方法

    一.在C#程序中,创建.写入.读取XML文件的方法 1.创建和读取XML文件的方法,Values为需要写入的值 private void WriteXML(string Values) { //保存的 ...

  9. ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中

    ResquestInfoServlet类通过访问HttpServletRequest对象的各种方法来读取HTTP请求中的特定信息,并且把它们写入到HTML中 ResquestInfoServlet.j ...

随机推荐

  1. Solution -「多校联训」Sample

    \(\mathcal{Description}\)   Link   (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...

  2. Dubbo扩展点应用之三异步调用

    Dubbo不只提供了堵塞式的同步调用,同时提供了异步调用的方式.这种方式主要应用于提供者接口响应耗时明显,消费者端可以利用调用接口的时间去做一些其他的接口调用,利用Future模式来异步等待和获取结果 ...

  3. 面试题(造火箭必备技能):请举例一个最有成就感的性能bug

    当前,绝大部分招聘都有性能要求或者把其作为加分项(会性能优先),哪怕你不是面试的性能,面试的时候可能会问性能,所以大家才会有"面试造火箭,进去拧螺丝"的共鸣.至于企业为什么重视性能 ...

  4. AWVS漏洞扫描教程之扫描方式

    实验目的 掌握AWVS的基本用法. 实验原理 Acunetix Web Vulnerability Scanner是一个网站及服务器漏洞扫描软件. 实验内容 对Web站点进行安全测试. 实验环境描述 ...

  5. [题解]UVA10129 Play on Words

    链接:http://vjudge.net/problem/viewProblem.action?id=19492 描述:单词接龙 思路:求欧拉回路或欧拉道路. 首先建图,以字母为节点,单词为边.因为单 ...

  6. 【C# 线程】Windows系统下常见的7种I/O模型 之Overlapped I/O模型

    overview 这个字符到底是什么含义呢?其实它的意思就是当程序在等待设备操作的时候,可以继续往下做而不必阻塞到那个地方等待设备操作的返回,这就造成了程序运行和设备操作时间上的重叠.  Overla ...

  7. 【C#程序集】为何.NET Core控制台项目发布后是一个dll文件,而不是exe文件?

    因为 .NET Core 的控制台应用默认是生成 dll 文件,而没有对应的 exe 文件.如下图所示,是在VS中编译后生成的结果 图中看到的TestVisualizer.exe 只是一个快捷方式, ...

  8. MM32F0020 GPIO驱动LED灯(MM32F0020 GPIO Toggle)

    目录: 1.MM32F0020简介 2.MM32F0020系统时钟配置 3.MM32F0020的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0020 GPIO驱 ...

  9. SqlServer 局域网内不能连接对方数据库?

    一直都是连接的远程测试服务器的数据库,今天想把自己的数据库开放出来让公司同事连接,竟然连接失败!转了很大一个圈终于搞定了. 接下来就把这次心历路程发出来,希望能帮助到有需要的博友. PS: 我和同事的 ...

  10. Centos6/7系统基础配置-从零到无

    转至:https://www.cnblogs.com/Pigs-Will-Fly/p/13855300.html 目录 前言 系统配置 文档作用 一.Centos 6.X 系列配置 1.1  主机名 ...