1 文件系统和分布式文件系统
1.1 文件系统
- 文件系统:一种存储和组织数据的方法
- 实现了数据的存储、分级组织、访问、获取等操作
- 使得用户对文件的访问和查找更容易
- 使用树形目录的抽象概念代替了硬盘等物理设备中数据块的概念
- ——>用户不必关系数据底层存在硬盘的哪里(物理位置),只需要知道这个文件的所属路径(逻辑位置)即可
1.1.1 传统文件系统
- 单机文件系统
- 底层不会横跨多台机器
- 带有抽象的目录树结构,树都是从根目录开始向下蔓延
- 树中节点:目录or文件
- 从根目录开始,各节点路径唯一
1.2 数据 & 元数据
- 数据:存储内容本身
- 最终存在磁盘等存储介质上
- 元数据
- 解释性数据(记录数据的数据)
- eg,文件大小、最后修改时间、属性、权限。。。
- 解释性数据(记录数据的数据)
1.2.1 元数据记录
1.2.2 分块存储+元数据记录
一个文件存在多个机器上
1.2.3 副本机制+分块存储+元数据记录
- 一个文件的一部分的副本存在多台机器上
- 冗余存储
- 防止万一一台机器坏了数据无法恢复
2 Hadoop 核心组件
- HDFS(hadoop distributed file system)
- 分布式文件存储系统
- ——>解决海量数据存储
- YARN
- 集群资源管理和任务调度框架
- ——>解决资源调度问题(整个集群多个程序同时执行,如何分配集群资源?)
- MapReduce
- 分布式计算框架
- ——>解决海量数据计算
2.1 HDFS
- 横跨多台计算机的存储系统
- 使用统一的访问接口,像访问普通文件系统一样使用分布式文件系统
2.1.1 设计目标
- 硬件故障
- ——>故障检测+自动快速恢复
- 流式读取数据
- ——>批处理数据,并非用户交互式处理
- ——>相较于数据访问的反应时间(访问文件的延迟会很高),更注重数据访问的高吞吐量
2.1.2 一次写入多次读取(write-one-read-many)
- 数据一旦创建、写入、关闭后不需要修改
- HDFS不支持文件的直接编辑修改
- ——>简化了数据一致性问题,使得高吞吐量的数据访问成为可能
2.1.3 应用场景
2.1.4 主角色 NameNode
- 维护和管理文件系统元数据
- 名称空间目录树结构
- 文件和块的位置信息
- 访问权限
- ——>仅储存元数据,不存储实际数据
- ——>NameNode 是访问HDFS的唯一入口
- NameNode 内部通过内存和磁盘文件两种方式管理元数据
- 内存:
- 交互和查找快
- 但是一旦断电,数据就丢失了
- 磁盘文件定期进行合并持久化,来保证元数据安全
- 磁盘上的元数据包括:
- Fsimage内存元数据镜像文件
- edits log (Journal)编辑日志
- 内存:
- NameNode不会持久化存储每个文件中各个块所在的DataNode的位置信息
- 断电了就没有了
- 重启之后需要从DataNode重建
- ——>DataNode会将自己注册到NameNode,并汇报自己持有的块列表
- NameNode所在机器需要配置大量内存
- NameNode是Hadoop集群中的单点故障
- 单点故障:一个软件由多个模块组成,当中一个模块出问题导致了整体出问题
2.1.5 从角色 DataNode
- 负责具体的数据块存储
- DataNode的数量决定了HDFS集群的整体数据存储能力
- 扩容集群——扩容DataNode数量
- 某个DataNode关闭时,不会影响数据的可用性
- 默认DataNode是3副本冗余存储
- NameNode会安排由其他DataNode管理的块进行副本复制
- DataNode所在机器通常需要配置有大量的硬盘空间(大磁盘),因为实际数据存储在DataNode中
2.1.6 主角色辅助角色 SecondaryNameNode
- NameNode的辅助节点,但是不能替代NameNode(不是NameNode的备份)
- 帮助主角色进行元数据文件的合并操作
2.1.7 HDFS写数据流程
- 管道Pipeline
- HDFS上传文件写数据时采用的一种数据传输方式
- 冗余储存的多个副本,怎么写入?
- ——>客户端将数据块写入第一个数据节点
- ——>第一个数据节点保存数据之后再将数据块复制到第二个数据节点
- ——>第二个数据节点保存数据之后再将数据块复制到第三个数据节点
- (水流一样一次向下传递)
- 为什么是采用pipeline线性传输,而不是客户端一次给三个DataNode拓扑式传输?
- 数据以pipeline的方式,顺序地沿着一个方向传输的话,可以充分利用每台机器的带宽,避免网络瓶颈和高延迟连接
- ——>最小化写入所有数据的延时
- 数据以pipeline的方式,顺序地沿着一个方向传输的话,可以充分利用每台机器的带宽,避免网络瓶颈和高延迟连接
- 冗余储存的多个副本,怎么写入?
- HDFS上传文件写数据时采用的一种数据传输方式
- ACK 应答相应
- ack ——acknowledge character
- 确认字符
- 数据通信的时候,接收方给发送方一种传输类字符,表示发送的数据已经确认无误
- 在HDFS pipeline传输数据的过程中,传输的反方向会进行ACK校验,以保证数据传输准确+安全
- 两两之间的校验
- ack ——acknowledge character
- 默认3副本存储策略
- 由BlockPlacementPolicyDefault决定
- 第一块副本:优先客户端本地,否则随机
- 第二块副本:不同于第一块副本的不同机架(rack)
- 第三块副本:和第二块副本相同机架的不同机器
- 由BlockPlacementPolicyDefault决定
2.2 MapReduce
2.2.1 Map
- Map
- 拆分,把复杂的任务分解成若干个简单的子任务来并行处理
- 多个进程、多个机器
- 可以进行拆分的前提是这些小任务可以并行计算,且彼此之间几乎没有依赖关系
- 拆分,把复杂的任务分解成若干个简单的子任务来并行处理
2.2.2 Reduce
- Reduce
- 合并
- 对map阶段的结果进行全局处理
2.2.3 Shuffle
- MapReduce的核心
- 频繁涉及数据在内存、磁盘之间的多次往复
- map完每个切片写到内存缓冲区、内存缓冲区数据Spill溢出到磁盘
- reduce:copy数据现在内存,merge到磁盘
- 频繁涉及数据在内存、磁盘之间的多次往复
- 这里的shuffle更像是“洗牌”的逆过程:将map端的无规则输出按照指定的规则“打乱”成具有一定规则的数据
- ——>作用是方便reduce端处理
- 一般把Map产生输出之后,到Reduce取得数据作为输入之前的过程称为shuffle
Shuffle中的大部分步骤在Map和Reduce中都提到
2.3 YARN
2.3.0 介绍
- Yet Another Resource Negotiator,另一种资源协调者
- 另一种Hadoop资源管理器
- 资源指的是集群的硬件资源:比如内存、CPU等【磁盘不归YARN管,由HDFS管】
- 为上层应用提供统一的资源管理和调度
- 不仅支持MapReduce,理论上支持各种计算程序(比如Spark)
- ——>通用、可迁移
- 另一种Hadoop资源管理器
2.3.1 组件
- Yarn 3大组件
- 集群物理层面的组件(搭建机器必须要有的)
- ResourceManager
- YARN集群的主角色
- 决定系统中所有应用程序之间资源分配的最终权限、
- 接受用户(客户端Cient)的作业提交,通过NodeManager分配,管理各个机器上的计算资源
- NodeManager
- YARN集群的从角色
- 一台机器一个,负责管理本机器上的计算资源
- 根据ResourceManager 的命令,启动Container容器,监视容器的资源使用情况;同时向ResourceManager汇报资源使用情况
- 程序运行完之后:释放容器,回收资源
- ResourceManager
- APP层面的组件
- ApplicationMaster
- 用户(客户端)提交的每一个程序都需要包含一个ApplicationMaster
- 负责程序内部各阶段的资源申请,监督程序的执行情况
- ——>AM进程是任何程序在YARN上运行启动的第一个进程
- ApplicationMaster
- 集群物理层面的组件(搭建机器必须要有的)
- 其他组件
- Client:提交程序,让YARN给分配资源
- Container容器:一台机器上硬件资源的抽象
- 容器之间逻辑上是互相隔离的
- 一个程序运行完之后将容器释放掉
2.3.2 流程
2.3.3 资源调度器Scheduler
- 根据一定的策略为应用程序分配资源
- Hadoop提供三种调度器
- FIFO 先进先出
- 劣势:优先级无法调整,高优先级的程序需要等待
- Capacity 容量(默认)
- 集群划分不同的队列
- 队列A专门提交大程度,队列B专门提交小程序
- 如有需要,在队列中继续划分子队列
各个程序提交到指定队列上
- 如有需要,在队列中继续划分子队列
- 队列A专门提交大程度,队列B专门提交小程序
- —》多个组织共享整个集群资源,各获得集群的一部分计算能力,互不干扰
- 缺点:假如当下全都是小程序,那么队列A就会一直空着
- 集群划分不同的队列
- Fair 公平
-
- eg:有两个用户A和B,每个用户都有自己的队列
- 一开始A用户启动一个作业,由于没有B用户的需求,所以A用户分配了集群所有可用的资源
- 过一会儿B用户启动了一个作业,此时A用户的作业还在运行
- ——>经过一段时间的资源分配,A,B各自作业都使用了一半的资源
- 再过一会儿B用户开始了第二个作业,那么B用户的两个作业共享B用户的资源,A用户继续拥有自己的 一半资源
- eg:有两个用户A和B,每个用户都有自己的队列
-
- FIFO 先进先出
3 Hadoop 集群
- Hadoop集群主要包括两个集群
- HDFS集群
- 分布式存储
- 包含三个组成部分:主角色(NameNode,NN)、从角色(DataNode,DN)、主角色辅助角色(SecondaryNameNode.SNN)【角色是各自独立的进程】
- YARN集群
- 资源管理与调度
- 包括两个组成成分:主角色(ResourceManager,DM)、从角色(NodeManage,NM)【角色是各自独立的进程】
- HDFS集群
- 两个集群都是标准的主从架构
- 两个集群逻辑上分离、物理上在一起
- 逻辑上分离:两个集群之间互相没有依赖、进程互不影响
- 物理上在一起:两个集群的进程都部署在同一台机器上
3.1 HDFS 集群
4 Hadoop 命令
4.1 多种文件系统
- HDFS shell 命令行支持操作多种文件系统
- 本地文件系统:
-
hadoop fs -ls file:///
-
- 分布式操作系统
-
hadoop fs -ls hdfs://node1:8020/
-
- 本地文件系统:
4.2 主要命令
和linux很像
创建文件夹 | -p:沿着路径创建父路径 |
查看指定目录下内容 | -h 人性化显示 -R 递归查看 |
上传文件 | -f 覆盖目标文件(如果已存在) -p 保留访问和修改时间 |
查看文件 | 读取指定文件全部内容,显示在标准输出控制台 !!对于大文件内容读取,需要慎重!! |
下载文件 | -f 覆盖目标文件(如果已存在) -p 保留访问和修改时间 |
拷贝 | -f 覆盖目标文件(如果已存在) |
追加数据到HDFS | 这个是linux命令中没有的 将所有给定本地文件的内容追加到给定dst文件(尾部) 如果dst文件不存在,那么创建该文件 如果localsrc为-,那么从标准输入中获取 |
数据移动 | |
参考内容:01-课程内容大纲学习目标_哔哩哔哩_bilibili