HDFS
文章目录
1.概述
hadoop 用java语言实现,允许用户使用简单的编程模型实现跨集群对海量数据进行分布式计算处理
1.1核心组件:
- HDFS
- 解决海量数据存储
- YARN(集群资源管理和任务调度框架)
- 解决资源任务调度
- MapReduce
- 解决海量数据计算
1.2现状:
任何种类的程序都可以通过YARN去管理,支持各种计算引擎,MapReduce 存在弊端,很少有直接使用
1.3优点:
大数据不考虑单机能力,而是集群整体的能力,多台机器并发运行,尽量避免非人为因素导致失败
hadoop 没有和具体的业务挂钩,hadoop 只提供基本的存储和计算功能
- 通用性:
- 精确区分做什么和怎么做:业务和技术
- 用户负责业务,hadoop 解决底层技术
- 简单(软件背后封装的复杂)
发行版本:
1.4架构变迁:
1.0~2.0 主要做的就是对MapReduce 进行了拆分,并添加了YARN 了层,同时YARN不仅支持MapReduce 作为计算框架,同时支持其他的计算框架
3.0侧重于性能的优化,比如GPU运算,提高存储效率
1.4hadoop集群概述:
主从架构集群
HDFS集群:
- 主角色是:NameNode
- 从角色是:DataNode
- 主角色辅助角色:SecondaryNameNode
YARN集群:
- 主角色:ResouceManager
- 从角色:NodeManager
如何理解逻辑上分离物理上在一起?
- 从角色在每个上面都有
- Hadoop 集群 = HDFS集群 + YARN集群
- 每一个框都是一个独立的进程,互相之间在逻辑上并不依赖,但是这些进程可能都在同一个物理机器上
有没有MapReduce 集群之称?
- MapReduce 是计算框架,代码层面的组件,没有集群之说
1.5集群搭建
1.5.1集群角色规划
准则:
- 根据软件工作特性和服务器硬件资源情况合理分配
- 比如说依赖内存工作的nameNode 应该部署到大内存机器上
角色规划注意事项:
- 资源上有抢夺冲突的,尽量不要部署到一起
- 工作上需要相互配合的,尽量部署到一起
1.5.2服务器基础环境准备
FinalShell作为Shell 工具可以将命令发送给所有的连接会话
-
主机名:
- vim /etc/hostname
- 保证每台机器有一个独一无二的主机名
- localhost.node1
- localhost.node2
- localhost.node3
-
host 映射
-
修改每台机器上的/etc/hosts 文件
-
添加:对应ip地址 简称 hostname
192.168.56.101 node1 localhost.node1 192.168.56.101 node2 localhost.node2 192.168.56.101 node3 localhost.node3
-
-
关闭防火墙:
-
防火墙开启后会限制一些端口,在局域网内这显然是没必要的,所以要关闭防火墙
systemctl stop firewalld.service #关闭防火墙 systemctl disable firewalld.service #禁止防火墙的自启动
-
-
ssh 免密登录
-
打通 node1 -> node1|node2|node3
-
ssh-keygen #生成公钥私钥 #将g ssh-copy-id -i id_rsa.pub user@node1 ssh-copy-id -i id_rsa.pub user@node2 ssh-copy-id -i id_rsa.pub user@node3
-
-
集群时间同步
-
通过ntp协议和网络授时服务器进行同步
yum -y install ntpdate ntpdate ntp4.aliyun.com
-
-
统一工作目录
-
#统一软件安装路径 mkdir -p /export/server #统一数据存储路径 mkdir -p /export/data #统一安装包存放路径 mkdir -p /export/software
-
-
远程拷贝
-
#拷贝目录加参数-r scp -r ~/export/server/jdk user@node2:~/export/server/
-
-
HADOOP安装包目录结构
-
- 启动关闭命令都在 sbin 目录下
- share 目录中有官方自带的一些示例
-
1.5.3修改配置文件
/etc /hadoop 目录下
分类:
-
第一类:hadoop-env.sh
-
export JAVA_HOME=/home/user/software/java/jdk-11.0.13 export HDFS_NAMENODE_USER=user export HDFS_DATANODE_USER=user export HDFS_SECONDARYNAMENODE_USER=user export YARN_RESOURCEMANAGER_USER=user export YARN_NODEMANAGER_USER=user
-
-
第二类配置文件:4个
-
site 表示用户定义的配置,会覆盖掉default中的默认配置
-
core-site.xml
-
核心模块配置
-
<configuration> <!--配置使用默认的文件系统,支持file,hdfs,GFS,ali|amazon云等文件系统 --> <property> <name>fs.defaultFS</name> <value>hdfs://node1:8020</value> <description>Abase for other temporary directories.</description> </property> <!-- hdfs web ui 用户身份--> <property> <name>hadoop.http.staticuser.user</name> <value>user</value> </property> <!--整合hive 用户代理设置--> <property> <name>hadoop.proxyuser.root.hosts</name> <value>*</value> </property> <property> <name>hadoop.proxyuser.root.groups</name> <value>*</value> </property> <!--文件系统垃圾桶保存时间--> <property> <name>fs.trash.interval</name> <value>1440</value> </property> </configuration>
-
-
hdfs-site.xml
-
hdfs文件系统配置
-
<!-- secondary namenode 进程运行机器位置信息--> <configuration> <property> <name>dfs.namenode.secondary.http-address</name> <value>node2:9868</value> </property> </configuration>
-
-
mapred-site.xml
-
mapreduce模块配置
-
<!-- 设置MR程序默认运行模式: yarn集群模式 local本地模式 --> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <!-- MR程序历史服务地址 --> <property> <name>mapreduce.jobhistory.address</name> <value>node1:10020</value> </property> <!-- MR程序历史服务器web端地址 --> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>node1:19888</value> </property> <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property> <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value> </property>
-
-
yarn-site.xml
-
yarn模块配置
-
<!-- 设置YARN集群主角色运行机器位置 --> <property> <name>yarn.resourcemanager.hostname</name> <value>node1</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 是否将对容器实施物理内存限制 --> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property> <!-- 是否将对容器实施虚拟内存限制。 --> <property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <!-- 开启日志聚集 --> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <!-- 设置yarn历史服务器地址 --> <property> <name>yarn.log.server.url</name> <value>http://node1:19888/jobhistory/logs</value> </property> <!-- 历史日志保存的时间 7天 --> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> </property>
-
-
-
第三类:workers
-
localhost.node1 localhost.node2 localhost.node3
-
将配置同步到其他结点
scp -r hadoop-3.3.2 user@node2:$PWD
scp -r hadoop-3.3.2 user@node3:$PWD
将hadoop添加到系统环境变量
export HADOOP_HOME=/home/user/software/hadoop/hadoop-3.3.2
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
1.6初体验
- HDFS本质上就是一个文件系统
- 有目录树结构,分文件文件夹
- 为什么上传小文件非常慢?
- 程序只要执行就会去找Yarn
- 执行MapReduce 程序的时候,为什么首先去请求YARN
- MapReduce 执行好像是两个阶段,Map和Reduce 阶段
- 处理小数据的时候MapReduce 的速度也不快
2.介绍
2.1相关概念
- 数据
- 存储的内容本身
- 元数据
- 用于辅助存储数据的属性信息
传统文件系统遇到的问题:
- 最直观的问题,就是所有的问题不能再靠单机去解决了
分布式存储系统核心属性:
- 分布式存储
- 优点:
- 可以无限扩展支持数据存储
- 优点:
- 元数据记录
- 先查元数据,再查数据
- 分块存储
- 物理上将文件切开进行存储
- 还可以同时去操作这些数据块,并行操作
- 副本机制
- 在不同的机器上进行数据的备份
2.2HDFS简介
使用者在使用HDFS的感觉就像是使用普通文件系统的目录树结构一样,看起来是个单机的,但实际上数据放在不同的机器上
2.3设计目标
- 注重大数据的高吞吐,而忽略数据访问的反应时间
- 一次写入多次读取访问模型,不支持物理上的文件修改,而是追加修改
- 数据本地性,数据不动,将程序发送过来
设计本质上决定的优缺点:
- 优点:
- 大文件
- 数据流式访问
- 一次写入多次读取
- 低成本部署,廉价PC
- 高容错
- 缺点:
- 小文件
- 数据交互式访问
- 频繁任意修改
- 低延迟处理
2.4重要特性
架构图:
- 主从架构
- 分块存储
- 物理上将文件切开进行存储,不足128M就不再分块,直接存一块
- 副本机制
- 1+2 = 3
- 冗余存储
- 元数据记录
- nameNode 进行管理
- 文件本身的属性信息和文件块的相关信息
- 抽象统一的目录树结构(nameSpace)
- 只需要对统一的目录树进行处理即可,友好操作
- 数据块存储
2.5shell操作
- 命令行界面(command-line interface,缩写CLI)
- hadoop提供shell 命令行客户端:hadoop fs [generic options]
文件系统协议:
- HDFS shell CLI支持多种文件系统,包括本地文件系统(file:///),分布式文件系统,谷歌文件系统
- 具体是针对什么文件系统的操作要看命令中文件路径**URL中的前缀协议**
- 如果没有指定前缀,则将会**读取环境变量中的(core-site.xml)fs.defaultFS属性**,以该属性值作为默认的文件系统
历史命令区别:
- hadoop dfs 只能操作HDFS文件系统
- hdfs dfs 只能操作HDFS文件系统相关
- hadoop fs 可以操作任意文件系统,不仅是hdfs文件系统
常见基本操作:
-
hadoop fs -mkdir -p
-
hadoop fs -ls -h
- 人性化显示就是显示出文件的大小加上单位
-
hadoop fs -put
-
hadoop fs -put zookeeper.out /itcast hadoop fs -put file:///etc/profile hdfs://node1:8020/itcast
-
这里的本地就是就是客户端在哪里,哪里就是本地,在node1上敲命令显示出来的就是node1的本地文件,2就是2
-
hadoop的树文件目录,就是所有的机器都会共有一个树形文件目录,在物理上各个目录之间是分离的,但是在逻辑上他们都是归属于一个入口去管理和使用,也进一步的反映出了分布式的思想
-
hdfs fs -get
- ./代表的是当前目录
-
hdfs fs -cat
-
hdfs fs -cp
-
hadoop fs -appendToFile
- 将本地文件(可以提供多个文件)中的内容加到指定hdfs中文件的尾部,相当于文件的合并
-
- 可以用于小文件合并
3.HDFS集群角色与职责
- 主角色NameNode
- hadoop分布式文件系统的核心,架构中的主角色
- NameNode 维护和管理文件系统元数据,包括名称空间树结构,文件和块的位置信息,访问权限
- NameNode 是访问HDFS的唯一入口,不管是上传文件还是下载文件都必须先找NameNode
- NameNode 内部通过内存和磁盘文件两种方式管理元数据
- 其中磁盘上的元数据文件包括FSimage内存数据镜像文件,和edits log 编辑日志
- DataNode 从角色
- 负责具体的数据块存储
- 扩容集群一般说的是增加DataNode 结点,DataNode 的数量决定了HDFS集群的整体数据存储能力,通过和NameNode 配合维护着数据块
- Secondary NameNode
- 作为NameNode 的**辅助结点**,但不能替代NameNode
- 不能充当NameNode 的备份
- 帮助主角色进行元数据文件的合并
- 如果NameNode 挂掉,整个读写请求的能力都会丢失,数据都无法进行操作,但是并不会造成数据本身的丢失等等
- NameNode 干活需要大内存
- DataNode 干活需要大磁盘
4.HDFS写数据流程(上传文件)
- Pipeline 管道
- HDFS写数据过程中的数据传输方式
- Client 只主动上传一次数据到第一个数据结点,之后节点一保存数据后复制传递给节点二,一次类推,因为一般会保存三个副本,所以会传递给节点三后就不再传递
- 采用原因:
- 一般数据传输有两种形式,上面的pipline 也叫做总线型拓扑结构,还有一种星型拓扑结构,也就是Client 连续三次给三个数据结点分别上传数据
- 以管道传输的好处在于顺序的沿着一个方向传输,可以**充分的利用每个机器的带宽,避免网络瓶颈和高延迟的连接,最小化推送数据的延时**
- ACK 应答响应(确认字符)
- 保证Pipline在数据传输过程过程中的安全性,不会丢数据
- 在pipline 数据传输的过程中反方向进行ack校验
- ack 校验是两两之间校验,当DadaNode1 成功的接受数据后会向Client 发送一个ACK校验确认包,同理DataNode 2也向ACK发送校验确认包
- 3副本存储策略
- 副本策略是为了防止当存储机器崩溃后防止数据丢失的策略,单位是机器,所以副本不能放置于一台机器上
- 第一块副本:优先客户端本机,否则就近随机
- 第二块副本:不同于第一块副本的不同机架
- 第三块副本:第二块副本相同机架不同机器
- 在实际的存储中很难有多个机架,所以会进行存储策略的降级,第一块副本仍然是优先客户端,而第二第三块副本则随机进行,核心标准就是副本不能放置于同一台机器上
- 副本策略是为了防止当存储机器崩溃后防止数据丢失的策略,单位是机器,所以副本不能放置于一台机器上
- 总体流程:
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M3UqLNt0-1650898507685)(C:/Users/97337/AppData/Roaming/Typora/typora-user-images/image-20220425224636366.png)]
-
- 对于客户端上传文件,nameNode通过最小复制参数来判断上传是否成功,而参数最小值为1,也就是说只要上传有一个副本,就表明上传成功,如果在pipline 中有失败的块,则nameNode 会找其他机器进行复制