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#/
执行一次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()
- 设置URL 使用Fs的流处理器工厂模式,
-
使用通用的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