导图社区 hadoop 11.4.16.49思维导图
这是一个关于hadoop 11.4.16.49思维导图,Hadoop是一个开源的分布式计算框架,用于存储和处理大规模数据集,包含hadoop核心配晋文件、三大组件等。
编辑于2023-11-05 10:50:07hadoop
概述
Hadoop是一个开源的分布式计算框架,用于存储和处理大规模数据集。
特点
Hadoop是由一系列软件库组成的框架
Hadoop适合处理大规模数据: 高吞吐量,超大数据集
Hadoop被部署在一个集群上: 高容错性,使用廉价的硬件设备
分布式文件系统(Hadoop Distributed File System)HDFS,可以以流的形式访问文件系统中的数据
Hadoop是一种典型的Master-Slave架构
hadoop核心配置文件
hadoop-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml
workers
文件里面记录的是集群主机名
三大组件
HDFS
概述
HDFS是hadoop分布式的文件系统,作为hadoop的核心组件之一,为分布式计算框架MapReduce提供底层的分布式存储支撑
作用
为海量数据提供了存储
特点
优点
高容错性
数据自动保存多个副本。它通过增加副本的形式,提高容错性
某一个副本丢失以后,它可以自动恢复
适合处理大数据
数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据
文件规模:能够处理百万规模以上的文件数量,数量相当之大
可构建在廉价机器上,通过多副本机制,提高可靠性
缺点
不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
无法高效的对大量小文件进行存储
存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
不支持并发写入、件随机修改
一个文件只能有一个写,不允许多个线程同时写
仅支持数据append(追加),不支持文件的随机修改
副本节点的选择
在Client所处的节点上。如果客户端在集群外,随机选一个
在另一个机架的随机一个节点
在第二个副本所在机架的随机节点
组成架构
NameNode
Master:是一个主管,管理者
管理HDFS的名称空间
配置副本策略
管理数据块映射信息
处理客户端读写要求
DataNode
Slave:NameNode下达命令,DataNode执行实际操作
存储实际的数据块
执行数据块的读写操作
Client
客户端
文件切分。文件上传到HDFS的时候,Client将文件切成一个一个的Block,然后进行上传
与NameNode交互,获取文件的位置信息
与DataNode交互,读取或写入数据
Client提供一些命令来管理HDFS,比如NameNode格式化
Client可以通过一些命令来访问HDFS,比如HDFS增删改查操作
Secondary NameNode
并非NameNode的热备, 当NameNode挂掉的时候, 它并不能马上替换NameNode并提供服务
辅助NameNode,分担工作量,比如定期合并Fsimage和Edits,并推送给NameNode
在紧急情况下,可以辅助恢复NameNode
命令行操作(常用)
上传本地文件到HDFS
hdfs fs -put <local_file><hdfs_path>
删除文件或目录
hdfs fs -rm <hdfs_path>
删除目录及下的文件
hdfs fs -rm -r<hdfs_path>
新建一个文件
hdfs fs -touch <hdfs_path>
查看文件
hdfs fs -cat <hdfs_path>
将HDFS中的文件下载到本地目录中
hdfs fs -get <local_file><hdfs_path>
创建目录
hdfs fs -mkdir <local_file><hdfs_path>
移动或重命名文件
hdfs fs -mv <source_path><destination_path>
列出文件或目录
hdfs fs -ls<hdfs_path>
显示目录中所有文件及大小
hdfs fs -du <hdfs_path>
输出指定文本文件
hdfs fs -text<hdfs_path>
显示目录下的目录数及文件数
hdfs fs -count<hdfs_path>
工作机制
写数据流程
详细步骤解析: 1、client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传; 2、client请求第一个 block该传输到哪些DataNode服务器上; 3、NameNode根据配置文件中指定的备份数量及副本放置策略进行文件分配,返回可用的DataNode的地址,如:A,B,C; 4、client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client; 5、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。 6、数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipeline ack发送给client; 7、当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
读数据流程
详细步骤解析: 1、Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 2、NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode都会返回含有该block副本的DataNode地址; 3、这些返回的DN地址,会按照集群拓扑结构得出DataNode与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离Client近的排靠前;心跳机制中超时汇报的DN状态为STALE,这样的排靠后; 4、Client选取排序靠前的DataNode来读取block,如果客户端本身就是DataNode,那么将从本地直接获取数据;底层上本质是建立Socket Stream(FSDataInputStream),重复的调用父类DataInputStream的read方法,直到这个块上的数据读取完毕; 5、当读完列表的block后,若文件读取还没有结束,客户端会继续向NameNode获取下一批的block列表; 6、读取完一个block都会进行checksum验证,如果读取DataNode时出现错误,客户端会通知NameNode,然后再从下一个拥有该block副本的DataNode继续读。 7、read方法是并行的读取block信息,不是一块一块的读取;NameNode只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据; 最终读取来所有的block会合并成一个完整的最终文件。
MapReduce
作用
为海量数据提供计算能力
特点
优点
开发简单
得益于MapReduce的编程模型,用户可以不用考虑进程间通信、套接字编程,无需掌握分布式并行计算,只需要实现一些非常简单的逻辑,其他都交给MapReduce计算框架来完成,大大简化了分布式编程的编写难度
可扩展性强
同HDFS一样,当集群资源不能满足计算需求时,可以通过增加节点的方式达到线性扩展集群的目的。
容错性强
对于节点故障导致的作业失败,MapReduce计算框架会自动将作业安排到健康节点重新执行,直到任务完成,而这些,对于用户来说也都是透明的。
缺点
不擅长快速运算
MapReduce无法像MySQL一样,在毫秒或者秒级内返回结果
不擅长流式运算
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
整体过程
整体过程
Map阶段
简单概括
用户自定义的Mapper要继承Mapper父类
Mapper的输入数据是KV对的形式(KV的类型可以自定义)
Mapper中的业务逻辑写在map()方法中
Mapper的输出数据是KV对的形式(KV的类型可以自定义)
map()方法(MapTask进程)对每一个<K,V>调用一次
步骤分析
详细步骤: 1、读取数据组件 InputFormat(默认 TextInputformat) 会通过getSplit方法对输入目录中文件进行逻辑切片规划得到 block, 有多少block 就对应启动多少个 MapTask. 2、将输入文件且分为 block 之后, 有 RecordReader 对象(默认为 LineRecordReader) 进行读取, 以 \n 作为分隔符, 读取一行数据, 返回 <key, value>, key 表示们航首字符偏移量, value 表示这一行文本内容. 3、读取block 返回 <key, value>, 进入用户自己继承Mapper类中, 执行用户重写的map函数, RecordReader 读取一行这里调用一次 4、Mapper逻辑结束之后, 将Mapper的每条结果通过 context.write 进行collection数据收集. 在 collect中, 会先对其进行分区处理, 默认使用 HashPartitioner MapReduct 提供 Partitioner 接口, 它的作用就是根据 key 或 value 及 Reducer 的数量来决定当前的这对输出数据最终应该交给那个reduce task 处理, 默认对 key hash后再以 reducer 的数量取模. 默认的取模方式只是为了平均 Reducer的处理能力. 如果用户自己对 Partitioner 有需求, 可以定制并设置到job上. 5、接下来, 会将数据写入内存, 内存中这片区域叫做环形缓冲区, 缓冲区的作用是批量手机Mapper结果, 减少磁盘IO的影响. 我们的key/value 对以及 Partition 的结果都会被写入缓冲区. 当然, key 与 value 值都会被序列化成字节数组. 环形缓冲区其实是一个数组, 数组中存放着key和value的序列化数据 与 key,value 的元数据信息, 包括 Partition、key的起始位置、value的起始位置、以及value的长度. 环形结构是一个抽象概念. 缓冲区是有大小限制, 默认为100MB. 当 Mapper 的输出结果很多时, 就可能会撑爆内存, 所以需要在一定条件下将缓冲区的数据临时写入磁盘, 然后重新利用这块缓冲区.这个从内存往磁盘写数据的过程称为 spill, 中文可翻译为溢写. 这个溢写是有单独线程完成.不影响往缓冲区写Mapper结果的线程. 溢写线程启动时不应该阻止Mapper结果输出, 所以整个缓冲区有个溢写的比例 spill.percent. 这个比例默认为0.8, 也就是当缓冲区的数据已经达到阈值 buffer size * spill percent = 100M * 0.8 = 80M, 溢写线程启动, 锁定80M的内存, 执行溢写过程. Mapper的数据结果还可以往剩下的20MB内存中写,互不影响. 6、当溢写线程启动后, 需要对这 80MB 空间内的 Key 做排序 (Sort). 排序是 MapReduce 模型默认的行为, 这里的排序也是对序列化的字节做的排序 如果 Job 设置过 Combiner, 那么现在就是使用 Combiner 的时候了. 将有相同 Key 的 Key/Value 对的 Value 加起来, 减少溢写到磁盘的数据量. Combiner 会优化 MapReduce 的中间结果, 所以它在整个模型中会多次使用 那哪些场景才能使用 Combiner 呢? 从这里分析, Combiner 的输出是 Reducer 的输入, Combiner 绝不能改变最终的计算结果. Combiner 只应该用于那种 Reduce 的输入 Key/Value 与输出 Key/Value 类型完全一致, 且不影响最终结果的场景. 比如累加, 最大值等. Combiner 的使用一定得慎重, 如果用好, 它对 Job 执行效率有帮助, 反之会影响 Reducer 的最终结果 7、合并溢写文件, 每次溢写会在磁盘上生成一个临时文件 (写之前判断是否有 Combiner), 如果 Mapper 的输出结果真的很大, 有多次这样的溢写发生, 磁盘上相应的就会有多个临时文件存在. 当整个数据处理结束之后开始对磁盘中的临时文件进行 Merge 合并, 因为最终的文件只有一个, 写入磁盘, 并且为这个文件提供了一个索引文件, 以记录每个reduce对应数据的偏移量
shuffle阶段
简单概括
主要作用
将相同的Key的键值对发送到同一个Reduce中,并将Value合并成集合
具体步骤
分区
主要作用
保证相同的key进入同一个Reduce
步骤
自定义类继承Partitioner,重写getPartition()方法
在Job驱动中,指定自定义Partitioner
设置和分区相应数量的ReduceTask
总结
如果ReduceTask的数量>getPartition的结果数,则会多产生几个空文件
如果1<ReduceTask的数量<getPartition的结果数,会报错
如果ReduceTask的数量=1,只会产生一个结果文件
分区号必须从零开始,逐一累加
合并
主要作用
合并相同分区,并将相同key的值进行聚合压缩
排序
主要作用
提升数据处理的速度
分类
全排序
只有一个输出文件,文件内部有序
分区排序
有多个分区的输出文件,文件内部有序
序列化
主要作用
把内存中的对象转化为字节序列,以便存储于磁盘和网络传输
常用数据序列化类型
步骤
实现Writable接口
反序列化时,需要反射调用空参构造函数,即类对象中必须有空参构造
重写序列化Write方法
重写反序列化的readFields方法
注意反序列化的顺序和序列化的顺序完全一致
若想把结果显示到文件中,需重写toString(),可用“\t”分开,方便后续用
如想需将自定义的bean放在key中传输,还需要实现Comparable接口,因为MapReduce框中Shuffle过程要求对key必须能排序
Join
步骤
步骤分析
map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,这个流程就叫shuffle。 shuffle: 洗牌、发牌 ——(核心机制:数据分区,排序,分组,规约,合并等过程)。 shuffle是Mapreduce的核心,它分布在Mapreduce的map阶段和reduce阶段。一般把从Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。 1)Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。 2)Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。 3)Merge阶段:把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。 4)Copy阶段:ReduceTask启动Fetcher线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。 5)Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存到本地的数据文件进行合并操作。 6)Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需保证Copy的数据的最终整体有效性即可。 Shuffle中的缓冲区大小会影响到mapreduce程序的执行效率,原则上说,缓冲区越大,磁盘io的次数越少,执行速度就越快 缓冲区的大小可以通过参数调整, 参数:mapreduce.task.io.sort.mb 默认100M
Reduce阶段
简单概括
用户自定义的Reducer要继承Reducer父类
Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
Reducer的业务逻辑在reduce()方法中
ReduceTask进程对每一组相同k的<K,V>组调用一次reduce()方法
步骤分析
Reduce工作机制: Reduce大致分为copy、sort、reduce三个阶段,重点在前两个阶段。copy阶段包含一个eventFetcher来获取已完成的map列表,由Fetcher线程去copy数据,在此过程中会启动两个merge线程,分别为inMemoryMerger和onDiskMerger,分别将内存中的数据merge到磁盘和将磁盘中的数据进行merge。待数据copy完成之后,copy阶段就完成了,开始进行sort阶段,sort阶段主要是执行finalMerge操作,纯粹的sort阶段,完成之后就是reduce阶段,调用用户定义的reduce函数进行处理。 详细步骤: 1、Copy阶段,简单地拉取数据。Reduce进程启动一些数据copy线程(Fetcher),通过HTTP方式请求maptask获取属于自己的文件。 2、Merge阶段,这里的merge如map端的merge动作,只是数组中存放的是不同map端copy来的数值。Copy过来的数据会先放入内存缓冲区中,这里的缓冲区大小要比map端的更为灵活。merge有三种形式:内存到内存;内存到磁盘;磁盘到磁盘。默认情况下第一种形式不启用。当内存中的数据量到达一定阈值,就启动内存到磁盘的merge。与map 端类似,这也是溢写的过程,这个过程中如果你设置有Combiner,也是会启用的,然后在磁盘中生成了众多的溢写文件。第二种merge方式一直在运行,直到没有map端的数据时才结束,然后启动第三种磁盘到磁盘的merge方式生成最终的文件。 3、合并排序,把分散的数据合并成一个大的数据后,还会再对合并后的数据排序。 4、对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
Driver阶段
简单概括
提交封装MapReduce程序相关运行参数的job对象
例题
WordCount
Map阶段
Reduce阶段
Driver
例题2
例题3
Yarn
作用
hadoop的资源管理器
基本架构
Resource Manager
Yarn的总指挥,管理集群的计算资源
Node Manager
管理单个节点上的资源
Container
抽象硬件资源(类似虚拟机),包含CPU,内存,磁盘,网络等,所有Task都在Container运行
ApplicationsMaster、YarnChild
运行具体任务的临时进程
读写流程
详细原理: 1)client向RM提交应用程序,其中包括启动该应用的ApplicationMaster的必须信息,例如ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。 2)ResourceManager启动一个container用于运行ApplicationMaster。 3)启动中的ApplicationMaster向ResourceManager注册自己,启动成功后与RM保持心跳。 4)ApplicationMaster向ResourceManager发送请求,申请相应数目的container。 5)ResourceManager返回ApplicationMaster的申请的containers信息。申请成功的container,由ApplicationMaster进行初始化。container的启动信息初始化后,AM与对应的NodeManager通信,要求NM启动container。AM与NM保持心跳,从而对NM上运行的任务进行监控和管理。 6)container运行期间,ApplicationMaster对container进行监控。container通过RPC协议向对应的AM汇报自己的进度和状态等信息。 7)应用运行期间,client直接与AM通信获取应用的状态、进度更新等信息。 8)应用运行结束后,ApplicationMaster向ResourceManager注销自己,并允许属于它的container被收回。