HDFS
HDFS概述
1、HDFS概念
HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,他是分布式的,有很多服务器联合起来实现器功能
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,不适合做网盘的应用
2、HDFS优缺点
优点
1、高容错性
1、数据自动保存多个副本,通过增加多副本的形式提高容错性
2、一个副本丢失,它可以自动恢复
2、适合大数据处理
1、数据规模:能够处理数据规模达到GB,TB甚至PB级别的数据
2、文件规模:能够处理百万规模以上的文件数量
3、流式数据访问,能够保证数据的一致性
4、可构建在廉价的机器上,通过多副本机制,提高可靠性
缺点
1、不适合低延时数据访问
2、无法高效的对大量小文件进行存储
1、存储大量小文件,会占用namenode大量内存来存储文件、目录和块信息
2、小文件存储的寻道时间会超过读取时间
3、不支持并发写入,文件随即修改
1、一个文件只能有一个写,不允许由多个线程同时写
2、仅支持数据append(追加),不支持文件的随机修改
HDFS组成架构
hdfs架构
1、client:客户端
1、文件切分。文件上传HDFS时,client将文件切分成一个个block块,进行存储
2、与namenode交互,获取文件的位置信息
3、与datanode交互,读取或者写入数据
4、client提供一些命令来管理和访问HDFS
2、namenode:Master(管理者)
1、管理HDFS的名称空间
2、管理数据块(block)映射信息
3、配置副本策略
4、处理客户端读写请求
3、datanode:slave,namenode下达命令,datanode执行实际的操作
1、存储实际的数据块
2、执行数据块的读写操作
4、SecondaryNameNode:并非namenode的热备。当namenode挂掉的时候,他不能马上替换namenode
1、辅助namenode,分担其工作量
2、定期合并Fsimage和Edits,推送给namenode
3、在紧急情况下,辅助恢复namenode
HDFS文件块大小
HDFS的Shell操作
1、基本语法
hadoop dfs 具体命令/hdfs dfs 具体命令
2、命令大全
hadoop dfs
3)常用命令实操
(0)启动Hadoop集群(方便后续的测试)
(1)-help:输出这个命令参数
(2)-ls: 显示目录信息
(3)-mkdir:在hdfs上创建目录
(4)-moveFromLocal从本地剪切粘贴到hdfs
(5)-appendToFile :追加一个文件到已经存在的文件末尾
(6)-cat :显示文件内容
(7)-tail:显示一个文件的末尾
(8)-chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限
(9)-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去
(10)-copyToLocal:从hdfs拷贝到本地
(11)-cp :从hdfs的一个路径拷贝到hdfs的另一个路径
(12)-mv:在hdfs目录中移动文件
(13)-get:等同于copyToLocal,就是从hdfs下载文件到本地
(14)-getmerge :合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
(15)-put:等同于copyFromLocal
(16)-rm:删除文件或文件夹
(17)-rmdir:删除空目录
(18)-du统计文件夹的大小信息
(19)-setrep:设置hdfs中文件的副本数量
HDFS客户端操作
HDFS客户端环境准备
在windows环境下安装本地的Hadoop,wintuils.exe软件
子主题 3
HDFS的API操作
3.2.1 HDFS文件上传(测试参数优先级)
1)详细代码
1 获取文件系统
2 上传文件
3 关闭资源
2)将hdfs-site.xml拷贝到项目的根目录下
3)参数优先级
(1)客户端代码中设置的值 >(2)classpath下的用户自定义配置文件 >(3)然后是服务器的默认配置
HDFS文件下载
1 获取文件系统
2 下载文件
3 关闭资源
HDFS目录创建
1 获取文件系统
2 创建目录
3 关闭资源
HDFS文件夹删除
1 获取文件系统
2 删除文件夹
3 关闭资源
HDFS文件名更改
1 获取文件系统
2 重命名文件或文件夹
3 关闭资源
HDFS文件详情查看
查看文件名称、权限、长度、块信息
HDFS文件和文件夹判断
1 获取文件系统
2 判断是文件还是文件夹
3 关闭资源
3.3 HDFS的I/O流操作
3.3.1 HDFS文件上传
1 获取文件系统
2 创建输入流
3 获取输出流
4 流对拷
5 关闭资源
3.3.2 HDFS文件下载
1)需求:从HDFS上下载文件到本地控制台上。
2)实操:
1 获取文件系统
2 获取输入流
3 获取输出流
4 流对拷
5 关闭资源
3.3.3 定位文件读取
1)下载第一块
1 获取文件系统
2 获取输入流
3 创建输出流
4 流的对拷
5 关闭资源
2)下载第二块
1 获取文件系统
2 打开输入流
3 定位输入数据位置
4 创建输出流
5 流的对拷
6 关闭资源
3)合并文件
在window命令窗口中执行
HDFS的数据流
HDFS写数据流程
1、客户端通过Distributed FileSystem模块向namenode请求上传文件,namenode检查目录文件是否已存在,父目录是否存在,查看是否有权限
2、namenode返回是否可以上传
3、客户端发送请求第一个block上传到那几个datanode服务器上
4、namenode返回3个datanode节点,dn1,dn2,dn3
5、客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成
6、dn1、dn2、dn3逐级应答客户端
7、客户端开始往dn1上传第一个block(先从磁盘读取数据放到本地内存缓存),以packet为单位,dn1收到packet就会传到dn2,dn2传到dn3
8、当一个block传输完成后,客户端再次请求namenode上传第二个block的服务器(重复执行3-7步)
HDFS读数据流程
1、客户端通过Distributed FileSystem向namenode请求下载文件,namenode通过查询元数据,找到文件块所在datanode地址
2、挑选一台Datanode服务器,请求读取数据
3、datanode开始传输数据给客户端(从磁盘里面读取数据输入流,以packet为单位来做校验)
4、客户端以packet为单位接受,先在本地缓存,然后写入目录文件
Namenode和SecondaryNamenode
1、NN&2NN工作机制
1、第一阶段:namenode启动
1、第一次启动namenode格式化后,创建FSimage和Edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2、客户端对元数据进行增删改的请求
3、namenode记录操作日志,更新滚动日志
4、namenode在内存中对数据进行增删改
2、Fsimage和Edits解析
1、概念
namenode被格式化之后,在指定目录产生文件
1、Fsimage文件:HDFS文件系统元数据的一个永久性的检查点,其中包含HDFS文件系统的所有目录和文件idnode的序列化信息
2、Edits文件:存放HDFS文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到edits文件中
3、seen_txid文件保存的是一个数字,就是最后一个edits_的数字
4、每次Namenode启动的时候都会将fsimage文件读入内存,并从00001开始到seen_txid中记录的数字依次执行每个edits里面的更新操作,保证内存中的元数据信息是最新的、同步的,可以看成Namenode启动的时候就将fsimage和edits文件进行了合并。
2、oiv查看fsimage文件
1、查看oiv和oev命令
2、基本语法
hdfs oiv -p文件类型 -i镜像文件 -o 转换后文件输出路径
3、实例实操
部分显示结果
3、oev查看edits文件
1、基本语法
hdfs oev -p 文件类型 -i 编辑日志 -o 转换后文件输出路径
2、实例实操
显示结果
3、checkpoint时间设置
1、通常情况下,SecondaryNameNode每隔一小时执行一次
2、一分钟检查一次操作次数,当操作次数达到一百万时,secondaryNamenode执行一次
4、secondaryNamenode目录结构
5、namenode故障处理办法
1、将Secondarynamenode中数据拷贝到namenode存储数据的目录
2、使用importCheckpoint选项启动namenode守护进程,从而将secondarynamenode中的数据拷贝到namenode目录中
6、集群安全模式
概述
2、基本语法
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式
1、hdfs dfsadmin -safemode get 查看安全模式状态
2、hdfs dfsadmin -safemode enter 进入安全模式
3、hdfs dfsadmin -safemode leave 离开安全模式
4、hdfs dfsadmin -safemode wait 等待安全模式
7、namenode多目录配置
1、namenode的本地目录可以配置多个,且每个目录存放内容相同,增加了可靠性
2、具体配置
1、在hdfs-site.xml文件中增加
2、停止集群,删除data和log中所有的数据
3、格式化进群并启动
4、查看结果
DataNode
1、DataNode工作机制
2、数据完整性
1、当DataNode读取block的时候,它会计算checksum
2、如果计算的后的checksum,与block创建时值不一样,说明block已经损坏
4、datanode在其它文件创建后周期验证checksum
3、掉线时限制参数设置
4、服役新数据节点
0、需求
随着公司业务的增长数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点
1、环境准备
1、克隆一台虚拟机
2、修改ip地址和主机名称
3、配置免密登录,增加新增节点的同步ssh
4、删除原来HDFS文件系统留存下来的文件
2、服役新节点具体步骤
1、在namenode的hadoop的/etc/hadoop目录下创建dfs.hosts文件,添加新服役的节点主机名
2、在namenode的hdfs-site.xml配置hdfs.hosts属性
3、刷新namenode
hdfs dfsadmin -refreshNodes
Refresh nodes successful
4、更新resourcemanager节点
yarn rmadmin -refreshNodes
5、在namenode的slaves文件中增加新主机名称
6、单独命令启动新的数据节点和节点管理器
7、在web浏览器上查看是否有新增节点
4、如果新增节点数据不均衡,可以使用命令实现集群再平衡
5、退役旧的数据节点
1、在namenode的Hadoop的etc/hadoop目录下创建dfs.hosts.exclude文件
2、在namenode的hdfs-site.xml配置文件中增加dfs.hosts.exclude属性
3、刷新namenode、刷新resourcemanager
4、检查web浏览器,退役节点状态为decommission inprogress(退役中),说明数据节点正在复制块到其它节点
5、等待退役节点状态为decommissioned(所有块已经复制完成),停止该节点及节点资源管理器。注意:如果副本数时3,服役节点小于等于3,是不能退役成功的,需要修改副本数后才能退役
6、从include文件中删除退役节点,在运行刷新节点的命令
1、从namenode的dfs.hosts文件中删除退役节点
2、刷新namenode,刷新resourcemanager
7、从namenode的slave文件中删除退役节点
8、如果数据不均衡。可以使用命令实现集群的再平衡
6、Datanode多目录配置
1、datanode可以配置成多个目录,每个目录存储的数据不一样。数据不是副本
2、具体配置 hdfs-site.xml
HDFS 2.X新特性
1、集群间数据拷贝
1、scp实现两个远程主机之间的文件复制
2、采用disscp命令实现两个Hadoop集群之间的递归数据复制
2、Hadoop存档
1、hdfs存储小文件弊端
2、解决存储小文件办法
3、实例实操
1、需要启动yarn进程
2、归档文件
1、把用户目录中所有文件归档成一个叫myhar.har的归档文件,并把归档后文件存储到指定目录文件下
2、[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop archive -archiveName myhar.har -p /user/atguigu /user/my
3、查看归档
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr /user/my/myhar.har
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -lsr har:///myhar.har
4、解归档
[atguigu@hadoop102 hadoop-2.7.2]$ hadoop fs -cp har:/// user/my/myhar.har /* /user/atguigu
3、快照管理
快照相当于对目录做一个备份。并不会立即复制所有文件,而是指向同一个文件。当写入发生时,才会产生新文件。
1)基本语法
(1)hdfs dfsadmin -allowSnapshot 路径 (功能描述:开启指定目录的快照功能)
(2)hdfs dfsadmin -disallowSnapshot 路径 (功能描述:禁用指定目录的快照功能,默认是禁用)
(3)hdfs dfs -createSnapshot 路径 (功能描述:对目录创建快照)
(4)hdfs dfs -createSnapshot 路径 名称 (功能描述:指定名称创建快照)
(5)hdfs dfs -renameSnapshot 路径 旧名称 新名称 (功能描述:重命名快照)
(6)hdfs lsSnapshottableDir (功能描述:列出当前用户所有可快照目录)
(7)hdfs snapshotDiff 路径1 路径2 (功能描述:比较两个快照目录的不同之处)
(8)hdfs dfs -deleteSnapshot <path> <snapshotName> (功能描述:删除快照)
2)案例实操
(1)开启/禁用指定目录的快照功能
(2)对目录创建快照
(3)指定名称创建快照
(4)重命名快照
(5)列出当前用户所有可快照目录
(6)比较两个快照目录的不同之处
(7)恢复快照
HDFS HA高可用
1、HA概述
1、HA,即高可用(7*24小时不中断)
2、消除单点故障
3、hadoop2.0之前,HDFS集群中namenode是存在单点故障SPOF
4、namenode影响集群
1、namenode机器发生意外,如宕机,集群无法使用,指导管理员重启
2、namenode需要升级,包括软件,硬件,此时集群也无法使用
2、HDFS_HA工作机制
通过双namenode消除单点故障
1、HDFS-HA工作要点
1、元数据管理方式需要改变
1、内存那种各自保存一份元数据
2、Edits日志只有active状态的namenode节点可以做写操作
3、两个namenode都可以读取edits;
4、共享的edits放在一个共享存储中管理(qjournal和NFS两个主流实现)
2、需要一个状态管理功能模块
3、必须保证两个namenode之间能够ssh无密码登录
4、隔离(Fence),即同一时刻仅仅有一个namenode对外提供服务
2、HDFS-HA自动故障转移工作机制
3、HDFS-HA集群配置
1、环境准备
1、修改IP,主机名,映射
2、关闭防火墙
4、安装JDK,配置环境变量
2、规划集群
3、配置zookeeper集群
4、配置HDFS-HA集群
1、解压安装Hadoop到指定目录文件夹下
2、配置hadoop-env.sh
配置jdk的安装路径
3、配置core-site.xml
4、配置hdfs-site.xml
5、分发配置文件到子节点
5、启动HDFS-HA集群
1、在各个JournalNode节点上,使用命令启动journalnode
2、在namenode1节点上进行格式化,并启动
3、在namenode2节点上同步namenode1的元数据信息
4、启动namenode2
sbin/hadoop-daemon.sh start namenode
5、查看web页面
6、在namenode1上启动所有的datanode
7、将namenode1切换为active
8、查看namenode1是否活跃active
6、配置HDFS-HA自动故障转移
1、修改配置文件hdfs和core
2、启动
1、关闭所有HDFS服务
2、启动zookeeper集群
3、初始化HA在zookeeper中状态
bin/hdfs zkfc -formatZK
4、启动HDFS服务
5、在各个namenode节点上启动DFSZK Failover Controller,先在那台机器启动那个Namenode就是活跃的(Active)
sbin/hadoop-daemin.sh start zkfc
3、验证
1、将Active namenode进程kill掉
2、再将Active Namenode的网络断开
3、查看另外一个namenode是否从StandBy变成Active活跃状态