多用户写入,任意修改文件HDFS中的文件可能只有一个writer,而且写操作总是将数据添加在文件的末尾。它不支持具有多个写人者的操作,也不支持在文件的任意位置进行修改。可能以后会支持这些操作,但它们相对比较低效。
3.2HDFS的概念
3.2.1数据块
HDFS中数据块默认为64MB,HDFS上的文件被划分为快大小的多个分块,作为独立的存储单元,但是HDFS中小于一个块大小的文件不会占据整个块的空间,HDFS中块这么打是为了最小化寻址开销
3.2.2NameNode DataNode
namenode 管理者
管理文件系统的命名空间,维护文件系统树和整棵树内所有的文件和目录
客户端(client)通过与namenode和datanode的交互来访问整个文件系统
datanode 工作者
datanode是文件系统的工作节点,他们根据需要存储并检索数据块,并定期想namenode发送锁存储的块的列表
Hadoop提供两种对namenode损坏的容错机制
- 备份组成文件系统元数据持久状态的文件,一般是将永久状态写入本地磁盘的同时写入一个远程挂载的网络文件系统(NFS)
- 运行一个辅助namenode,作用是定期通过编辑日志合并名命名空间镜像,来防止编辑日志过大,会保存和明后命名空间镜像的副本,并在namenode故障时启用
3.2.3联邦HDFS
联邦环境下,每个namenode维护一个命名空间卷,命名空间卷之间相互独立。数据池不再进行划分,集群中的datanode需要到每个namenode中注册,并存储来自多个数据块池中的数据块
3.2.4HDFS的高可用性
在2.x发行版中添加了高可用性的支持,即配置了一对活动-备用namenode,当活动namenode失效时备用的namenode就接管任务,处理来自客户端的请求
3.3命令行接口
文件系统的基本操作
hadoop fs -help 获得每个命令的详细帮助文件
3.4Hadoop文件系统
Hadoop有一个抽象的文件系统的概念,HDFS只是其中的一个实现
接口
1.HTTP
2.C语言 Hadoop提供了一个名为libhdfs的c语言库,该语言库是java,FileSystem接口类的一个镜像,开发一般滞后于Java API
3.FUSE 用户空间文件系统允许吧按照用户空间实现的文件系统整合成一个unix文件系统,Fuse-DFS使用C语言实现的,调用libhdfs作为访问HDFS的接口
3.5Java接口
3.5.1从Hadoop URL读取数据
java.net.URL 通过FsUrlStreamHandlerFactory实例来调用java.net.URL对象的 setURLStreamHandlerFactory方法,每个java虚拟机智能调用一次这个方法。
3.5.2通过FileSystem API读取数据
有时无法在应用中设置URLStreamHandlerFactory实例,在这种情况下,使用FileSystem API 来打开一个输入流
Hadoop文件系统中通过Hadoop Path对象来代表文件,将路径视为一个Hadoop文件系统URI-->
FSFDataInputStream:FileSystem对象中open()方法返回的是FSDataInputStream对象而不是标准java.io类对象
3.5.3写入数据
FileSystem类有一系列新建文件的方法
-
给准备建的文件一个指定的Path对象,然后返回一个用于写入数据的输出流
public FSDataOutputStream create(Path f) throws IOException
-
使用append()方法在一个已有文件末尾追加数据
public FSDataOutputStream append(Path f) throws IOException
FSDataOutputStream:FileSystem实例的create()方法返回FSDataOutputStream对象,
HDFS不支持在文件末尾以外的其他位置追加数据
3.5.4目录
FileSystem实例提供了创建目录的方法
punlic boolean mkdirs(Path f) throws IOException
这个方法可以一次性创建所有必要但还没有的父目录
3.5.5查询文件系统
-
文件元数据:Filestatus
FileSystem的getFileStatus()方法用于获取文件或目录的FileStatus对象
-
列出文件:
查找一个文件或目录相关的信息: listStatus()方法
-
文件模式
-
PathFilter对象
通过PathFilter对象,以编程方式控制通配符
PathFilter对象与java.io.FileFilter一样,是Path对象而不是File对象
-
删除数据
使用FileSystem的delete()方法可以永久性删除文件或目录
3.5.6删除数据
3.6数据流
3.6.1剖析文件读取
这个设计中的一个重点是namenode告知客户端每个块中最佳的datanode,并让客户端直接链接到该datanode检索数据
3.6.2剖析文件写入
namenode选择在那个datanode储存副本,需要对可靠性,写入带宽,读取带宽进行权衡
3.6.3一致模型
文件系统的一致性模型描述了文件读/写的数据可见性,HDFS为性能牺牲了一些POSIX要求
新建一个文件之后,它能在文件系统的命名空间中立即可见,但是写入文件的 内容并不能保证立即可见,即使数据流已经刷新并存储,所以长度显示为0;
当写入超过一个块之后,第一个数据块对新的reader就是可见的,之后的块也不例外,但是,当前正在写入的块对其它reader是不可见的
3.7通过Flume和Sqoop导入数据
- Apache Flume 将大规模数据流导入HDFS的工具 -例如从另一个系统中收集日志数据
- Apache Sqoop 将数据从结构化存储设备批量导入HDFS -例如关系数据库
3.8通过distcp并行复制
简单理解是这样的:理解URI和URL的区别,我们引入URN这个概念。URI = Universal Resource Identifier 统一资源标志符URL = Universal Resource Locator 统一资源定位符URN = Universal Resource Name 统一资源名称这三者的关系如下图:也就是说,URI分为三种,URL or URN or (URL and URI)URL代表资源的路径地址,而URI代表资源的名称。通过URL找到资源是对网络位置进行标识,如:http://example.org/absolute/URI/with/absolute/path/to/resource.txtftp://example.org/resource.txt通过URI找到资源是通过对名称进行标识,这个名称在某命名空间中,并不代表网络地址,如:urn:issn:1535-3613
作者:Octocat
链接:https://www.zhihu.com/question/21950864/answer/89835520
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。