最近,又看了《hadoop权威指南》,学习了Hadoop文件系统HDFS,下面我总结一下我对HDFS的学习:
HDFS的构建思路:主要针对是大文件, 访问模式是一次写入,多次读取
HDFS把大文件分割成数据块进行存储,默认的块大小为64MB(比磁盘块大(512字节)目的是为了最小化寻址开销)利用%hadoop fsck / -files -blocks 可以查看各个文件有哪些块组成。
运行模式:管理者-工作者模式 一个namenode 和多个datanode nd管理者文件系统的整个命名空间,维护文件目录,块所在的数据节点信息(不永久保存这些块的位置信息)
还有一个辅助namenode(secondary namenode):定期通过编辑日志合并命名空间镜像,防止编辑日志过大。 还有就是当namenode出现故障时,起到容灾的作用。
基本的文件操作这里不详细叙述了!
hadoop文件系统接口:提供Thrift服务来支持不同语言。
文件系统类 FileSystem 两种静态方法 public static FileSystem get(Configuration conf) throws IOException public static FileSystem get(URI uri,Configuration conf) throws IOException
FsDataInputStream fs.open(new path(uri)) extends DataInputStream implements Seekable,PositionedReadable 支持随机访问,以及从文件的任何位置读取数据 接口Seekable 提供 seek(long pos) getPos() boolean SeekToNewSource(long targetPos) PositionReadable 提供 public int read(long position,byte[] buffer,int offset,int length) readFully方法
FsDataOutputStream fs.create(Path f) 重载方法Progressable 显示文件进度 fs.append(Path f) 不允许在文件中定位。
FileStatus fs.getFileStatus(file)获取文件详情 FileStatus[] fs.listStatus(Path f,PathFilter filter) 列出文件目录
文件模式 FileStatus [] fs.globStatus(Path pattern,PathFilter pathfilter) 使用通配符处理一批文件
文件读取剖析:FileSystem open() -->调用RPC 访问nn-->封装DFSInputStream 调用read() -->fs.close()
文件写入剖析:FileSystem create()-->调用RPC 访问nn-->封装DFSOutputStream 数据队列 构成 datanode管线 并且维护一个“确认队列”-->write()-->fs.close()
一致模型:FSDataOutputStream 调用sync()来强制所有的缓存与数据节点同步。
通过distcp并行复制:支持两个HDFS集群之间传输数据 (必须要求两个版本一致) %hadoop distcp hdfs://namenode1/ hdfs://namenode2/
作为一个mapreduce作业来实现的,使用-m 可以减少分配的map任务数
为了支持不同版本间,使用HFTP协议 %hadoop distcp hftp://namenode1:50070/ hdfs://namenode2/ (注意需要指定namenode的Web端口 由dfs.http.address指定)
Hadoop存档:可以用作MapReduce的输入 减少namenode的内存
%hadoop archive -archiveName files.har /my/files /my har文件组成:两个索引文件 部分文件的集合
%hadoop fs -lsr har:///my/files.har 如果想在其他文件中引用HAR 文件,URI格式:%hadoop fs -lsr har://hdfs-localhost: /my/files.har
不足:创建存档文件会创建原始文件的一个复本, 目前还不支持存档文件的压缩。 har文件创建不能再修改,har文件处理小文件仍然低效,因为inputformat类不知道文件是否存档
以上,是我学习HDFS的总结。