思考
- 如何设计HDFS?
- 首先明白HDFS是干嘛的?简单来说就是存数据的,所以有以下几点势必需要注意
- 首先要能存大规模数据,TB级甚至PB级
- 分布式系统容易出现故障,出现故障如何快速处理?
- 一致性如何做的?这也是分布式系统的顽疾
- 首先明白HDFS是干嘛的?简单来说就是存数据的,所以有以下几点势必需要注意
- Hadoop是如何做的?
- 大文件被切分成block,将block存储在不同节点上,同时通过Namenode存储文件对应block信息
- block做数据冗余,并且均衡分布在不同节点中,这样最大程度保证挂掉可以随时恢复
HDFS架构
架构:主从架构
- 组成部分
- Namenode
- 管事节点,所有请求都要先经过Namenode,存储HDFS元数据,处理client的请求,以及当datanode节点宕机时恢复和切换
- DataNode
- 干活的,存储数据
- secondary Namenode
- 不是namenode的备份,是二老板角色,替Namenode分担一些任务,进行元数据合并用,关键时刻Namenode挂了也可以顶上去,但是注意的是可能会存在数据丢失风险
- HDFS Client
- 将文件切分成block,进行上传
- 向namenode发送请求和接受响应
- 向datanode执行真正的读写操作
- 管理HDFS,可以格式化Namenode
- Namenode
元数据
有好多人好奇,到底元数据是什么?元数据就好比电话簿,存储的都是索引信息
元数据存储在哪?内存+磁盘,内存读取快,减少IO,但是挂了无法恢复,所以需要定期存到磁盘中,也就是内存满了然后刷到缓冲区,然后写到磁盘中,MySQL也是类似逻辑
内存元数据
- 目录树结构FileSystem
- 文件File和切换Block之间的映射数据,也就是File包含哪些个Block
- Block和节点之间的关系,也就是Block存储在那些个节点上
磁盘元数据
俺也一样,不过我还得存储DataNode数据
Hadoop优缺点
- 高容错
- 多个副本提高容错性,某一个挂了可以自动恢复
- 适合处理大规模数据
- 扩展性好,能存储TB PB级别的数据
- 对机器要求低,机器差架不住我副本多呀
- 一次写入,多次读取
缺点:
-
数据访问延迟高,所以实时性要求高的数据可以考虑HBase ES等No SQL数据库
-
不适合小文件存取
- 太多小文件会占用过多的元数据空间,造成寻址时间长,读写效率都受影响。
-
不支持并发写入,文件不能修改
- 一个文件只能有一个写入着,想着并发写提高性能不存在
- 不允许修改,敢情你还真把我当数据库了?当然了并不是严格意义上不允许,你可以修改源码呀(手动滑稽)
-
过多小文件会给HDFS带来什么?
- 首先元数据存储在Namenode中,存取大量小文件会消耗大量寻址时间,这是操作系统知识了,有兴趣同时可以翻翻操作系统中的磁盘寻址
- 一个文件大小为10k,一亿个才1TB,但是Namenode内存占用就20G了
-
HDFS文件块设置
-
块大小如何定义?
- 老版本默认64M,新版本默认128m,可以通过配置dfs.blocksize调整
-
为什么是这么大?
- 显然是效率最高
-
HDFS Shell操作
常用参数介绍:
命令 | 功能 | 示例 |
---|---|---|
-help | 输出这个命令参数手册 | hadoop -help hadoop fs -help hadoop fs -help Is |
-Is | 显示目录信息 这些参数中,所有的hdfs路径都可 以简写成hadoop fs -Is /等同上条 命令的效果 | hadoop fs -Is hdfs://hadoop02:9000/ |
-mkdir | 在hdfs上创建目录 | hadoop fs -mkdir -p /aa/bb/cc/dd |
-put | 等同于copyFromLocal,进行文件 上传 | hadoop fs -put /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 |
-get | 等同于copyToLocal ,hdfs文件下载到本地 | hadoop fs -get /aaa/a.gz |
---|---|---|
-getmerge | 合并下载多个文件 | hdfs有多个文件:log.1, log.2,log.3,… hadoop fs -getmerge /aaa/丨og.* ./log.sum |
-cP | 从hdfs的一个路径拷贝hdfs的另 —个齙 | hadoop fs -cp /aaa/jdk.tar.gz /bbb/jdk.tar.gz.2 |
-mv | 在hdfs目录中移动文件 | hadoop fs -mv /aaa/jdk.tar.gz / |
-rm | 删除文件或文件夹 | hadoop fs -rm -「/aaa/bbb/ |
-rmdir | 删除空目录 | hadoop fs -rmdir /aaa/bbb/ccc |
hadoop fs - moveFromLocal | ||
moveFromLocal | 从本地剪切到hdfs | /home/hadoop/a.txt /aa/bb/cc/dd |
hadoop fs - moveToLocal | ||
-moveToLocal | 从hdfs剪切到本地 | /aa/bb/cc/dd |
U /home/hadoop/a.txt | ||
-copyFromLocal | 从本地文件系统中拷贝文件到hdfs 文件系统去 | hadoop fs -copyFromLocal ./jdk.tar.gz /aaa/ |
-copyToLocal | 从hdfs拷贝到本地 | hadoop fs -copyToLocal /aaa/jdk.tar.gz |
hadoop fs -appendToFile ./hello.txt hdfs://hadoop- | ||
-appendToFile | 細一个文件到已经細勺文件末尾 | serverOI :9000/hello.txt hadoop fs -appendToFile ./hello.txt /hello.txt |
-cat | 显示文件内容 | hadoop fs -cat /hello.txt |
-tail | 显示一个文件的末尾内容 | hadoop fs -tail /web I og/a ccess」og. 1 |
-text | 以字符形式打印一个文件的内容 | hadoop fs -text /web I og/a ccess J og. 1 |
-chgrp -chmod | Linux文件系统中的用法样,对文 件所属权限 | hadoop fs -chmod 666 /hello.txt hadoop fs -chown |
-chown | someuser:somegrp /hello.txt | |
-df | 统计文件系统的可用空间信息 | hadoop fs -df-h / |
-du | 统计文件夹的大小信息 | hadoop fs -du -s -h /aaa/* |
-count | 统计一个指定目录下的文件节点数量 | hadoop fs -count /aaa/ |
HDFS API操作
这里简单讲一下,毕竟就是调用API操作
-
搭建开发环境,推荐使用IDE
-
引入依赖包
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.7</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs-client</artifactId> <version>2.7.7</version> <scope>provided</scope> </dependency> <artifactId>hadoop-hdfs-client</artifactId> <version>2.7.7</version> <scope>provided</scope> </dependency>
-
-
具体代码较为简单,不再一一展示,如有需要请扫描公众号点击联系我,发送给您具体代码示例
福利
看书看不懂怎么办?学习视频安排!
没有实践项目只会Demo怎么办?实践项目安排!
面试好慌怎么办?面经大全安排!
扫描下方关注,点击联系我,添加vx即可获取Flink大礼包!!
悄悄说一下,有找不到的学习资源也可以私信答主,毕竟我是行走的资源库