hadoop概述及原理
1、概述
hadoop是一个由apache基金会开发,基于hdfs分布式文件系统,以一种可靠、高效、可伸缩的方式进行数据处理,旨在从单个服务器扩展到数千台机器,每台机器都提供本地计算和存储,充分利用集群的威力进行高速运算和存储大规模数据集。
hadoop有以下特点:
(1)扩容能力(Scalable):能可靠地(reliably)存储和处理千兆字节(PB)数据。
(2)成本低(Economical):可以通过普通机器组成的服务器群来分发以及处理数据,这些服务器群总计可达数千个节点。
(3)高效率(Efficient):通过分发数据,hadoop可以在数据所在的节点上并行地(parallel)处理它们,这使得处理非常的快速。
(4)可靠性(Reliable):hadoop能自动地维护数据的多份副本,并且在任务失败后能自动地重新部署(redeploy)计算任务。
2、hadoop版本
目前最新的版本是Apache Hadoop 3.3.1,发布于2021年9月,特点如下:
(1)支持的Java版本最低为java8
(2)支持 HDFS 中的纠删码
(3)提供 YARN Timeline Service v.2 alpha 2 服务
(4)支持Shell 脚本重写
(5)支持机会容器和分布式调度
(6)MapReduce 任务级原生优化
(7)支持 2 个以上的 NameNode
(8)支持 Microsoft Azure Data Lake 和 Aliyun Object Storage (9)System 文件系统连接器
(10)优化DataNode 内平衡功能处理,使数据分布均匀
(11)优化YARN 资源模型,支持用户定义的可数资源类型
3、应用场景
(1)海量数据存储: HDFS可横向扩展,其存储的文件可以支持PB级别或更高级别的数据存储。
(2)对容错性要求高:数据保存多个副本,副本丢失后自动恢复。可构建在廉价的机器上,实现线性扩展。
(3)廉价商用硬件:Hadoop并不需要运行在昂贵且高可靠的硬件上。它是设计运行在廉价商用硬件的集群上的。
(4)大文件存储:HDFS采用数据块的方式存储数据,将数据物理切分成多个小的数据块。所以再大的数据,切分后,大数据变成了很多小数据。用户读取时,重新将多个小数据块拼接起来。
4、hadoop架构及组件
Hadoop的架构由HDFS、MapReduce、HBase、Hive、zookeeper等组成,其中最为重要的是为底层用于存储集群中所有存储节点文件的文件系统HDFS(Hadoop Distributed File System)来执行MapReduce程序的MapReduce引擎。
Hive是基于Hadoop的一个工具,提供完整的SQL查询,可以将sql语句转换为MapReduce任务进行运行。
ZooKeeper:是一个分布式的,开源的分布式应用程序程序协调服务。
HBase是一个开源的,基于列存储模型的分布式数据库。
HDFS是一个分布式文件系统,有着高容错性的特点,适合那些超大数据集的应用程序。
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。
hadoop的核心由hdfs(分布式文件系统)、mapreduce(分布式运算编程框架)、yarn(运算资源调度系统)组成,下面来详细介绍这几个组件的作用:
hdfs
hdfs是一个专为mapreduce框架下的大规模分布式数据处理而设计的文件系统。其基本原理是将一个大数据集在hdfs中存储为单个文件,并将数据副本存储在多台机器上以支持并行处理。
hdfs采用master-slave架构,由namenode(管理节点)和datanode(工作节点)组成。
namenode是中心服务器,负责管理文件系统的namespace(命名空间),以命名空间镜像及编辑日志文件的形式来保存文件系统树上所有的目录、文件,并记录每个文件中各个块的数据节点信息。此外,Namenode可以有效的实现容错,防止因namenode服务器损坏而导致数据丢失。
datanode是文件系统的工作节点,受客户端或namenode调度,根据需要存储并检索数据块,定期向namenode发送相关的存储块列表。datanode一般从磁盘中读取块,但对于频繁访问的文件,采用块缓存的形式,文件对应的块缓存在datanode内存中,每个块缓存在一个datanode的内存中,用户通过在缓存池中增加一个cache directive来通知namenode需要缓存的文件及时间。
mapreduce
mapreduce是hadoop的数据处理模型,其特点是简单可扩展性,能够很容易的扩展到多个计算机(可能是几百,几千,甚至是上万台)节点上处理数据。一般来说,mapreduce框架和分布式文件系统是运行在同一组节点上的,这有利于框架在那些已经存好的数据节点上高效的调度任务。同时,mapreduce是并行运行的,因此可以将大规模的数据分析分发给任何一个足够多机器的数据中心。
mapreduce的数据转化操作两个阶段:map阶段和reduce阶段。map阶段会将集合中的元素转化为另一种形式,使得输入的键值对转换成多零到多个键值对输出;reduce阶段会将所有的map输出的键值对的值集合,最终产生一个新的键值对。
在mapreduce架构中,JobTracker和TaskTracker负责执行mapreduce任务,JobTracker是用于调度工作的,一个Hadoop集群中只有一台JobTracker。TaskTracker是用于执行工作的,并会隔一段时间向JobTracker发送(Heartbeat)心跳信息,告知JobTracker处于存活状态,如果JobTracker收不到TaskTracker的信息,那么认定该TaskTracker已经宕掉,会把作业任务分配给其他存活的TaskTracker。
yarn
yarn是hadoop集群的资源管理系统,具有足够的通用性,也能支持其他的分布式计算模式。
Yarn的基本思想是将资源管理及作业调度拆分为单独的守护进程,通过守护进程来管理集群上资源使用的资源管理器,以及运行集群中所有节点上能够启动和监控容器的节点管理器。
Yarn的框架的主要组件是ResourceManager(资源管理器)、NodeManager(节点管理器)、 ApplicationMaster(应用管理器) 、Container(容器)组成,各组件具体任务是:
ResourceManager:负责接受用户提交的作业,调度作业并分配资源。
NodeManager: 作为resourcemansger的监控和报告代理,负责容器、监控它们的资源使用情况(cpu、内存、磁盘、网络)并将其报告给 ResourceManager;控制并分配分配给各个应用程序的系统资源的资源容器。
ApplicationMaster:应用管理器负责与资源管理器协商资源,跟踪单个应用的状态和监控进度。
Container:容器,它是单个节点上的 RAM、CPU 内核和磁盘等物理资源的集合。由CLC(Container Launch Context)调用,记录环境变量、安全令牌、依赖项等信息。
5、hadoop运行机制
我们通过介绍hdfs、mapreduce、yarn的工作机制来了解hadoop运行过程
Hdfs
Hdfs分为读数据和写数据
读数据:
(1)客户端向 NameNode 请求读取数据或下载文件;
(2)NameNode 返回目标文件的元数据信息,即文件在 DataNode 上存储位置;
(3)客户端请求读取第一个 DataNode数据;
(4)第一个 DataNode 数据向客户端传输数据 block_1;
(5)第一个DataNode 数据读取完成后,向第二个 DataNode请求读取数据,第二个DataNode 向客户端传输文件 block_2;
(6)重复以上步骤,直到读取文件完成。
写数据:
(1)客户端向 NameNode 发送上传文件请求;
(2)NameNode 检查路径是否存在,如果不存在则通知客户端可以上传文件;
(3)客户端将文件根据拆分后,请求上传第一个块(0-128M),向NameNode 查找可上传的 DataNode 信息;
(4)NameNode 返回可用的 DataNode 信息,按副本个数返回可用DataNode 个数;
(5)客户端收到 DataNode 信息后,请求与其中一个 DataNode 建立 block 传输通道,建立成功后,以此类推,逐级建立后面的传输通道;
(6)通道建立完成后,从最后一个 DataNode 依次向前面的 DataNode 建立应答通道建立,直到第一个 DataNode 应答客户端通道建立成功;
(7)客户端开始传输数据;
(8)当第一个块传输完成时,再请求传输第二个,重复上述步骤。
Mapreduce
MapReduce运行的时候,通过Mapper运行的任务读取HDFS中的数据文件,然后调用自己的map方法,处理数据输出;Reducer任务会接收Mapper任务输出的数据,作为自己的输入数据,调用自己的方法reduce,最后输出到HDFS的文件中。
下面我们具体介绍Mapper和Reducer的过程
Mapper:
(1)把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的;
(2)对输入片中的记录按照一定的规则解析成键值对;
(3)调用Mapper类中的map方法。第二阶段中解析出来的每一个键值对,调用一次map方法;
(4)按照一定的规则对第三阶段输出的键值对进行分区,默认是只有一个区。分区的数量就是Reducer任务运行的数量,默认只有一个Reducer任务。
(5)对每个分区中的键值对进行排序。排序的原则是:按照键进行排序,对于键相同的键值对,按照值进行排序,然后输出排序后的结果。
Reducer
(1)Reducer任务会主动从Mapper任务复制其输出的键值对,Reducer会复制多个Mapper的输出;
(2)把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据,然后进行排序;
(3)对排序后的键值对调用reduce方法,键相等的键值对调用一次reduce方法,每次调用会产生零个或者多个键值对,最后把这些输出的键值对写入到HDFS文件中。
Yarn
(1)客户端提交申请;
(2)Resourcemanager分配一个Container来启动ApplicationMaster;
(3)ApplicationMaster在Resourcemanager上注册自己,并从Resourcemanager协商使用容器;
(4)Application Manager 通知 Node Manager 启动容器;
(5)在Container中执行应用程序代码;
(6)客户端连接Resourcemanager或ApplicationMaster监控应用程序的状态;
(7)处理完成后,ApplicationMaster向Resourcemanager取消注册。