1 前言
最近学习了一下大数据,算是对于大数据进行了一个大致的了解掌握,以下是个人在学习大数据方面的总结,
2 大数据能为我们做什么
数据即资产,在互联网和云时代的今天,大数据的分析能为企业带来无穷的价值,同时,大数据量的分析也能够使我们掌握数据,分析规律。
大数据改造了我们的生活,它能优化、提高、高效化并最终捕获住利益。
3 Hadoop
既然要学习大数据相关,那就有必要去了解一下Hadoop,Hadoop的官网是这么进行介绍Hadoop的
Hadoop是一个依赖分布式集群下的处理大数据,大批量计算的执行引擎框架。首先Hadoop能够不依赖于服务器硬件能力的情况下,甚至通过普通PC服务器环境,集群搭建而进行大数据处理。
The Apache Hadoop software library is a framework that allows for the
distributed processing of large data sets across clusters of computers
using simple programming models. It is designed to scale up from
single servers to thousands of machines, each offering local
computation and storage. Rather than rely on hardware to deliver
high-availability, the library itself is designed to detect and handle
failures at the application layer, so delivering a highly-available
service on top of a cluster of computers, each of which may be prone
to failures.
对于大批量的数据处理,我们自然不能够依赖于创造出一个超大性能的单机服务来处理。Hadoop基于Google在2003和2004先后发表的 Google 文件系统 GFS 和 MapReduce 编程模型两篇论文:
google的论文原著解析可以参考:https://www.cnblogs.com/niejingsong/p/11116830.html
06 年 Nutch 项目子项目之一的 Hadoop 实现了两个强有力的开源产品:HDFS 和 MapReduce.自此,Hadoop成为了典型的大数据批量处理架构,通过Hdfs进行数据静态处理,并通过 MapReduce 将计算逻辑分配到各数据节点进行数据计算和价值发现.之后以 HDFS 和 MapReduce 为基础建立了很多项目,形成了 Hadoop 生态圈.
3.1 HDFS
hdfs是全称为:Hadoop Distributed File System,分布式文件存储系统,对于外部而言,hdfs就像一个传统的文件系统,可以进行创建,删除,移动,或者重命名文件或者文件夹得操作,与Linux文件系统类似
hdfs
官网:https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
hdfs 遵从主从架构(Master/slave)一个集群包含一个NameNode(管理文件命名空间并控制客户端对文件得访问得主服务,NameNode决定是否将文件映射到DataNode上得文件快中【Block】), 和一系列得DataNode节点(用于存储数据并接收客户端得读写请求)。
一般用户存储在HDFS得文件,在一个文件系统中的文件将被划分为一个或多个段和/或存储在个人数据的节点。这些文件段被称为块【Block】。换句话说,数据的HDFS可以读取或写入的最小量被称为一个块。缺省的块大小为64MB,但它可以增加按需要在HDFS配置来改变。
每一个DataNode包含若干个Blocks,并且DataNode以Rack(机架)得形式组织,机架通过交换机将所有得DataNode连接起来。
一个典型得部署策略是:有一个台专用服务器,它只运行NameNode,集群中得其他机器都运行每一个DataNode 数据节点实例,该体系结构不排除在同一台机器上运行多个DataNode,但是实际得生产环境是很少这么做:
A typical deployment has a dedicated machine that runs only the NameNode software. Each of the other machines in the cluster runs one instance of the DataNode software. The architecture does not preclude running multiple DataNodes on the same machine but in a real deployment that is rarely the case.
集群中单个NameNode节点得存在大大简化了系统得体系结构,NameNode是所有HDFS元数据的仲裁者和存储库,这样的设计模式使得用户数据永远不会通过NameNode:
The existence of a single NameNode in a cluster greatly simplifies the architecture of the system. The NameNode is the arbitrator and repository for all HDFS metadata. The system is designed in such a way that user data never flows through the NameNode.
对于:NameNode是所有HDFS元数据的仲裁者和存储库,我们这样理解:
- NameNode依赖来自每一个DataNode节点的定期心跳(heartbeat)消息,每条消息都包含一个块报告,NameNode节点可以根据这个报告验证块映射和其他文件系统元数据,如果数据节点不能发送心跳消息,名称节点将采取修复措施,重新复制在该节点上丢失的块。
- NameNode接收来自客户端发送向NodeName节点的写请求,通过拆分的Block块信息,返回给客户端集群中的可用的DataNode列表。
对于集群中包含一个NameNode节点,防止单点故障,我们这样理解:
名称节点将整个文件系统名称空间和文件Blockmap的镜像(fsImage)信息存储在内存中,当名称节点启动或者检查点(checkpoint )由可配置阈值触发时,它从磁盘中读取文件镜像(fsimage)和修改日志文件(edits),(每个fsimage文件存储的都是文件系统元数据信息(文件及目录结构 组成文件的块的信息 副本数量信息)),如果namenode发生故障,最近的fsimage文件会被载入到内存中,用来重构元数据的最近状态,再从相关点开始向前执行edits日志文件中记录的每个事务,[这就是hafs中的检查点(checkpoint)]数据块Block存储在datanode中,但是fsimage文件中并不描述block和datanode的映射关系,取而代之的是,namenode将这种映射关系存储在内存中,这种映射关系通过datanode向namenode发送最新的块列表信息,使namenode在内存中生成这种映射关系。
检查点(checkpoint)【有的叫Secondary NameNode】的目的是通过获取文件系统元数据的快照并将其保存到Fs Image,确保HDFS对文件系统元数据具有一致的视图
The NameNode keeps an image of the entire file system namespace and file Blockmap in memory. When the NameNode starts up, or a checkpoint is triggered by a configurable threshold, it reads the FsImage and EditLog from disk, applies all the transactions from the EditLog to the in-memory representation of the FsImage, and flushes out this new version into a new FsImage on disk. It can then truncate the old EditLog because its transactions have been applied to the persistent FsImage. This process is called a checkpoint. The purpose of a checkpoint is to make sure that HDFS has a consistent view of the file system metadata by taking a snapshot of the file system metadata and saving it to FsImage. Even though it is efficient to read a FsImage, it is not efficient to make incremental edits directly to a FsImage. Instead of modifying FsImage for each edit, we persist the edits in the Editlog. During the checkpoint the changes from Editlog are applied to the FsImage. A checkpoint can be triggered at a given time interval (dfs.namenode.checkpoint.period) expressed in seconds, or after a given number of filesystem transactions have accumulated (dfs.namenode.checkpoint.txns). If both of these properties are set, the first threshold to be reached triggers a checkpoint.
关于namenode中的fsimage和edits文件可以参考:
https://blog.csdn.net/qq_43295093/article/details/84945285
或者可以通过主备,搭建高可用的安装集群环境解决
HDFS文件写入流程:
文件在客户端时会分成块,这里可以看到文件被分成五个块,A,B,C,D,E。同时为了负载均衡,每个节点有三个块(Block),下面来看具体的操作:
- 1,客户端将要上传的文件按128M的大小分块
- 2,客户端向nameNode节点发送写请求
- 3,名称节点记录各个Datanode信息,并返回可用的Datanode列表
- 4,客户端直接向Datanode发送分割后的文件快,发送过程以流写入
- 5,写入完成后,Datanode向Namenode发送消息,更新元数据
在执行读写的操作中,Namenode和DataNode通过heartbeat进行保存通信,确定Datanode活着,如果发现DataNode死了,就将死掉的Datanode上的数据,放到其他节点上,读取时,读取其他节点,宕掉一个节点没关系,还有其他节点可以备份;甚至,宕掉某一个机架也没关系;其他机架上也有备份
3.2 MapReduce
MapReduce是Google提出的一个软件架构,用于大规模数据集(1TB)的并行运算,概念“Map(映射)” 和 “Reduce(归纳)”及他们的主要思想,都是从函数式编程语言借鉴的,还有从矢量编程语言借来的特性。
当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归纳)函数,用来保证所有映射的键值对中的每一个共享相同的键组。【维基百科】
Hadoop的官网给出了一个简单的MapReduce的实例:
https://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html#Example:_WordCount_v1.0
对于一个完整的MapReduce的计算过程,包括从数据的输入,数据的处理,数据的输出这些部分,而其中数据的处理部分就要map,reduce,combiner等操作组成。在一个mapreduce的作业中必定会涉及到如下一些组件:
- 1,客户端。提交MapReduce作业
- 2、yarn资源管理器,负责集群上计算资源的协调
- 3、yarn节点管理器,负责启动和监控集群中机器上的计算容器(container)
- 4、mapreduce的application master,负责协调运行mapreduce的作业
- 5、hdfs,分布式文件系统,负责与其他实体共享作业文件
一个完整的MapReduce计算流程处理:
https://www.cnblogs.com/zsql/p/11600136.html#_label0
3.3 YARN
apache Yarn(Yet Another Resource Negotiator的缩写)是Hadoop集群的资源管理器系统。
在MapReduce1.x中,具有以下的局限性:
- 1、扩展性差:jobtracker兼顾资源管理和作业控制跟踪功能跟踪任务,启动失败或迟缓的任务,记录任务的执行状态,维护计数器),压力大,成为系统的瓶颈
- 2、可靠性差:采用了master/slave结构,master容易单点故障
- 3、资源利用率低:基于槽位的资源分配模型,槽位是一种粗粒度的资源划分单位,通常一个任务不会用完一个槽位的资源,hadoop1分为map slot和reduce slot,而它们之间资源不共享,造成一些资源空闲。
- 4、不支持多框架:不支持多种计算框架并行
Yarn整体上还是属于master/slave架构,主要依赖三个组件来实现功能:
- ResourceManager:是集群资源的仲裁者,它包括两部分:一个是可插拔式的调度Scheduler,一个是ApplicationManager
- NodeManager:每个节点的Manager,管理改节点上的用户作业和工作流,也会不断发送自己Container使用情况给ResourceManager
- ApplicationMaster:用户作业生命周期的管理者它的主要功能就是向ResourceManager(全局的)申请计算资源(Containers)并且和NodeManager交互来执行和监控具体的task
4 Spark
Spark是一个基于内存的快速,通用,可扩展的大数据分析引擎,实际上,Spark针对于Hadoop内部中的MapReduce的一个升级。
官网:http://spark.apache.org/
作为Hadoop内部的MapReduce计算引擎,自然Spark的计算能力是优于MapReduce的:
官网也是直接贴出了比MapReduce快一百倍的数据对别:
为什么Spark的运算速度比MapReduce快?
通常大家只是说Spark是基于内存计算的,速度比MapReducer要快,或者说内存中迭代计算。其实我们要抓住问题的本质。总结有以下几点:
1、Spark vs MapReduce ≠ 内存 vs 磁盘
其实Spark和MapReduce的计算都发生在内存中,区别在于:
- MapReduce通常需要将计算的中间结果写入磁盘,然后还要读取磁盘,从而导致了频繁的磁盘IO。
- Spark则不需要将计算的中间结果写入磁盘,这得益于Spark的RDD(弹性分布式数据集,很强大)和DAG(有向无环图),其中DAG记录了job的stage以及在job执行过程中父RDD和子RDD之间的依赖关系。中间结果能够以RDD的形式存放在内存中,且能够从DAG中恢复,大大减少了磁盘IO。
2、Spark vs MapReduce Shuffle的不同
mapreduce确保每个reduce的输入都是按照键值排序的,系统执行排序,将map的输入作为reduce的输入过程称之为shuffle过程
Spark和MapReduce在计算过程中通常都不可避免的会进行Shuffle,两者至少有一点不同:
- MapReduce在Shuffle时需要花费大量时间进行排序,排序在MapReduce的Shuffle中似乎是不可避免的;
- Spark在Shuffle时则只有部分场景才需要排序,支持基于Hash的分布式聚合,更加省时;
3、多进程模型 vs 多线程模型的区别
- MapReduce采用了多进程模型,而Spark采用了多线程模型。多进程模型的好处是便于细粒度控制每个任务占用的资源,但每次任务的启动都会消耗一定的启动时间。就是说MapReduce的Map Task和Reduce Task是进程级别的,而Spark Task则是基于线程模型的,就是说mapreduce 中的 map 和 reduce 都是 jvm 进程,每次启动都需要重新申请资源,消耗了不必要的时间(假设容器启动时间大概1s,如果有1200个block,那么单独启动map进程事件就需要20分钟)
- Spark则是通过复用线程池中的线程来减少启动、关闭task所需要的开销。(多线程模型也有缺点,由于同节点上所有任务运行在一个进程中,因此,会出现严重的资源争用,难以细粒度控制每个任务占用资源)
Spark的集群结构:
spark支持的集群管理工具(资源管理) Yarn,Mesos,Kubernetes,自身(Standalone)
5 Flink
TODO https://flink.apache.org/zh/
6 参考
Hadoop官方介绍
HDFS官方文档
MapReduce官方文档
YARN官方文档
Hadoop生态系列
Hdfs学习(edits日志文件和fsimage文件)
MapReduce作业运行过程
Spark 学习: spark 原理简述
Spark官网
针对于Hadoop1.X中的JobTracker和TaskTracker的逻辑