Remote Procedure Call

RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机(client)/服务器(server)模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)。

HDFS中的block、packet、chunk

1、Block
这个大家应该知道,文件上传前需要分块,这个块就是block,一般为128MB,当然你可以去改,不顾不推荐。因为块太小:寻址时间占比过高。块太大:Map任务数太少,作业执行速度变慢。它是最大的一个单位。

2、Packet
packet是第二大的单位,它是client端向DataNode,或DataNode的PipLine之间传数据的基本单位,默认64KB。

3、Chunk
chunk是最小的单位,它是client向DataNode,或DataNode的PipLine之间进行数据校验的基本单位,默认512Byte,因为用作校验,故每个chunk需要带有4Byte的校验位。所以实际每个chunk写入packet的大小为516Byte。由此可见真实数据与校验值数据的比值约为128 : 1。
例如,在client端向DataNode传数据的时候,HDFSOutputStream会有一个chunk buff,写满一个chunk后,会计算校验和并写入当前的chunk。之后再把带有校验和的chunk写入packet,当一个packet写满后,packet会进入dataQueue队列,其他的DataNode就是从这个dataQueue获取client端上传的数据并存储的。同时一个DataNode成功存储一个packet后之后会返回一个ack packet,放入ack Queue中。

读文件

1、client访问NameNode,查询元数据信息,获得这个文件的数据块位置列表,返回输入流对象。

2、就近挑选一台datanode服务器,请求建立输入流 。

3、DataNode向输入流中中写数据,以packet为单位来校验。

4、关闭输入流

**1.首先客户端发送请求到 DFS ,申请读取某一个文件**
**2.DFS 去 NN 查找这个文件的信息 ( 权限 , 文件是否存在 )**如果文件不存在,抛出指定的错误如果文件存在,返回成功状态
**3.DFS 创建 FSDataInputStream 对象,客户端通过这个对象读取数据**
**4.客户端获取文件第一个 Block 信息 , 返回 DN1 DN2 DN8**
**5.客户端直接就近原则选择 DN1 对应的数据即可**
**6.依次类推读取其他块的信息,直到最后一个块 , 将 Block 合并成一个文件**
**7.关闭 FSDataInputStream**

读文件流程分析

1.首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例

2.DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.

3.前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。

4.数据从datanode源源不断的流向客户端。

5.如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。
6.如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。

7.如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像

8.该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。

写文件

1.客户端向NameNode发出写文件请求。

2.检查是否已存在文件、检查权限。若通过检查,直接先将操作写入EditLog,并返回输出流对象。

3.client端按128MB的块切分文件。

4.client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点,此后client端和NameNode分配的多个DataNode构成pipeline管道,client端向输出流对象中写数据。client每向第一个DataNode写入一个packet,这个packet便会直接在pipeline里传给第二个、第三个…DataNode。

5.每个DataNode写完一个块后,会返回确认信息。

6.写完数据,关闭输输出流。

7.发送完成信号给NameNode。

写文件流程微观

1.客户端通过调用DistributedFileSystem的create方法创建新文件

2.DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常.

3.前两步结束后会返回FSDataOutputStream的对象,与读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。

4.DataStreamer会去处理接受data queue,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如副本数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。

5.DFSOutputStream还有一个对列叫ack queue,也是由packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。
如果在写的过程中某个datanode发生错误,会采取以下几步:1) pipeline被关闭掉;2)为了防止丢包 ack queue里的packet会同步到data queue里;3)把产生错误的datanode上当前在写但未完成的block删掉;4)block剩下的部分被写到剩下的两个正常的datanode中;5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。

6.客户端完成写数据后调用close方法关闭写入流

7.DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知datanode把文件标示为已完成。

Hadoop(三)读写流程相关推荐

  1. 大数据系列文章-Hadoop的HDFS读写流程(二)

    在介绍HDFS读写流程时,先介绍下Block副本放置策略. Block副本放置策略 第一个副本:放置在上传文件的DataNode:如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点. 第二 ...

  2. hdfs读写流程_深度探索Hadoop分布式文件系统(HDFS)数据读取流程

    一.开篇 Hadoop分布式文件系统(HDFS)是Hadoop大数据生态最底层的数据存储设施.因其具备了海量数据分布式存储能力,针对不同批处理业务的大吞吐数据计算承载力,使其综合复杂度要远远高于其他数 ...

  3. hadoop读写流程、副本机制、安全模式、平衡节点

    一.副本放置策略 如图: 解释: 第一个副本: 假如上传节点为DN节点,优先放置本节点: 否则就随机挑选一台磁盘不太慢 CPU不太繁忙的节点: 第二个副本: 放置在于第一个副本的不同的机架的节点上 第 ...

  4. java基础巩固-宇宙第一AiYWM:为了维持生计,大数据Hadoop之HDFS分布式文件系统(HDFS读写流程、主从集群两种问题“单点故障”及“压力过大内存受限”、HDFS的架构设计)~整起

    Hadoop之HDFS 目录 一.大数据 二.HADOOP 三.HDFS 1.HDFS基本概念 2.HDFS的架构设计 3.HDFS自己对于上面两种数据持久化技术的实现: 4.HDFS读写流程 5.H ...

  5. 2021年大数据Hadoop(十):HDFS的数据读写流程

    2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习. 有对大数据感兴趣的可以关注微信公众号:三帮大数据 目录 HDFS的数据读写流程 ...

  6. Hadoop 03_核心:读写流程

    Hadoop1.0核心 HDFS读写流程: 写流程: 读流程: -------------------------------------------------------------------- ...

  7. HDFS详解(架构设计、副本放置策略、读写流程、进程、常用命令等)

    前言:当数据集的大小超过一台独立的物理计算机的存储能力时,就有必要对它进行分区(Partition)并存储到若干台单独的计算机上.管理网络中跨多台计算机存储的文件系统成为分布式文件系统(distrib ...

  8. 【华为云技术分享】大数据实践解析(下):Spark的读写流程分析

    摘要:本文通过简单的例子来解析,大数据实践中的Spark读写流程,内容主要聚焦于Spark中的高效并行读写以及在写过程中如何保证事务性. 导读: 众所周知,在大数据/数据库领域,数据的存储格式直接影响 ...

  9. Spark源码分析之Sort-Based Shuffle读写流程

    一 概述 我们知道Spark Shuffle机制总共有三种: # 未优化的Hash Shuffle:每一个ShuffleMapTask都会为每一个ReducerTask创建一个单独的文件,总的文件数是 ...

  10. hdfs读写流程_一篇文章搞清楚 HDFS 基本原理

    随着互联网的发展,数据日益增多,增长超过了单机能够处理的上线,数据如何存储和处理成为了科技公司的难题,随着google的三篇论文的发布,大家终于找到了一个方案-分布式文件系统+MapReduce.Ha ...

最新文章

  1. 蓝桥杯国赛-矩阵计数三种解法-java实现
  2. python培训学费多少钱-大连python培训多少钱?
  3. (转载)详解Hive配置Kerberos认证
  4. linux centos 回收站,centos rm 回收站
  5. GDCM:gdcm::ImageChangePlanarConfiguration的测试程序
  6. ref:ThinkPHP Builder.php SQL注入漏洞(= 3.2.3)
  7. ibatis中resultClass与resultMap 的区别
  8. python语言的编程模式_一种基于Python语言的EDA开发平台及其使用方法与流程
  9. mysql循环load data_TP5框架下MySQL通过LOAD DATA INFILE批量导入数据详细操作
  10. locate: database too small: /var/db/locate.databas
  11. Java虚拟机是如何执行线程同步的
  12. 金数据一个不错的调查平台
  13. MongoDB工具最新进展
  14. React从入门到精通系列之(14)refs和DOM元素
  15. 【SimpleITK】胸部CT数据3D space归一化,以及3D plot
  16. samba 和 nfs 实验
  17. unix网络编程——网络基础
  18. 不完美破解四川电信中兴B860A高安机顶盒
  19. MongoDB实验练习题
  20. 07,springcloudalibaba_sentinel(流量卫兵)

热门文章

  1. 孙正义最新演讲:对于未来30年的趋势,现在正是关键时刻
  2. 段永平:大道无形我有型
  3. 新加坡首富张勇的烦恼
  4. 大数据24小时:Salesforce拟65亿美元收购Mulesoft,林志颖加盟小黑鱼科技任首席体验官
  5. P315 static关键字
  6. ORACLE 库缓存
  7. 利用LocalBroadcastManager发送 app业内广播
  8. Android Kotlin
  9. 流计算 Oceanus | 巧用 Flink 构建高性能 ClickHouse 实时数仓
  10. 使用 i18n 时踩的坑