Hadoop数据体系-基本概念
Hadoop技术概述
Hadoop是一种针对大数据处理的被行业广泛使用的关于数据处理挖掘的主流技术。
主要涉及到的技术点是大数据的分布式存储和计算框架
Hadoop的特点
- 高可靠性:数据存储使用集群部署在不同的机器上。当数据处理请求失败时,Hadoop将自动重新部署计算任务。
- 高扩展性:Hadoop可以非常容易的对集群中的节点进行拓展。
- 高效性:Hadoop可以在节点之间动态地移动数据,保证数据处理是多个节点并行执行,同时保证各个节点处理的动态平衡,最大化的提高数据处理的效率
- 高容错性:Hadoop提供了分布式文件系统HDFS。HDFS可以将文件冗余的保存在多个节点中,当某个节点出错或者宕机,可以读取其他节点的冗余数据,保证程序顺利运行。
- 低成本:Hadoop是开源的。
- 基于Java编写:Hadoop是一个基于Java语言开发的框架,因此运行在Linux系统上是非常理想的。Hadoop上的应用程序也可以使用其他语言编写,如C++和Python
Hadoop存储框架—HDFS
HDFS是一种旨在普通硬件上有哪些的分布式文件系统。拥有非常优秀的容错能力,支持对应用程序数据的高吞吐量访问,并且适用于海量数据集的读写。HDFS是Hadoop的核心组件之一,用于存储数据。
HDFS简介及架构
HDFS是以分布式进行存储的文件系统,主要负责集群数据的存储和读取。其分布式体现在以下三个方面。
- HDFS并不是一个单机文件系统,而是分布在多个集群节点上的文件系统。节点之间通过网络通信进行协作,提供多个节点的文件信息,使每个用户均可以看到文件系统的文件,使多台机器上的多用户可以分享文件和存储空间。
- 当存储文件时,文件的数据将分布在多个节点上。数据存储不是按一个文件存储,而是将一个文件分成一个或多个数据块进行存储。数据块在存储时并不是都存储在一个节点上,而是被分别存储在各个节点中,并且数据块会在其他节点存储副本。
- 数据从多个节点读取。读取一个文件时,从多个节点中找到该文件的数据块,分别读取所有数据块,直至最后一个数据块读取完毕。
HDFS是一个主/从(Master/Slave)体系架构的分布式文件系统。HDFS支持传统的层次型文件组织结构,使得用户或应用程序可以创建目录,再将文件保存至目录中。文件系统命名空间的层次结构和大多数现有的文件系统类似,可以通过文件路径对文件执行创建、读取、更新和删除操作。
HDFS文件系统主要包含一个NameNode、一个Secondary NameNode和多个DataNode。
NameNode
NameNode用于存储元数据以及处理客户端发出的请求。元数据不是具体的文件内容,它包含3类重要信息。
第1类信息是文件和目录自身的属性信息,如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等;
第2类信息是记录文件内容存储的相关信息,如文件分块情况、副本个数、每个副本所在的DataNode信息等;
第3类信息是用于记录HDFS中所有DataNode的信息,用于DataNode管理。
在NameNode中存放元信息的文件是fsimage文件。在系统运行期间,所有对元数据的操作均保存在内存中,并被持久化到另一个文件edits中。当NameNode启动时,fsimage文件将被加载至内存,再对内存里的数据执行edits文件所记录的操作,以确保内存所保留的数据处于最新的状态。
Secondary NameNode
Secondary NameNode用于备份NameNode的数据,周期性地将edits文件合并到fsimage文件并在本地备份,然后将新的fsimage文件存储至NameNode,覆盖原有的fsimage文件,删除edits文件,并创建一个新的edits文件继续存储文件当前的修改状态。
DataNode
DataNode是真正存储数据的地方。在DataNode中,文件以数据块的形式进行存储。Hadoop 3.x默认128 MB为一个数据块,如果存储一个大小为129 MB的文件,那么文件将被分为两个数据块进行存储。当文件上传至HDFS端时,HDFS会将文件按128MB的数据块大小进行切割,将每个数据块存储至不同的或相同的DataNode并备份副本,一般默认备份3个副本。NameNode负责记录文件的分块信息,以确保在读取该文件时可以找到并整合所有数据块。
HDFS的特点
- 高容错性。HDFS上传的数据会自动保存多个副本,通过增加副本的数量增加HDFS的容错性。如果某一个副本丢失,那么HDFS将复制其他节点上的副本。
- 适合大规模数据的处理。HDFS能够处理GB、TB甚至PB级别的数据,数量级规模可达百万,数量非常大。
- 流式数据访问。HDFS以流式数据访问模式存储超大文件,有着“一次写入,多次读取”的特点,且文件一旦写入,不能修改,只能增加,以保证数据的一致性。
当然HDFS也不是完美的,同样存在局限性,如不适合低延迟数据访问,无法高效存储大量小文件、不支持多用户写入及任意修改文件。
Hadoop计算引擎—MapReduce
MapReduce是一个分布式运算程序的编程框架,是基于Hadoop的数据分析应用的核心框架。
MapReduce的核心功能是将用户编写的业务逻辑代码和自带的组件整合成一个完整的分布式运算程序,并行运行在Hadoop集群上。
MapReduce是Hadoop的核心计算框架,是用于大规模数据集(大于1TB)并行运算的编程模型,主要包括Map(映射)和Reduce(规约)两个阶段。
- 当启动一个MapReduce任务时,Map端将会读取HDFS上的数据,将数据映射成所需要的键值对类型并传至Reduce端。
- Reduce端接收Map端键值对类型的中间数据,并根据不同键进行分组,对每一组键相同的数据进行处理,得到新的键值对并输出至HDFS。
MapReduce作业执行流程
一个完整的MapReduce过程涉及数据的输入与分片、Map阶段数据处理、Shuffle&Sort阶段数据整合、Reduce阶段数据处理、数据输出等操作。
- 数据的输入与分片:MapReduce过程中的数据是从HDFS分布式文件系统中读取的。文件上传至HDFS时,一般按照128 MB分成若干个数据块,所以在运行MapReduce程序时,每个数据块均会对应一个Map任务。也可以通过重新设置文件分片大小调整Map的个数,在运行MapReduce程序时系统会根据所设置的分片大小对文件重新分片(Split)。
- Map阶段数据处理:一个程序有一个或多个Map任务,具体由默认存储或分片个数决定。在Map阶段,数据将以键值对的形式被读入,键的值一般为每行首字符与文件最初始位置的偏移量,即中间所隔字符个数,值为该行的数据记录。根据具体的需求对键值对进行处理,映射成新的键值对并传输至Reduce端。
- Shuffle&Sort阶段数据整合:此阶段是指从Map端输出开始,传输至Reduce端之前的过程。该过程会对同一个Map中输出的键相同的数据先进行整合,减少传输的数据量,并在整合后将数据按照键进行排序。
- Reduce阶段数据处理:Reduce任务可以有一个或多个,具体由Map阶段设置的数据分区确定,一个分区数据将被一个Reduce处理。针对每一个Reduce任务,Reduce会接收到不同Map任务传来的数据,并且每个Map传来的数据都是有序的。一个Reduce任务中的每一次处理均是针对所有键相同的数据,对数据进行规约,形成新的键值对。
- 数据输出:Reduce阶段处理完数据后即可将数据文件输出至HDFS,输出的文件个数和Reduce的个数一致。如果只有一个Reduce,那么输出只有一个数据文件,默认命名为“part-r-00000”。
Hadoop资源管理器—YARN
YARN是Hadoop的资源管理器,可以提高资源在集群的利用率,加快执行速率。YARN框架为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
Hadoop YARN提供了一个更加通用的资源管理和分布式应用框架。该框架使得用户可以根据自己的需求实现定制化的数据处理应用,既可以支持MapReduce计算,也可以很方便地管理如Hive、HBase、Pig、Spark/Shark等组件的应用程序。YARN的架构设计使得各类型的应用程序可以运行在Hadoop上,并通过YARN从系统层面进行统一管理。拥有了YARN框架,各种应用可以互不干扰地运行在同一个Hadoop系统中,以共享整个集群资源。
YARN框架总体上仍然是主/从结构,在整个资源管理框架中,ResourceManager为Master,NodeManager为Slave,ResourceManager负责对各个NodeManager上的资源进行统一管理和调度。用户提交一个应用程序时,需要提供一个用于跟踪和管理这个程序的ApplicationMaster,ApplicationMaster负责向ResourceManager申请资源,并要求NodeManger启动可以占用一定资源的任务。由于不同的ApplicationMaster被分布到不同的节点上,所以它们之间不会相互影响。
YARN主要由ResourceManager、Node-Manager、ApplicationMaster和Client App-lication这4个部分构成,具体说明如下。
ResourceManager(RM)。一个全局的资源管理器,负责整个系统的资源管理和分配。ResourceManager主要由两个组件构成,即调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)
调度器负责将系统中的资源分配给各个正在运行的应用程序,不从事任何与具体应用程序相关的工作,如监控或跟踪应用的执行状态等,也不负责重新启动因应用执行失败或硬件故障而产生的失败任务。
应用程序管理器负责处理客户端提交的Job以及协商第一个Container(包装资源的对象)以供ApplicationMaster运行,并且在ApplicationMaster失败时将其重新启动。其中,Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。当ApplicationMaster向RM申请资源时,RM为ApplicationMaster返回的资源就是使用Container表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。
NodeManager(NM)。每个节点上的资源和任务管理器。一方面,NM会定时地向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,NM会接收并处理来自ApplicationMaster的Container启动或停止等各种请求。
ApplicationMaster(AM)。在用户提交每个应用程序时,系统会生成一个ApplicationMaster并保存到提交的应用程序里。ApplicationMaster的主要功能如下。
- 与ResourceManager调度器协商以获取资源(用Container表示)。
- 对得到的任务进行进一步分配。
- 与NodeManager通信以启动或停止任务。
- 监控所有任务运行状态,在任务运行失败时重新为任务申请资源并重启任务。
Client Application。Client Application是客户端提交的应用程序。客户端会将应用程序提交到RM,然后RM将创建一个Application上下文件对象,再设置AM必需的资源请求信息,最后提交至RM。
Hadoop生态系统
Hadoop经过多年的发展,已经形成了一个相当成熟的生态系统。现代生活节奏快速,各行各业无时无刻产生着大量的数据,Hadoop发挥着重要的作用。因为各行各业的需求不同,很多时候需要在Hadoop的基础上进行一些改进和优化,也因此产生了许多围绕Hadoop衍生的工具,逐渐地演变成一个庞大的Hadoop生态系统
- Hive:Hive是建立在Hadoop基础上的数据仓库基础框架,提供了一系列工具,可存储、查询和分析存储在Hadoop中的大规模数据。Hive定义了一种类SQL语言为HQL,该语言编写的查询语句在Hive的底层将转换为复杂的MapReduce程序,运行在Hadoop大数据平台上。
- ZooKeeper:ZooKeeper主要用于保证集群各项功能的正常进行,并能够在功能出现异常时及时通知集群进行处理,保持数据一致性。ZooKeeper是对整个集群进行监控,可解决分布式环境下的数据管理问题。
- HBase:HBase是一个针对非结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。HBase提供了对大规模数据的随机、实时读写访问。同时,HBase中保存的数据可以使用MapReduce进行处理。HBase将数据存储和并行计算很好地结合在一起。
- Spark:Spark是一种快速、通用、可扩展的大数据处理引擎,继承了MapReduce分布式计算的优点并改进了MapReduce明显的缺点。Spark的中间输出结果可以保存在内存中,因此能更好地适用于数据挖掘与机器学习中迭代次数较多的算法。
- Flume:Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输系统,适用于日志文件的采集。
- Kafka:Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。Kafka是一个事件流平台,能够连接其他数据源进行持续的数据导入或导出,并且可以根据需求持久可靠地存储数据。