为什么要用HDFS
- 一台服务器存不下数据,需要多台服务器。多台服务器上的数据需要一个系统来组织和管理。
tip:HDFS、NTFS是不同的文件管理系统
HDFS的定义
- HDFS是一个分布式的文件系统,通过目录树来定位文件
HDS的使用场景
- 一次写入,多次读出,不支持文件的修改,并且数据读取慢
- 适合做数据分析的存储
优点
-
高容错
自动保存多个副本,当节点数足够的时候,会自动保持副本份数。如10个节点,3个副本,一台挂掉,那么这台节点上的数据会被转存到其他节点,保证副本份数。
-
适合做大数据,大文件规模,GB,TB,PB
缺点
- 不适合低延时的数据访问,毫秒级的响应不适合
- 无法高效的对大量小文件存储
- 每一个小文件,在NameNode中会消耗150字节的内存,小文件多,会占用大量NameNode 的内存存储
- 小文件的存储寻址的时间超过了读取时间,违背设计原则
- 不支持并发写入数据,即两个客户端无法同时写入相同的文件,不同文件可以并发写入
- 不支持随机写操作,即无法修改文件
组成架构
NameNode
- 管理HDFS名称空间
- 管理数据块的映射信息
- 处理客户端的读写请求
DataNode
- 存储实际的数据块
- 执行数据块的读写请求
客户端
- 文件切块:上传文件的时候,客户端将文件切分成Block,然后上传
- 与NameNode交互,获取文件位置信息
- 与DataNode交互,读取或写入数据
- 提供命令管理、访问HDFS
2ndNameNode
- 辅助NameNode工作,合并fsimage和edits
- 紧急情况下,可辅助恢复NameNode
块大小设置
设置方法
- 默认大小Hadoop 2.x是128MB(),1.x是64MB。
- hdfs-site中,dfs.blocksize设置(字节)
设置原则
- 块的寻址约10ms,1%,1s,磁盘速率100MB/s,所以一个块大约128MB,
- 当磁盘速率较高的时候,可以设置为256MB。
- HDFS块大小取决于磁盘传输速率。
为什么块的大小不能太大或太小?
- 太小:块数太多,增加块的寻址时间同时增加内存消耗
- 太大:并行度减小
HDFS的shell操作
hadoop fs和hdfs dfs的关系,后者是前者的实现类。
# 查看HDFS节点状态
hdfs dfsadmin -report
# 帮助命令
hadoop fs -help rm
# 地柜查看目录
hadoop fs -ls -R /
# 创建多及目录
hadoop fs -mkdir -p /sanguo/shuguo
# 剪切本地文件到HDFS,本地文件会消失
hadoop fs -moveFromLocal 本地文件 目标地址
# 复制本地文件到HDFS
hadoop fs -copyFromLocal 本地文件 目标地址
# 复制HDFS文件到本地
hadoop fs -copyToLocal 目标文件 本地地址
# 追加
hadoop fs -appendToFile 源文件 目标文件
# 合并一个目录下的多个文件,下载到本地,如一个目录下的多个log文件合并,
hadoop fs -getmerge /user/*.log ./my_log.txt
# 查看文件尾部,查看日志尾部,一般最新的日志都在最后面
hadoop