这篇文章主要介绍HDFS如何读写数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
示例:上传一个200M的文件到HDFS分布式系统 执行流程: 1、client向NameNode发送上传文件的请求,NameNode会做校验。 --(检查是否具备权限,上传路径是否存在,文件是否以存在,是否执行覆盖操作等) 2、NameNode响应客户端,可以上传文件 3、client按照集群中块大小的设置对200M的数据进行切块,即切分为128M和72M两个block块,并请 求返回DataNode节点信息 。 a.执行上传时,是一块一块进行上传,则先请求上传0~128M的块信息(第一个block块),因为 数据真实存在DataNode节点上,所以NameNode会返回dn1\dn2\dn3三个服务器节点存储数据。 --副本存储节点选择机制,如何选择节点并返回?(见图NameNode部分) --为什么明明只往一个节点传,还要返回三个节点?(我觉得如果只返回一个节点,如果那个节点 挂了,就不知道往哪传了,所以返回三个,dn1故障了可以选择往dn2或dn3传。) 4、client得到dn的信息后,会和dn服务器节点建立链接,client发送请求建立block传输通道,执行写数据操作 a.client在和dn建立连接时,也会有选择,选择距离客户端最近的节点请求建立链接通道(假设dn1最近) b.client和dn1建立链接通道之后,dn1内部发请求到dn2,请求建立通道,dn2发请求到dn3,请求建立通道, dn3响应dn2,dn2响应dn1,dn1响应client ,均没有问题,通道建立成功 5、数据传输时,不是说将128M的文件直接进行传输,而是client向dn1以Packet为单位进行数据传输,(packet大小:64KB), 每次传输64KB,最后一次传输数据大小可能不够64KB。 a.client向dn1传输64KB的数据到内存,dn1落盘(在当前节点服务器上将数据由内存写到本地),并分发给dn2(内存), dn2落盘,在发给dn3(内存),dn3落盘 --逻辑上的说法 b.chunk数据传输过程中的最小单位(512字节),每次从0~128M中读数据,先读取512字节放入chunk中,当chunk满 载时,对chunk内的数据进行校验,生成校验和(占4个字节),即共将516个字节放入Packet内,一个Packet存在N多个chunk --真实说法 c.各节点内部Packet是如何进行传输的? 在hdfs内部有一个队列,叫做dataQuene(缓冲队列),每传输一个Packet,就将当前Packet放入到DQ队列中,当dn1 接收到DQ中的Packet时,会将Packet从DQ队列中拉取出来,存入另一队列ackQuene中(应答队列),当dn1,dn2,dn3等节点均将ackq中的数据写成功之后,ackquene中的packet移除,表示packet传输完成 6、当dn1、dn2、dn3建立通道时,或者在数据传输过程中,如果某个节点出现问题,比如dn2宕机了,那么客户端会重新发 请求建立传输通道,这时,宕机的节点dn2不在请求应答,dn1 和 dn3直接建立通道,dn2不在使用,缺少副本数据,内部机器会重新配置一台来顶替dn2,保证真实节点数据和副本机 制设置的保持一致 7、数据传输完成之后,流关闭,执行第二个块的数据写操作,步骤同上
示例:从HDFS系统下载一个200M的文件到本地 1、client向NameNode发送下载文件请求,NameNode向client返回目标文件的元数据 2、client根据元数据,通过FSDataInputStream进行读取,client和距离客户端最近的dn节点建立传输通道 a.注意:读数据,只需要与一个节点建立通道即可,只要可以读一次,取到真实数据就行 3、读数据也是以Packet为单位,注意,第一次读取时可能会取到第一个块的数据,但是第二个块可能存在其它 节点上,这时,其余数据的读取需要client与其它节点重新建立通道进行读取。 4、多个块读取到client之后,在client会进行缓存,然后合并写入目标文件,保证读取的真实数据的完整性
以上是“HDFS如何读写数据”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。