HDFS(分布式文件系统)
HDFS(分布式文件系统)
-
入门
-
简介
HDFS 全称 Hadoop Distributed File System 中文 Hadoop分布式文件系统。
说明:HDFS技术属于Hadoop内的一个子技术。
作用:解决海量数据存储问题---分布式文件系统(多台计算机存储)
突破单体服务器的存储能力。 -
HDFS架构体系
HDFS核心进程
NameNode
补充: 一个HDFS集群的主节点, 一个集群只有1个.
- 基于内存存储管理文件的元数据信息。(NameNode内存要求高。)
文件名 类型 大小 权限 用户 组
顾超.avi 文件 500MB rwxrwxrwx root root - 是HDFS集群的管理者master:管理集群中所有的datanode。
datanode12 ip地址 磁盘容量 磁盘使用情况
datanode13 ip地址 磁盘容量 磁盘使用情况
目的:掌握datanode健康状况,了解磁盘容量,数据分布的负载均衡。
均衡使用datanode的磁盘空间。
集合多个datanode服务器的网络带宽,提高数据传输速度。 - 接受客户端文件操作的请求(文件元数据操作请求)。
- NameNode存储了文件拆分后的block分布信息:
block0--[ip1,ip2]--起始位置--大小--checksum
block1--所在dn的ip--起始位置--大小--checksum
DataNode
补充: HDFS集群的从节点, 一个集群有多个.
- 管理存储数据文件切分后的block(128MB),存放硬盘上。廉价机器。
- 是HDFS的从机,slave
heartBeat: 定期向namenode发送心跳(3s),告知datanode(ip 磁盘容量),如果超过10分钟,无心跳,则认为NameNode死亡。
blockreport: 定期上报datanode中的存储的block的信息:
db1,发送 dn1上存储的所有文件的block的信息,如果NameNode没有收到的block信息,则判断该block在该dn上失效。 - 接收数据datablock上传下载的客户端请求。
HDFS核心概念
block: 文件切分后的数据块。
大小默认128MB
原因:现有服务器机房局域网网络带宽千兆带宽==125MB/s
说明:
block过大:导致单个block通过磁盘和网络读取读取时间过长,影响该部分数据的处理速度,并且增加单个block传输的失败几率,重试成本过高,浪费IO资源。
block过小:block个数过多,导致namenode内存过度占用,导致不足。
结论:100MB/s的带宽,block设置为128MB
220MB/s左右的带宽,block设置为256MB.
replication:副本(副本因子)
每个block在hdfs的datanode会存储多份。默认replication=3,每个block有3分。
原因:防止datanode因为单点故障,导致数据丢失。
实战参数:一般block的replication就是3个。
checksum:校验和
datanode定期,计算本节点存储的block的checksum,判断是否和之前的checksum保持一致。
说明:datanode掌握block文件是否损坏的判断手段。
-
安装(伪分布式)
下载地址: 点击这里... -
集群规划
-
服务器准备
1. 准备虚拟机-虚拟物理机
1. 设置hostname
hostnamectl set-hostname hadoop10
2. 配置hosts(linux+windows)
vim /etc/hosts
----------以下是文件信息------------
192.168.199.8 hadoop10
补充:
一定要配置windows对集群中所有节点的映射关系。
3. 关闭防火墙
systemctl stop firewalld #关闭防火墙
systemctl disable firewalld # 禁止防火墙开机启动。
4. 安装jdk1.8
[root@hadoop10 modules]# tar zxvf jdk-8u171-linux-x64.tar.gz -C /opt/installs/
[root@hadoop10 installs]# mv jdk1.8.0_171/ jdk1.8
(略)
5. 配置jdk环境变量。
(略)
[root@hadoop10 installs]# vim /etc/profile
# JAVA
# JAVA_HOME
export JAVA_HOME=/opt/installs/jdk1.8/
# PATH
export PATH=$PATH:/opt/installs/jdk1.8/bin/
# CLASSPATH
export classpath=.
加载配置
source /etc/profile
验证
java
3. 安装
1: 安装HDFS(Hadoop中包含HDFS)
解压
[root@hadoop10 module]# tar zxvf hadoop-2.9.2.tar.gz -C /opt/install/
配置环境变量
vim /etc/profile
-------------以下是环境变量-------------
配置HADOOP_HOME
export HADOOP_HOME=/opt/installs/hadoop2.8.3
配置PATH
export PATH=\(PATH:\)HADOOP_HOME/bin:$HADOOP_HOME/sbin
生效配置信息(重新执行profile中的指令,加载配置信息)
source /etc/profile
hadoop目录结构
[root@CentOS ~]# tree -L 1 /usr/hadoop-2.9.2/
/usr/hadoop-2.9.2/
├── bin # hadoop客户端操作相关的脚本程序,hdfs、hadoop、yarn
├── etc # 配置目录xml、文本文件
├── include # 一些C的头文件,无需关注
├── lib # 第三方native实现C实现
├── libexec # hadoop运行时候,加载配置的脚本
├── LICENSE.txt
├── logs # 系统运行日志目录,排查故障!
├── NOTICE.txt
├── README.txt
├── sbin # hadoop服务器端操作相关脚本,通常用于启动服务例如:start|top-dfs.sh
└── share # hadoop运行的依赖jars、内嵌webapp
2: 初始化配置文件(hadoop/etc/hadoop)
hadoop-env.sh — hadoop环境配置(jdk)
core长度-site.xml— Hadoop核心配置文件
hdfs-site.xml—HDFS的个性化配置文件 副本因子
slaves—在哪个节点启动datanode
hadoop-env.sh
# jdk安装目录
JAVA_HOME=/opt/installs/jdk1.8
core-site.xml
配置hdfs入口
- 查看datanode的Web服务
http://hadoop10:50075 - 搭建知识补充
- 日志查看(查看hdfs运行异常)
namenode启动运行日志
hadoop-用户名-namenode-主机名.log
datanode启动日志
hadoop-用户名-datanode-主机名.log
2. HDFS(配置错误修正)
1. 关闭启动的hdfs程序(NN DN)
2. 修改错误的配置文件。
3. data目录清空,重新格式化
hdfs namenode -format
场景: 格式化或者启动hadoop失败。
说明:
hadoop/data文件夹
作用: 保存datanode和namenode持久化的数据。
时机:
1. 格式化hdfs namenode -format 会初始化该目录下的文件。
2. hdfs运行期间产生的数据,会操作该目录中的数据。
必要操作:删除格式化或者启动数据保存的文件目录。
3. Web界面
NameNode的web管理器地址:http://ip:50070.
-
查看管理的datanode的信息
-
管理文件block的元数据。
文件名 用户 用户组 类型 权限 时间 .... -
HDFS客户端
上传文件、下载文件、修改文件名、删除文件、(HDFS中的文件内容一定不会修改) -
HDFS命令
1. 命令所在目录
${hadoop}/bin之下/hdfs
2. HDFS的文件系统结构
和Linux类似。
3. 命令格式
hdfs dfs -xxx -参数
2. 常见命令
命令语法
含义
示例代码
hdfs dfs -ls [-R] hdfs文件路径
查看文件元数据信息
hdfs dfs -ls /
hdfs dfs -mkdir -p /目录a/目录b
新建文件夹,如果父目录不存在则添加-p参数
hdfs dfs -mkdir -p /baizhi/file
hdfs dfs -put linux文件路径 hdfs目录
文件上传
hdfs dfs -put /opt/models/jdk /baizhi
hdfs dfs -get hdfs文件 linux目录
文件下载
hdfs dfs -get /baizhi/jdk1.8 /opt
hdfs dfs -cat hdfs文档路径
查看文件内容
hdfs dfs -cat /baizhi/Test.java
hdfs dfs -rm hdfs文件路径
删除文件
hdfs dfs -rm /baizhi/Test.java
hdfs dfs -rm -r hdfs文件夹
删除文件夹,非空使用-rmr
hdfs dfs -rm -r /baizhi
hdfs dfs -chmod [-R] 权限运算值 hdfs文件
hdfs dfs -chmod [-R] u+x hdfs文件
修改hdfs文件权限
hdfs dfs -chmod o+w /baizhi
hdfs dfs -appendToFile linux本地A文件 HDFS远程B文件
将A文件内容追加到HDFS的B文件的末尾。
hdfs dfs -appendToFile /etc/profile /Test1.java
hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2
移动HDFS文件系统内部文件
hdfs dfs -mv /hdfs/demo1/wordcount1.log /hdfs/demo2
hdfs dfs -getmerge HDFS的文件目录 linux本地文件
将HDFS中的目录下多个文件,合并后下载本地。
hdfs dfs -getmerge /config/*.xml /hello.xml
hdfs dfs -copyFromLocal linux文件路径 hdfs目录
文件上传
hdfs dfs -copyFromLocal jdk-8u191-linux-x64.rpm /
hdfs dfs -copyToLocal hdfs文件 linux本地目录
文件下载
hdfs dfs -copyToLocal /jdk-8u191-linux-x64.rpm /root/
hdfs dfs -moveToLocal 本地文件 HDFS目录(未定义)
HDFS文件移动到客户端本地(下载+删除远程)
hdfs dfs -moveToLocal /dir1/jdk-8u191-linux-x64.rpm /root
hdfs dfs -moveFromLocal HDFS文件 本地目录(可以用)
客户端文件移动到HDFS中(上传+删除本地)
hdfs dfs -moveFromLocal jdk-8u191-linux-x64.rpm /dir1
场景
大量10w小文件在HDFS存储,每个文件1kb,总大小,100MB.
HDFS保存多少元数据:
10w个文件描述信息
10w个block描述信息
HDFS保存多少Block:
10w*3个block.
问题:
产生大量的block描述信息,大量的文件元数据,占用大量的NameNode内存空间,。
解决:
- 使用HDFS命令合并下载本地。 -getmerge
- 将合并后的文件上传即可。
- 原始的小文件删除了。
- Java操作HDFS
- 入门
核心API3
API
含义和作用
Configuration
配置信息,封装hdfs操作的相关配置文件信息
FileSystem
HDFS的分布式文件系统工具,操作HDFS文件。
PATH
表示操作路径
windows开发环境准备(开发和测试需要)
1. 将hadoop2.9.2的软件,解压到window中,路径不能有中文,不能有空格。
2. 拷贝hadoop的windows执行环境工具到bin路径下,替换客户端工具。
3. 配置环境变量
HADOOP_HOME=hadoop安装路径
PATH=hadoop安装路径/bin
4. 重启IDEA或者eclipse
HDFS依赖
1.加入log4j.properties
2. HDFS依赖
// 常见异常:
Permission denied: user=Administrator, access=WRITE, inode="/hdfs":root:supergroup:drwxr-xr-x
// 解决办法:
为上传的hfds目录添加写w权限
hdfs dfs -chmod 777 /hdfs
2. 常见API操作
文件下载
/**
* 需求:从hdfs中下载 /baizhi/demo.tar.gz 文件?
* 命令:hdfs dfs -get /baizhi/demo.tar.gz D:/
*/
@Test
public void test2() throws IOException {
//1. 初始化配置文件
Configuration conf = new Configuration();
conf.set("fs.defaultFS", "hdfs://192.168.199.10:9000");
//2. 获得hdfs操作客户端
FileSystem fs = FileSystem.get(conf);
fs.copyToLocalFile(new Path("/baizhi/demo.tar.gz"), new Path("D:/demo.tar.gz"));// 拷贝到本地。
//
//3. 关闭资源
fs.close();
}
创建文件夹
boolean isok = fileSystem.mkdir(new Path("/baizhi/yangdddir"));//返回值boolean,是否创建成功。
判断文件是否存在
boolean isexist = fileSystem.exists(new Path("/baizhi/yangdd"))
删除文件
/**
参数1:远端hdfs的文件路径
参数2:是否递归删除,如果给false,删除无法递归则会抛出异常
返回值:是否删除成功
*/
Boolean deleteOK = fileSystem.delete(new Path("hdfs文件路径"),true);
所有的文件和目录
// 获得目录下所有文件和目录的元数据== hdfs dfs -ls /hdfs
FileStatus[] fileStatuses = fs.listStatus(new Path("/hdfs"));
for (FileStatus file : fileStatuses) {
//1. 获得文件路径
Path path = file.getPath();
//2. 获得文件权限
FsPermission permission = file.getPermission();
//3. 获得文件副本数
short replication = file.getReplication();
//4. 获得文件修改时间,long的时间戳
long modificationTime = file.getModificationTime();
//5. 获得文件大小,单位B
long len = file.getLen();
}
读取文件信息及其block信息
/**
- 功能:递归获得目录下的所有文件的元数据信息,相当于hdfs的ls命令
- listFiles参数1:要查看的目录
- listFiles参数2:是否递归 -R
*/
RemoteIteratorfiles = fs.listFiles(new Path("/hdfs"), true);
while(files.hasNext()){
//迭代获得每个file元数据
LocatedFileStatus file = files.next();
//1. 获得文件路径
Path path = file.getPath();
//2. 获得文件权限
FsPermission permission = file.getPermission();
//3. 获得文件副本数
short replication = file.getReplication();
//4. 获得文件修改时间,long的时间戳
long modificationTime = file.getModificationTime();
//5. 获得文件大小,单位B
long len = file.getLen();
//6. 获得block的切片分布信息
BlockLocation[] blockLocations = file.getBlockLocations();
}
- HDFS原理相关
- Trash回收站
HDFS为了规避由于用户的误操作,导致的数据删除丢失,用户可以在构建HDFS的时候,配置HDFS的垃
圾回收功能。所谓的垃圾回收,本质上是在用户删除文件的时候,系统并不会立即删除文件,仅仅是将
文件移动到垃圾回收的目录。然后更具配置的时间,一旦超过该时间,系统会删除该文件,用户需要在
到期之前,将回收站的文件移除垃圾站,即可避免删除
持久化结论
1. HDFS接受客户端的文件操作后。
2. 先将操作的命令 以日志的方式记录到editslog中。
3. 然后再将指令对应的文件元数据的修改操作,修改内存中的元数据信息。
4. SNN定期负责将editslog中的文件合并到fsimage中。
- checkpoint机制
生活案例
SNN的checkpoint工作机制
- SecondaryNameNode向NameNode发起合并请求
- NameNode将当前的Editslog文件保存改名edits,并新建EditsLog继续持久化工作。
- 将改名后的edits文件和本地的FSImage(旧)发送给sencondaryNameNode
- SecondaryNameNode负责将FSImage(旧)+edits文件合并成FSImage(新)
- 将新的FSImage(新)发送给NameNode保存。
checkpoint触发条件(时机)
每1分钟检查一次触发条件。(SNN没隔1分钟,访问一次NN)
- 每隔1小时触发一次checkPoint
- 每100w次操作,触发一次checkpoint
下面的配置信息对应hdfs-site.xml
name
value默认
含义
dfs.namenode.checkpoint.period
3600
3600秒触发一次,数据合并。checkpoint
dfs.namenode.checkpoint.txns
1000000
100w次操作触发一次
dfs.namenode.checkpoint.check.period
60
1分钟检查一次操作次数
SecondaryNameNode节点定制(集群中讲)
SNN和NN在一个服务器是上,存在单点故障。
场景:一旦服务器磁盘崩坏,持久化的数据就会全部丢失。
解决:SNN 和NN放在不同的服务器上。
1. 配置hdfs-site.xml中的SNN的节点地址
2. 将修改hdfs-site的配置同步到其他节点。
2. 单独启动SecondaryNameNode
hadoop-deamon start secondarynamenode
3. HDFS启动流程-NameNode安全模式(SafeMode)
时机
HDFS启动过程中, 会进入一个特殊状态(SafeMode),该状态下NameNode暂停接受客户端文件修改操作(只能接收文件读操作)
HDFS启动流程-启动过程自动完成。
- NameNode启动,加载最新的fsimage恢复数据,并加载未合并的editslog_inprogress,进一步恢复数据。--- NN管理内存数据完整。
- 等待接受DataNode的心跳 HeartBeat
DN的本节点地址 健康状态 磁盘容量 剩余容量 版本号。 - 等待接受DataNode的块报告 Block Report,判断是否满足最小副本因子(默认值1 dfs.namenode.replication.min),达到了, 则认为当前Block是安全的,完整的。
DN的本节点的内全部Block的信息: block的id offset length。 - NameNode发现HDFS集群中所有的block的安全(完整)比例是否达到99.9%(dfs.namenode.safemode.threshold-pct), 如果达到,则立刻退出安全模式。
① 为什么要设置最小副本因子为1: 只要有1块完整,block数据即是完整,没必要等全部完整。 - HDFS退出安全模式,才能正常工作。
手动安全模式
理由:实际开发中为了对HDFS进行维护,会手动NameNode进入安全模式
注意:safemode安全模式下,只能对HDFS中文件进行读操作,不能进行写操作(上传 修改 删除 移动)
-
查看hfds安全模式状态
hdfs dfsadmin -safemode get -
进入安全模式
hdfs dfsadmin -safemode enter -
退出安全模式
hdfs dfsadmin -safemode leave -
文件上传流程
详细参考:看这里... 和 这里... -
副本存放机制—机架感知(rack-aware)
考虑要素:
- HDFS集群的DN有很多台节点。
- 节点内部的网络数据传输, 速度最快.
- 机架内可以安装多台服务器, 节点之间网络带宽, 由于机架之间的网络带宽.
机架感知-副本存放策略(hadoop2.7.6以前)--旧版本
- 第一个block副本放在客户端所在的服务器的datanode中。
- 第二个block副本放置在本机架内的其它数据节点datanode上
- 第三个block副本放置在不同机架的随机某个节点上。(防止某个机架数据丢失)
副本存放策略(hadoop2.8.4以后)--新版本
-
第一个block副本,放在client所在的节点
-
第二个block副本,放在另一个机架上的某个节点上。
-
第三个block副本,放在第二个机架的不同节点上。
-
文件下载流程
-
block和checksum(略)
-
HDFS完全分布式集群搭建(Hadoop1.X)
-
SSH免密登录
start-x启动的原理。
start-dfs.sh和stop-dfs.sh
会远程登录到NN和DN对应的节点执行hadoop-deamon.sh start namenode 或者hadoop-deamon.sh start datanode命令启动对应节点的服务。
免密登录设置
0:ip hostname hosts的设置要在免密登录设置之前。
-
生成一对秘钥(私钥+公钥)
ssh-keygen -
将公钥拷贝到被免密登录的机器上。
ssh-copy-id root@ip -
HDFS分布式集群搭建
-
集群规划
-
服务器准备 * 3
1. 准备虚拟机
-
hostname
-
ip
-
hosts
-
防火墙
-
jdk和环境变量配置
-
HDFS集群搭建
① 免密登录的设置 -
生成秘钥
[root@hadoop11 hadoop]# ssh-keygen -
发送公钥到集群所有节点 hadoop11 hadoop12 hadoop13
[root@hadoop11 hadoop]# ssh-copy-id hadoop11
[root@hadoop11 hadoop]# ssh-copy-id hadoop12
[root@hadoop11 hadoop]# ssh-copy-id hadoop13 -
验证免密登录效果
ssh root@hadoop13
② 安装HDFS(先安装1台) -
解压hadoop
-
配置环境变量
HADOOP_HOME
PATH -
重新加载配置文件。
③ 初始化配置文件(1台)
- hadoop-env.sh
Java_HOME - core-site.xml
NN入口地址
数据保存的data目录 - hdfs-site.xml
副本数 - slaves (配置多个DN节点,最好使用vi编辑器)
DN节点所在主机的IP
指定SecondaryNameNode节点定制。
1. 配置hdfs-site.xml中的SNN的节点地址
2. 将修改hdfs-site的配置同步到其他节点。
④ 同步配置文件到其他节点
注意事项
一个hadoop集群中,所有hadoop配置文件要完全一致。
将本机的hdfs配置同步到其他机器。
⑤ 初始化HDFS集群
5. 初始化HDFS
- 删除hadoop的data文件夹
- 格式化集群
在namenode节点执行格式化。
hdfs namenode -format
⑥ 配置window访问hdfs的集群的ip映射
⑥ 启动HDFS集群
在拥有免密登录权限的节点上执行:
start-dfs.sh

浙公网安备 33010602011771号