Hadoop 系列 HDFS:分布式文件系统(HDFS文件读写)
HDFS:分布式文件系统
HDFS文件读写
文件访问权限
针对文件和目录,HDFS有与POSIX非常相似的权限模式。
一共提供三类权限模式:只读权限(r)、写入权限(w)和可执行权限(x)。读取文件或列出目录内容时需要只读权限。写入一个文件,或是在一个目录上创建及删除文件或目录,需要写入权限。对于文件而言,可执行权限可以忽略,因为你不能在HDFS中执行文件(与POSIX不同),但在访问一个目录的子项时需要该权限。
每个文件和目录都有所属用户(owner)、所属组别(group)及模式(mode)。这个模式是由所属用户的权限、组内成员的权限及其他用户的权限组成的。
默认情况下,可以通过正在运行进程的用户名和组名来唯一确定客户端的标示。但由于客户端是远程的,任何用户都可以简单的在远程系统上以他的名义创建一个账户来进行访问。因此,作为共享文件系统资源和防止数据意外损失的一种机制,权限只能供合作团体中的用户使用,而不能在一个不友好的环境中保护资源。注意,最新的hadoop系统支持kerberos用户认证,该认证去除了这些限制。但是,除了上述限制之外,为防止用户或者自动工具及程序意外修改或删除文件系统的重要部分,启用权限控制还是很重要的。
注意:这里有一个超级用户的概念,超级用户是nameNode进程的标识。对于超级用户,系统不会执行任何权限检查。
读文件
客户端通过调用FileSystem对象的open()方法来打开希望读取的文件,对于HDFS来说,这个对象是分布式文件系统的一个实例。
DistributedFileSystem通过使用RPC来调用nameNode,以确定文件起始块的位置。对于每一个块,nameNode返回存有该块复本的datanode地址。此外,这些datanode根据他们与客户端的距离来排序。如果客户端本身就是一个datanode,并保存有相应数据块的一个复本时,该节点将从本地datanode中读取数据。
DistributedFileSystem类返回一个FSDataInputStream对象给客户端读取数据。FSDataInputStream类转而封装DFSInputStream对象,该对象管理着datanode和nameNode的I/O。
接着,客户端对这个输入流调用read()方法。存储着文件起始块的datanode地址的DFSInputStream随即连接距离最近的datanode。通过对数据流反复调用read()方法,可以将数据从datanode传输到客户端。到达块的末端时,DFSInputStream会关闭与该datanode的连接,然后寻找下一个块的最佳datanode。客户端只需要读取连续的流,并且对于客户端都是透明的。
客户端从流中读取数据时,块是按照打开DFSInputStream与datanode新建连接的顺序读取的。它也需要询问namenode来检索下一批所需块的datanode的位置。一旦客户端完成读取,就对FSDataInputStream调用close()方法。
注意:在读取数据的时候,如果DFSInputStream在与datanode通讯时遇到错误,它便会尝试从这个块的另外一个临近datanode读取数据。他也会记住那个故障datanode,以保证以后不会反复读取该节点上后续的块。DFSInputStream也会通过校验和确认从datanode发送来的数据是否完整。如果发现一个损坏的块, DFSInputStream就会在试图从其他datanode读取一个块的复本之前通知namenode。
总结:在这个设计中,namenode会告知客户端每个块中最佳的datanode,并让客户端直接联系该datanode且检索数据。由于数据流分散在该集群中的所有datanode,所以这种设计会使HDFS可扩展到大量的并发客户端。同时,namenode仅需要响应位置的请求(这些信息存储在内存中,非常高效),而无需响应数据请求,否则随着客户端数量的增长,namenode很快会成为一个瓶颈。
写文件
首先客户端通过DistributedFileSystem上的create()方法指明一个预创建的文件的文件名(第一步),DistributedFileSystem再通过RPC调用向NameNode申请创建一个新文件(第二步,这时该文件还没有分配相应的block)。namenode检查是否有同名文件存在以及用户是否有相应的创建权限,如果检查通过,namenode会为该文件创建一个新的记录,否则的话文件创建失败,客户端得到一个IOException异常。DistributedFileSystem返回一个FSDataOutputStream以供客户端写入数据,与FSDataInputStream类似,FSDataOutputStream封装了一个DFSOutputStream用于处理namenode与datanode之间的通信。
当客户端开始写数据时(第三步),DFSOutputStream把写入的数据分成包(packet), 放入一个中间队列——数据队列(data queue)中去。DataStreamer从数据队列中取数据,同时向namenode申请一个新的block来存放它已经取得的数据。namenode选择一系列合适的datanode(个数由文件的replica数决定)构成一个管道线(pipeline),这里我们假设replica为3,所以管道线中就有三个datanode。DataSteamer把数据流式的写入到管道线中的第一个datanode中(第四步),第一个datanode再把接收到的数据转到第二个datanode中(第四步),以此类推。
DFSOutputStream同时也维护着另一个中间队列——确认队列(ack queue),确认队列中的包只有在得到管道线中所有的datanode的确认以后才会被移出确认队列(第五步)。
如果某个datanode在写数据的时候当掉了,下面这些对用户透明的步骤会被执行:
管道线关闭,所有确认队列上的数据会被挪到数据队列的首部重新发送,这样可以确保管道线中当掉的datanode下流的datanode不会因为当掉的datanode而丢失数据包。
在还在正常运行的datanode上的当前block上做一个标志,这样当当掉的datanode重新启动以后namenode就会知道该datanode上哪个block是刚才当机时残留下的局部损坏block,从而可以把它删掉。
已经当掉的datanode从管道线中被移除,未写完的block的其他数据继续被写入到其他两个还在正常运行的datanode中去,namenode知道这个block还处在under-replicated状态(也即备份数不足的状态)下,然后他会安排一个新的replica从而达到要求的备份数,后续的block写入方法同前面正常时候一样。
有可能管道线中的多个datanode当掉(虽然不太经常发生),但只要dfs.replication.min(默认为1)个replica被创建,我们就认为该创建成功了。剩余的replica会在以后异步创建以达到指定的replica数。
当客户端完成写数据后,它会调用close()方法(第六步)。这个操作会冲洗(flush)所有剩下的package到pipeline中,等待这些package确认成功,然后通知namenode写入文件成功(第七步)。这时候namenode就知道该文件由哪些block组成(因为DataStreamer向namenode请求分配新block,namenode当然会知道它分配过哪些blcok给给定文件),它会等待最少的replica数被创建,然后成功返回。
注意:①hdfs在写入的过程中,有一点与hdfs读取的时候非常相似,就是:DataStreamer在写入数据的时候,每写完一个datanode的数据块(默认64M),都会重新向nameNode申请合适的datanode列表。这是为了保证系统中datanode数据存储的均衡性。
②hdfs写入过程中,datanode管线的确认应答包并不是每写完一个datanode,就返回一个确认应答,而是一直写入,直到最后一个datanode写入完毕后,统一返回应答包。如果中间的一个datanode出现故障,那么返回的应答就是前面完好的datanode确认应答,和故障datanode的故障异常。这样我们也就可以理解,在写入数据的过程中,为什么数据包的校验是在最后一个datanode完成
转载于:https://www.cnblogs.com/mtime2004/p/10004331.html
Hadoop 系列 HDFS:分布式文件系统(HDFS文件读写)相关推荐
- Hadoop技术(一)分布式文件系统HDFS
分布式文件系统HDFS 第一章 统一思维 单机大数据处理实现以及问题 问题引入 现在收集到的想法 问题升级 第二章 Hadoop 一 Hadoop简介 HDFS优点 HDFS缺点 二 Hadoop分布 ...
- Hadoop大数据分布式文件系统hdfs的工作机制
HDFS集群分为两大角色:NameNode.DataNode NameNode负责管理整个文件系统的元数据 DataNode 负责管理用户的文件数据块 namenode工作机制 namenode职责: ...
- Hadoop大数据分布式文件系统hdfs的Java操作
搭建开发环境(eclipse,hdfs的jar包----hadoop的安装目录的share下) <dependency><groupId>org.apache.hadoop&l ...
- 大数据与Hadoop系列之分布式文件系统(一)
文件系统 早在 1965 年开发的 Multies ( UNIX 的前身)就详细地设计了文件系统,这使得文件系统成为多用户单节点操作系统的重要组成部分.最初的文件系统用于解决信.息的长期存储,并达到如 ...
- 2021年大数据Hadoop(七):HDFS分布式文件系统简介
2021大数据领域优质创作博客,带你从入门到精通,该博客每天更新,逐渐完善大数据各个知识体系的文章,帮助大家更高效学习. 有对大数据感兴趣的可以关注微信公众号:三帮大数据 目录 HDFS分布式文件系统 ...
- Hadoop HDFS分布式文件系统原理及应用介绍
HDFS有着高容错性特点,且设计用来部署在低廉的硬件上,提供高吞吐量来访问应用程序的数据,适合那些有着超大数据集的应用程序.HDFS放宽了POSIX的要求,可以实现流的形式访问文件系统中的数据. Ha ...
- Hadoop分布式文件系统——HDFS
一.介绍 HDFS (Hadoop Distributed File System)是 Hadoop 下的分布式文件系统,具有高容错.高吞吐量等特性,可以部署在低成本的硬件上. 二.HDFS 设计原理 ...
- 大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门到熟练操作)
系列博客 1.大数据技术之Hadoop完全分布式集群搭建+Centos7配置连通外网和主机 2.大数据技术之Hadoop编译源码 3.大数据技术之Hadoop分布式文件系统HDFS系统知识整理(从入门 ...
- 分布式文件系统-HDFS( HDFS全称是Hadoop Distributed System)
分布式文件系统-HDFS HDFS Hadoop的核心就是HDFS与MapReduce.那么HDFS又是基于GFS的设计理念搞出来的. HDFS全称是Hadoop Distributed System ...
- Hadoop大数据原理(2) - 分布式文件系统HDFS
文章目录 1. 数据存储问题 2. RAID技术的原理和思路 2.1 常用RAID的原理介绍 2.2 RAID间的性能比较 3. 大数据时代的分布式文件系统 3.1 HDFS的稳固地位 3.2 HDF ...
最新文章
- setleft android,android TextView的setCompoundDrawables()方法
- 「重返18岁」!英特尔首任CTO重磅回归,以CEO身份重掌帅印
- Linux之SELinux的基本应用
- 使用 NLTK 对文本进行清洗,索引工具
- Linux进程资源管理第二篇 -------- 工作及资源管理
- 批处理--创建当前日期的文件夹
- C语言试题七十之请编写函数判断年份是否为闰年
- CAS单点登陆原理简介及环境搭建
- 厦门GDP超过万亿需要多少年时间?
- SharePoint 2013 的HTML5特性之响应式布局
- 阿里云服务器 发送邮箱 STMP 25端口 465端口问题 Javamail 25被禁用
- 开发流程与管理--华为硬件开发
- 在Linux上下载arduino
- 在Android上将实时摄像头与AI危害检测配合使用
- python尔雅答案_2020尔雅通识课Python》程序设计查题公众
- c语言windows程序设计-在windows中使用printf,Windows编程(4)-在Windows中使用printf
- EEE802.11协议基础知识
- Python | 输出分数形式(Fraction)
- 【全栈接口测试进阶系列教程】精通api接口测试,接口分类,接口架构,http,webservice,dubbo接口协议,接口流程,接口工具,cookie,session,token接口鉴权原理以及实战
- 马德里的Uber司机
热门文章
- 子目录 makefile make和clean
- 蓝桥杯 ALGO-23 算法训练 一元三次方程求解
- 【iOS开发】关于Xcode8后产生的viewForHeaderInSection、viewForFooterInSection设置不产生效果的问题
- ps_基础技术提升topic基础知识调研
- 性能监控的好工具 - NewRelic 简介
- PERL 使用IO::Socket::INET模块实现socket编程
- nginx的基本使用和反向代理,地址重写问题
- GNU make manual 翻译(三十八)
- java学习笔记之斐波那契数列
- mybatis中使用in查询时的注意事项