——Hadoop是什么
- 是一个由 Apache 基金会所开发的分布式系统基础架构
- 主要解决海量数据的储存和海量数据的分析计算问题
- 广义上说,Hadoop 是一个更广泛的概念,Hadoop生态圈
——大数据技术生态体系
- Sqoop:Sqoop 主要用户在 Hadoop、Hive 与传统的数据库(MySQL)间进行数据的传递,可以将一个关系型数据库中的数据导进到 Hadoop 的 HDFS 中,也可以将 HDFS 的数据导进到关系型数据库中
- Flume :Flume 是一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输的系统,Flume 支持在日志系统中订制各类数据发送方,用于收集数据
- Kafka:Kafka 是一种高吞吐量的分布式发布订阅消息系统
- Spark:Spark 是当前最流行的开源大数据内存计算框架。可以基于 Hadoop 上存储的大数据进行计算
- Flink:Flink 是当前最流行的开源大数据内存计算框架。用于实时计算的场景较多
- Oozie:Oozie 是一个管理 Hadoop 作业(job)的工作流程调度管理系统
- HBase:HBase 是一个分布式的、面向列的开源数据库。HBase 不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。
- Hive:Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能,可以将 SQL 语句转化为 MapReduce 任务进行运行。其优点是学习成本低,可以通过类 SQL 语句快速实现简单的 MapReduce 统计,不必开发专门的 MapReduce 应用,十分适合数据仓库的统计分析
- ZooKeeper:它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等
——Hadoop 1.X、2.X、3.X区别
- 1.X
- MapReduce(计算+资源调度)
- HDFS(数据存储)
- Common(辅助工具)
- 2.X
- MapReduce(计算)
- Yarn(资源调度)
- HDFS(数据存储)
- Common(辅助工具)
- 3.X:组成上没有变化
——HDFS(Hadoop Distributed File System)
产生背景
- 是分布式文件管理系统中的一种
- 通过目录树来定位文件
- 适合一次写入,多次读出。 一个文件经过创建、写入和关闭之后就不需要改变
架构概述
- NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等;配置副本策略;处理的客户端的读写请求
- DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和;执行数据块的读 / 写操作
- Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份;并非热备,当NameNode挂掉的时候,并不能马上替换NameNode并提供服务;紧急情况,可辅助恢复NameNode
- Client:将上传到HDFS的文件切分成块(128M / 256M);与NameNode交互,获取文件位置信息;与DataNode交互,读取写入数据;管理HDFS,例如NameNode格式化,对HDFS增删改查
优缺点
- 优点
- 高容错性:数据自动保存多个副本,某一个副本丢失之后,可以自动恢复
- 适合处理大数据:
数据规模 能够达到GB、TB、PB级别
文件规模 能够处理百万规模以上的文件数量 - 可构建在廉价的机器上:通过多副本机制,提高可靠性
- 缺点
- 不适合低延时数据访问:毫秒级的存储数据
- 无法高效的对大量小文件进行存储:存储大量小文件的话,会占用NameNode 大量的内存来存储文件目录和块信息,NameNode的内存总是有限的;小文件的存储的寻址时间会超过读取时间,违反了HDFS的设计目标
- 不支持并发写入、文件随机修改:一个文件只能有一个写,不允许多个线程同时写;仅支持数据追加,不支持文件的随机修改
常见问题
文件块的大小
- HDFS的文件在物理上是分块存储(Block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在2.x / 3.x版本中是128M,1.x版本是64M
- 如果寻址时间(查找到目标block的时间)为10ms,寻址时间为传输时间的1%时,则为最佳状态,因此传输时间为 10ms / 0.01 = 1000ms = 1s
- 目前机械硬盘的传输速率普遍为100MB/s
为什么块的大小不能太大,也不能太小
- HDFS的块设置太小,会增加寻址的时间,程序一直在找块的开始位置
- 如果块设置设置太大,从磁盘传输数据的时间会明显大于定位这个块开始位置所需的时间。导致程序在处理这块数据时,会非常慢
写数据流程
最近距离计算:在HDFS写数据的过程中,NameNode会选择距离待上传数据最近距离的DataNode接受数据;节点距离(两个节点到达最近的共同祖先的距离总和)
读数据流程
NameNode 工作机制
- Fsimage 文件:HDFS 文件系统源数据的一个永久性的检查点,其中包含 HDFS 文件系统的所有目录和文件inode的序列化信息
- Edits 文件:存放 HDFS 文件系统的所有更新操作的路径,文件系统客户端执行的所有写操作首先会被记录到 Edits 文件中
- 默认 1 小时检查执行一次,1 分钟检查一次操作次数,当操作次数达到 100 w 时,SecondaryNameNode 执行一次
DataNode 工作机制
数据的完整性
如果存储DataNode节点上数据的磁盘发生损坏,却没有被发现,是否很危险?如何解决
- 当 DataNode 读取 Block 的时候,它会计算 CheckSum
- 如果计算后的 CheckSum,与 Block 创建时值不一样,说明 Block 已经损坏
- Client 读取其他 DataNode 上的 Block
- 常见的校验算法 crc(32),md5(158),sha1(160)
- DataNode 在其文件创建后周期验证 CheckSum
——MapReduce
定义
- MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架
- MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上
优缺点
- 优点
- 易于编程:用户只需要关心业务逻辑,实现框架的接口
- 良好的扩展性:可以动态增加服务器,解决计算资源不够的问题
- 高容错性:任何一台机器挂掉,可以将任务转移到其他节点
- 适合海量数据计算(TB/PB) :几千台服务器共同计算
- 缺点
- 不擅长实时计算(Mysql)
- 不擅长流式计算(SparkStreaming / Flink)
- 不擅长DAG有向无环图(计算出来的结果作为下一次计算的参数,迭代计算)计算(Spark)
架构概述
- Map 阶段并行处理输入数据
- Reduce 阶段对 Map 结果进行汇总
MapReduce核心思想
MapReduce 进程
一个完整的 MapReduce 程序在分布式运行时有三类实例进程:
- MrAppMaster:负责珍格格程序的过程调度及状态协调
- MapTask:负责 Map 阶段的整个数据处理流程
- ReduceTask:负责 Reduce 阶段的整个数据处理流程
序列化
定义
- 序列化:把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化)和网络传输
- 反序列化:将收到字节序列(或其他数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象
问题
为什么不用Java 的序列化
- Java 的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,Header,继承体系等),不便于网络中高效传输
- Hadoop 自身序列化存储空间少,传输速度快,可在机器互相操作
InputFormat 数据输入
数据块和与数据切片
- 数据块:Block 是HDFS 物理上把数据分成一块一块,数据块是HDFS存储数据单位
- 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce 程序计算输入数据的单位,一个切片会对应启动一个MapTask
切片机制
- 一个 Job 的 Map 阶段并行度由客户端再提交 Job 时的切片数决定
- 每个 Split 切片分配一个 MapTask 并行实例处理
- 默认情况下,切片大小 = BlockSize
- 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
Shuffle 机制
定义:Map 方法之后,Reduce 方法之前的数据处理过程称之为 Shuffle (打乱顺序,洗牌)
分区排序:按照字典顺序对 Key 的索引使用快速排序
MapTask 工作机制
ReduceTask 工作机制
注意事项
- ReduceTask = 0 ,表示没有 Reduce 阶段,输出文件个数和Map 个数一致
- ReduceTask 默认值就是1,所以输出文件个数为1
- 如果数据分布不均匀,就有可能在Reduce 阶段产生数据倾斜
- ReduceTask 数量并不是任意设置,还要考虑业务逻辑需求,有些情况下,需要计算全局汇总结果,就只能有1个ReduceTask
- 具体多少个ReduceTask ,需要根据集群性能而定
- 如果分区数不是1,但是ReduceTask 为1,不执行分区过程,因为在MapTask 的源码中,执行分区的前提是先判断ReduceNum 个数是否大于1,不大于1肯定不执行
数据清洗-ETL(Extract-Tramsform-Load)
定义
- 用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL 一词较常用在数据仓库,但其对象并不限于数据仓库
- 在运行核心业务 MapReduce 程序之前,往往要先对数据进行清洗,清理掉不符合用户要求的数据。清理过程往往只需要 Mapper 程序,不需要运行 Reduce 程序
——YARN
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序
架构概述
- ResourceManager(RM):整个集群资源(内存、CPU等)的管理者
- NodeManager(NM):单个节点服务器的管理者
- ApplicationMaster(AM):单个任务运行的负责人
- Container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源(内存、CPU、磁盘、网络)
- 注意
- 客户端可以有多个
- 集群上可以运行多个 ApplicationMaster
- 每个 NodeManager 上可以有多个 Container
YARN 工作机制
HDFS、YARN、MapReduce 三者关系
YARN 调度器
Hadoop 作业调度器主要有三种:FIFO、容量、公平调度器。Hadoop 3.1.3 默认的资源调度器是容量调度器
FIFO调度器
- 单队列,根据提交作业的先后顺序,先来先服务
容量调度器
- 是Yahoo开发的多用户调度器
- 多队列:每个队列可配置一定的资源量
- 容量保证:管理员可为每个队列设置资源最低保证和资源使用上限
- 灵活性:如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用和程序提交,则其他队列借调的资源会归还给该队列
- 多租户:支持多用户共享集群和多应用程序同时运行。为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源量进行限定
- 分配算法
- 队列资源分配:从root 开始,使用深度优先算法,优先选择资源占用率最低的队列分配资源
- 作业资源分配:默认按照提交作业的优先级和提交时间顺序分配资源
- 容器资源分配:按照容器的优先级分配资源,如果优先级相同,按照数据本地性原则
公平调度器
- 是 Facebook 开发的多用户调度器
- 具有与容量调度器的相同特点
- 不同点为
- 核心调度策略不同(容量调度器优先选择资源利用率低的队列;公平调度器优先选择对资源的缺额比例大的队列)
缺额:某一个时刻一个作业应获得资源和实际获取资源的差距叫“缺额” - 每个队列可以单独设置资源分配方式(容量调度器:FIFO、DRF;公平调度器:FIFO、FAIR、DRF)
- 核心调度策略不同(容量调度器优先选择资源利用率低的队列;公平调度器优先选择对资源的缺额比例大的队列)
——常见面试题
端口号
- Hadoop 3.x
- HDFS NameNode 内部通信端口:8020 / 9000 / 9820
- HDFS NameNode 对用户的查询端口: 9870
- Yarn 查看任务运行情况:8088
- 历史服务器:19888
- Hadoop 2.x
- HDFS NameNode 内部通信端口:8020 / 9000
- HDFS NameNode 对用户的查询端口: 50070
- Yarn 查看任务运行情况:8088
- 历史服务器:19888
常用配置文件
- Hadoop 3.x
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- workers
- Hadoop 3.x
- core-site.xml
- hdfs-site.xml
- yarn-site.xml
- mapred-site.xml
- slaves
更多推荐