《Hadoop权威指南 第4版》 - 第三章 Hadoop分布式文件系统 - 设计概念/数据流/Java接口

3.1 HDFS的设计概念

  • HDFS以流式数据访问模式来存储超大的文件
  • HDFS延时较高, HBASE 到可以是较好的选择.
  • 大量的小文件, namenode(命名结点/空间) 将文件系统的元数据存储在内存中,每个大概占150Bytes, 上百万/千万时需要考虑物理机的内存大小
  • HDFS只支持单用户在 " 文件末尾 " 的追加的方式写入数据

3.2 HDFS 的概念

  • 数据块: 数倍于磁盘的数据块, 通常MapReduce中的map任务一次只处理一个HDFS块中的数据, 也不会过大(涉及到集群)
  • namenode 和 datanode
    • namenode为管理结点,文件系统的命名空间 ,保存整个文件系统树的所有文件信息,记录每个文件在各个结点中的存储信息(文件和数据块的互相引用关系)
    • datanode为数据结点,
  • 客户端Client,通过namenode和datanode交互来访问整个文件系统
  • 块缓存,访问频繁的块会被显式的加载到DataNode的内存中
  • 联邦HDFS,适用于超大集群,内存会成为瓶颈,联邦的HDFS的namenode允许进行扩展,每个node只管理一部分文件,如不同的目录对应不同的node
  • HDFS的高可用性
    • namenode存在单点故障,Hadoop2 增加了 “活动-备份” 的nameNode模式

3.3 命令行模式

  • 输入hadoop fs -help 获取命令大全
    示例 新建文件夹/查询/查询根目录下的全部文件夹及文件
    [root@localhost hadoop-2.7.2]# bin/hdfs dfs -mkdir -p /user/root/input             # 这种方式也可以
    [root@localhost hadoop-2.7.2]# hadoop fs -mkdir books

    [root@localhost hadoop-2.7.2]# hadoop fs -ls .
    Found 2 items
    drwxr-xr-x   - root supergroup          0 2020-01-02 15:55 books
    drwxr-xr-x   - root supergroup          0 2020-01-02 15:46 input

[root@localhost hadoop-2.7.2]# hadoop fs -ls file:///
Found 22 items
dr-xr-xr-x   - root root      53248 2019-04-09 21:25 file:///bin
dr-xr-xr-x   - root root       4096 2020-01-02 10:14 file:///boot
drwxr-xr-x   - root root       3300 2020-01-02 10:13 file:///dev
drwxr-xr-x   - root root       8192 2020-01-02 10:50 file:///etc
drwxr-xr-x   - root root         35 2020-01-02 10:20 file:///home
dr-xr-xr-x   - root root       4096 2019-04-09 21:24 file:///lib
.....

创建input文件夹, 上传两个文件

 hadoop fs -mkdir /input
hdfs dfs -put ~/baize/a.txt /input  
hdfs dfs -put ~/baize/a.txt /input/b.txt

查询 ,成功创建 http://192.168.147.132:50070/explorer.html#/
《Hadoop权威指南 第4版》 - 第三章 Hadoop分布式文件系统 - 设计概念/数据流/Java接口_第1张图片

执行一次MapReduce任务 单词统计

 hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /input /output      

结果在/output中查看
http://192.168.147.132:50070/explorer.html#/output
进行download 即可.

下面展示命令行的操作:

[root@localhost hadoop-2.7.2]# hdfs dfs -ls /output
Found 2 items
-rw-r--r--   1 root supergroup          0 2020-01-02 20:04 /output/_SUCCESS
-rw-r--r--   1 root supergroup         16 2020-01-02 20:04 /output/part-r-00000
[root@localhost hadoop-2.7.2]# hdfs dfs -cat /output/part-r-00000
Hello   2
World   2
[root@localhost hadoop-2.7.2]# 

3.4 hadoop的文件系统

  • hdfs只是hadoop文件系统的一种实现
  • 接口 (hadoop以Java API的方式来提供接口访问)
    • 文件系统的命令解释器就是Java来书写的, 它使用Java的FileSystem类来提供文件系统的操作
    • HTTP 方式, 缓慢, 通过HDFS 代理来完成RPC请求
    • C语言
    • NFS
    • FUSE

3.5 Java接口

  • 从hadoop的URL直接读取数据
    • 设置URL 使用Fs的流处理器工厂模式,
      static {
      URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
      }
    • 使用java.net.URL对象打开数据流, 从中读取数据
    • InputStream in = new URL("hdfs://host/path"). openStream() ;
    • 使用后进行关闭, IOUtils.closeStream()
  • 使用通用的File System的文件系统API来读取数据
    • seek(index) ,将流的指针指向指定的index 的字符位置
    • read(position, offset),从一个指定的偏移量出读取指定的文件的一部分
    • create(),写入文件,自动创建父类,选择不同的模式;可以指定create(inputStream)
    • append(path),追加文件内容
    • mkdirs(Path),创建目录
  • 3.5.5 创建文件系统
    • 文件的元数据 FileStatus类,封装了文件系统中文件和目录的元数据 getFileStatus()
    • 列出文件,查找一个文件或者目录相关的信息很实用;listStatus()
    • Hadoop支持的通配符与Unix bash shell支持的相同,如 “path。toString().match(regex)”
    • 删除数据, delete()
  • 3.6 数据流 TODO
    • 剖析文件读取
    • 剖析文件写入
    • 一致模型
  • 3.7 通过distcp 并行复制 TODO

你可能感兴趣的:(《Hadoop权威指南 第4版》 - 第三章 Hadoop分布式文件系统 - 设计概念/数据流/Java接口)