目录
HDFS
概念
当数据集的大小超过一台独立的计算机的存储能力的时候,这个时候就有必要对文件进行分区(partiiton)存储在若干台计算集上。管理网络中跨多台计算机存储的文件系统,叫做分布式文件系统(Distribute FileSystem )。该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂,比如说:必须要容忍因为节点故障且不会引起数据丢失。
Hadoop 自带一个称为HDFS分布式文件系统(Hadoop Distribute FileSuystem)。HDFS 以流式数据访问模式来存储超大文件,运行与商用硬件集群上。
- 超大文件:在这里指的是具有几百MB、几百GB、甚至几百TB大小的文件。
- 流式数据访问模式:一次写入,多次读取是最高效的设计模式。
- 低时间延迟的数据访问:要求低延迟的数据访问的应用,例如几十毫秒,不适合在HDFS上运行。(HDFS是为高吞吐量优化的,这可能会以提高时间延迟为代价)
- 大量小文件:
- 多用户写入,任意修改文件:HDFS中的文件写入只支持单写入者,而且写入者只以“追加”的方式在文件末尾写数据,不支持多个写入者,也不支持在任意位置修改数据。
HDFS的概念
- 数据块(block):默认128MB。
- namenode 和 datenode
- 块缓存:
- 联邦HDFS: viewfs://URI
存儲模型:字节
- 文件线性切割成块(Block):偏移量Offset(byte)(Block切割字符的下标)
- Block分散存储在集群节点上
- 单一文件Block块大小一致,不同文件的Block块大小可以不一致。
- Block可以设置副本数,副本(数据的可靠性。可用性)分散在集群不同的节点中。
--副本数不可以超过节点数量
- 文件上传可以设置Block大小和副本数量
- 已上传的Block副本数可以调整,大小不变
- 只支持一次写入(append追加在文件末尾),多次读写,同一时刻只允许有一个写入者
架构模型
- 文件元数据MataData,文件数据
- (从)数据本身(Block数据)存储在DateNode:多节点
- (主)元数据(文件名、大小、块信息等)存储在namenode:单节点
- DataNode 和NameNode保持心跳,提交Block列表信息
- HdfsClient和NameNode交换元数据信息
- HdfsClient和DataNode交换Block数据
NameNode(NN)
- 基于内存存储:不会和磁盘发生交换
- 只存在内存中
- 持久化(运行是单向落在磁盘中,重启的时候读回来,具体方法后面)
- NameNode主要功能
- 接收客户端的读写功能
- 收集DateNode汇报的Block信息
- NamoNode保存的metaData信息包括
- Block块列表(偏移量)(持久化存储的信息),位置信息(数据存储的位置)
- 副本的存储位置(由DataNode(心跳)上报)
- 文件大小,时间
NameNode持久化
- NameNode的metadata信息会在启动会加载到内存
- matadata存储到磁盘的名称为fsimage
- Block块信息不回保存到fsimage
- edits(editsLog)记录对metadata的操作日志
- (合并fsimage 和 editsLog ,缩短集群恢复的时间)
DataNode(DN)
- 本地磁盘存储数据(Block),文件形式
- 同时存储Block的元数据信息
- 启动DN时会向NN汇报block信息
- 通过向NN发送心跳保持与其联系(3秒一次),如果NN十分钟没有收到DN的心跳,认为其已经lost,会copy其上的block到其他DN
SecondaryNameNode(SNN)(1.x)
- 它不是NN的备份(但是可以做备份),它的主要工作是帮助NN合并editslog,减少NN启动时间
- SNN执行合并时机
- 根据配置文件设置的时间间隔<fs.checkpoint.period>,默认3600秒
- 根据配置文件设置的edits log 大小,fs.checkpoint.size,默认大小64MB
Block的副本放置策略
- 第一个副本放置在上传文件的DN上,
- 第二个副本放置在与第一个副本不同的机架的节点上
- 第三个副本放置在与第二个副本相同的机架上不同节点上
HDFS写流程
HDFS读流程
- open-->getBlockLocationInfo-->read
HDFS安装
- 环境:CentOS-6.10-x86_64-minimal.iso
- JDK:jdk-8u171-linux-x64.tar.gz
- Hadoop:hadoop-2.6.0.tar.gz
- 1、首先安装上传下载功能
root 账号登陆后执行以下命令:
yum
install
-y lrzsz
- 2、mkdir -p /usr/local/java
- 3、cd /usr/local/java/
- 4、rz -e jdk-8u171-linux-x64.tar.gz 或者 rz -be jdk-8u171-linux-x64.tar.gz
- 5、tar -zxvf jdk-8u171-linux-x64.tar.gz
- 6、pwd (复制当前路径)
- 7、vim /etc/profile
- 8、JAVA_HOME=/usr/local/java/jdk1.8.0_181
JRE_HOME=/usr/local/java/jdk1.8.0_181/jre
CLASSPATH=.:$JAVA_HOME:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$JAVA_HOME/lib/dt.jar
PATH=$JAVA_HOME/bin:
export PATH JAVA_HOME CLASSPATH - 9、 source /etc/profile
- 10、java -version
常用命令:
-
default.fs="hdfs://localhost/"
-
dfs.replication=3
-
hdfs 默认端口8020 运行namenode