(此学习笔记整理于《Hadoop权威指南》第三章)

背景:Hadoop分布式文件系统:HDFS(Hadoop Distributed Filesystem)

1.HDFS的设计

  • HDFS以流式数据访问模式来储存超大文件,运行于商用硬件集群上。
  • 超大文件(几百MB、GB、TB)
  • 流式数据访问(一次写入、多次读取是最高效的访问模式。读取整个数据集的时间延迟比读取第一条记录的时间延迟更重要。)
  • 商用硬件(普通硬件、故障几率较大,但是坏掉可以继续运行且不让用户感到明显的中断。)
  • 低时间延迟的数据访问(如几十毫秒范围内的不适合HDFS,高数据吞吐量必定会以时间为代价。低延迟需求Hbase或许更好。)
  • 大量的小文件(该系统能存储的文件总数受限于namenode的内存容量,每个文件目录和数据块的存储信息大概占用150字节)
  • 多用户写入,任意修改文件(该系统只有1个writer,且写操作总是添加在文件的末尾。不支持多个writer或在文件的任意位置进行修改。)

2.HDFS的概念

  • 数据块(是磁盘进行数据读写的最小单位。HDFS默认64MB)
    • HDFS中的fsck指令可以显示块信息,例:% hadoop fsck / -files -blocks
  • namenode(主)和 datanode(从)
  • 联邦HDFS
    • 在2.x发行版本系列中引入的联邦HDFS允许 系统通过添加namenode实现扩展,其中每个namenode管理文件系统命名 空间中的一部分。例如,一个namenode可能管理/user目录下的所有文件, 而另一个namenode可能管理/share目录下的所有文件。
  • HDFS的高可用性(Hadoop 2.x版本利用了[HA]解决了单点失效[SPOF]的问题)

3.命令行接口

  • 伪分布时fs.default.name设置为hdfs://localhost/
  • dfs.replication设置为1(默认为3)
  • 文件系统的基本操作:hadoop fs -help

4.Hadoop文件系统

  • Hadoop有一个抽象的文件系统概念,HDFS只是其中的一个实现。
  • Java抽象类org.apache.hadoop.fs.FileSystem 定义了 Hadoop 中的一个文件系统接口,并且该抽象类有几个具体实现,如下表所示。



  • 接口

    • HTTP
    • C
    • FUSE(用户空间文件系统)

5.Java接口

  • 从Hadoop URL读取数据
    • 使用java.net.URL 对象打开数据流(只能被调用一次)
    • 调用Hadoop中简洁的IOUtils类并在finally字句中关闭数据流
  • 通过FileSystem API读取数据
  • 写入数据
    • create()方法
    • 重载方法Progressable
    • append()方法
  • 目录
    • public boolean mkdirs(Path f) throws IOException
  • 查询文件系统
    • 文件元数据FileStatus:getFileStatus()方法,exist()方法检测是否存在
    • 列出文件 listStatus()方法
    • 文件模式:globStatus()方法进行通配
    • PathFilter对象
  • 删除数据
    • public boolean delete(Path f,boolean recursive) throws IOException

6.数据流

  • 剖析文件读取

    • 读取流程


    • Hadoop网络距离


  • 剖析文件写入


  • 一致模型:sync()方法

7.通过Flume和Sqoop导入数据(另行总结)

8.通过distcp并行复制(另行总结)

9.Hadoop存档

  • Hadoop存档工具:HAR文件
  • HAR文件的不足
最后由 BF 编辑于2017年11月14日 16:40