Hadoop
hadoop—Hdfs
存储模型:字节
-
文件线性切割成块(Block)(1.x 64M 2.x 128M):偏移量 offset(byte)
-
Block分散存储在集群节点中
-
单一文件Block大小一致,文件与文件可以不一致
-
Block可以设置副本数,副本分散在不同节点中
- 副本数不要超过节点数
-
文件上传可以设置Block大小和副本数
-
已上传Block副本数可以调整,大小不变
-
只支持一次写入多次读取,同一时刻只有一个写入者
-
可以append追加数据,不可以修改
架构模型
- 文件元数据MetaDate,文件数据
- 元数据
- 数据本身
- (主)NameNode节点保存文件元数据(文件的描述信息,在程序中会维护NamoNode自身的一个):单节点posix
- (从)DataNode节点保存文件Block数据:多借点
- DataNode与NamoNode保持心跳,提交Block列表
- HdfsClient与NameNode交互元数据信息
- HdfsClient与DataNode交互文件Block数据
HDFSClient在和NameNode交互完以后便可以和DataNode进行交互
小结
最简单的存储过程,当向HDFS系统中上传一个文件时,文件会被线性分割成块,经过和NamoNode进行交互,这时NameNode会根据与DataNode之间的心跳反馈来决定这一个块数据有哪一个DataNode节点来存储,所以说NameNode只是其记录作用,记录文件的基本信息,即元数据,为真正的数据则是由NamoNode分配给的DataNode节点来存储。
NameNode
-
基于内存存储:不会和磁盘发生交换
- 只会在 内存中
- 持久化
-
NameNode主要功能:
-接受客户端的读写服务
-收集DataNode汇报的Block列表信息 -
NameNode保存metadata信息包括
-文件owership和permissions
-文件大小,时间
-(Block列表:Block偏移量),位置信息
-Block每副本位置(由DataNode上报)
NameNode持久化
- NameNode的metadata信息在启动后会加载到内存
- metadata存储到磁盘文件名为“fsimage”
- Block的位置信息不会保存到fsimage
- edits记录对metadata的操作日志
Secondary NameNode
- 注意它不是namenode的备份,namenode的备份时standByNamenode
- 它是namenode的助手
- 当用户想hdfs中添加或删除文件时,涉及到元数据的修改,涉及到namenode对于元数据的读写,为了降低负担,只更改变化的元数据,此时就需要一个服务来合并这些数据,这个服务就是secondary namenode,把namenode吐出的一些小文件合并成一个新的镜像
- 初始镜像为fsimage,小文件叫editlog,将editlog合并到fsimage,此时形成一个新的fsimage
- 一句话简而意之:fsimage=fsimage+editlog
DataNode
- 本地磁盘目录存储数据(Block),文件形式
- 同时存储Block的元数据信息文件
- 启动DN时会向NN汇报block信息
- 通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟没有收到DN的心跳,则认为其已经lost,并copy其上的block到其它DN
HDFS优点:
- 高容错性
- 数据自动保存多个副本
- 副本丢失后,自动恢复
- 适合批处理
- 移动计算而非数据
- 数据位置暴露给计算框架(Block偏移量)
- 适合大数据处理
- GB、TB、甚至PB级数据
- 百万模式以上的文件数量
- 10K+节点
- 可搭建在廉价机器上
- 通过多副本提高可靠性
- 提供了容错和恢复机制
HDFS缺点:
- 低延迟数据访问
- 比如毫秒级
- 低延迟与高吞吐率
- 小文件存储
- 占用NameNode大量内存
- 寻道事件超越读取时间
- 并发写入、文件随机修改
- 一个文件只能有一个写者
- 仅支持append
小文件问题
- 往hdfs中写文件,文件的元数据会加载到namenode内存,当文件数目越多,元数据越多,会造成namenode内存使用溢出,影响集群工作
- 文件越多打开花销越大
- 对于物理内存的占用是十分大的
- 解决:合并小文件
hdfs shell
hdfs dfs -mkdir /temp 创建目录
hdfs dfs -p -mkdir /temp/user 级联创建目录
hdfs dfs -put install.log /temp 上传文件
hdfs dfs -cat install.log 查看文件内容
hdfs dfs -cat install.log | wc -l 查看行数
hdfs dfs -cat install.log | grep data 条件查看
hdfs dfs -chmod 777 -R /temp/user/data/install.log 调整权限
hdfs dfs -rmr /temp/user/install.log 删除文件到垃圾箱
hdfs dfs -rmr -skipTrash /temp/user/install.log 跳过垃圾回收删除
hdfs dfs -get /temp/user/install.log tmp.log 下载文件
hdfs dfs -test -d /user
echo $? 判断目录是否存在 0 存在 1 不存在 -f判断文件
hdfs fsck / 查看集群状况
hdfs dfs -df -h 查看硬盘使用情况
hdfs dfs -du / 每一个目录的使用情况
sudo -u hdfs hdfs dfsadmin -report 生成集群报表
hdfs fsck /temp/events.csv -files -blocks -locations