大数据技术原理与应用
- 大数据技术原理与应用
-
- 第一章 大数据概述
-
- 1、大数据的4v特征
- 2、大数据的影响
- 3、大数据的两大核心技术
- 4、大数据计算模式及代表产品
- 5、大数据与云计算、物联网的关系
- 第二章 大数据处理架构Hadoop
-
- 1、Hadoop的发展历史
- 2、Hadoop的特性
- 3、Hadoop1.0与Hadoop2.0的区别
- 4、Hadoop生态系统
- 5、Hadoop生态系统组件及功能
- 6、core-site.xml和hdfs-site.xml配置文件
- 第三章 分布式文件系统HDFS
-
- 1、分布式文件系统的结构
- 2、HDFS的局限性
- 3、块的概念
- 4、名称节点和数据节点
- 5、名称节点的数据结构和启动
- 6、数据节点
- 7、第二名称节点
- 8、HDFS体系结构
- 9、HDFS通信协议
- 10、HDFS存储原理
-
- 11、HDFS常用命令
- 第四章 分布式数据库HBase
-
- 1、HBase从BigTable说起
- 2、HBase和BigTable的底层技术对应关系:
- 3、HBase与传统数据库相比:
- 4、HBase数据模型
- 5、HBase的实现包含三个功能组件
- 6、HBase的三层结构
- 7、Region服务器工作原理
- 8、HLog工作原理
- 9、HBase性能优化的方法
- 10、HBase常见的shell命令
- 第五章 NoSQL
-
- 1、NoSQL的含义
- 2、NoSQL兴起的原因
- 3、Web2.0的特点
- 4、NoSQL与关系数据库对比
-
- 5、NoSQL数据库的四大类型
- 6、CAP
- 7、BASE
- 8、MongoDB的概念
- 第六章 云数据库
-
- 第七章 MapReduce
-
- 1、传统并行计算框架与MapReduce的区别
- 2、模型介绍
- 3、Map函数和Reduce函数
- 4、MapReduce体系结构
- 5、MapReduce的执行过程
- 6、分片
- 7、任务数量
- 第八章 Hadoop架构再探讨
-
- 1、Hadoop1.0的不足
- 2、Hadoop1.0到2.0的改进
- 3、HA工作原理
- 4、新一代资源管理调度框架YARN
-
- ResourceManager
- ApplicationMaster
- NodeManager
- 第九章Spark
-
- 1、spark的特点
- 2、spark和Hadoop对比
- 3、spark设计理念
- 4、spark生态系统组件
- 5、spark中的基本概念
- 6、spark运行基本流程
- 7、RDD运行原理
- 8、RDD之间的依赖关系
- 9、Stage的划分
-
- 10、RDD执行过程
- 11、spark SQL部署方式
- 第十章 流计算
-
- 1、常见的流计算框架
- 2、流处理系统与传统的数据处理系统有如下不同
大数据技术原理与应用
第一章 大数据概述
1、大数据的4v特征
volume大量化、velocity快速化、variety多样化、value价值化
2、大数据的影响
- 思维方式方面:大数据完全颠覆了传统的思维方式(全样而非抽样、效率而非精确、相关而非因果)。
- 社会发展方面:大数据决策逐渐成为一种新的决策方式,大数据应用有力促进了信息技术与各行业的深度融合,大数据开发大大推动了新技术和新应用的不断涌现。
- 就业市场方面:大数据的兴起使得数据科学家成为热门职业。
- 人才培养方面:大数据的兴起将在很大程度上改变中国高校信息技术相关专业的现有教学。
3、大数据的两大核心技术
- 分布式存储:GFS/HDFS、BigTable/HBase、NoSQL
- 分布式处理:MapReduce
4、大数据计算模式及代表产品
- 批处理计算:针对大规模数据的批量处理。MapReduce、Spark。
- 流计算:针对流数据的实时计算。Storm、S4、Flume、Streams、Puma、DStream、SuperMario、银河流数据处理平台。
- 图计算:针对大规模图结构数据的处理。Pregel、GraphX、Giraph、PowerGraph、Hama、GoldenOrb。
- 查询分析计算:大规模数据的存储管理和查询分析。Dremel、Hive、Cassandra、Impala。
5、大数据与云计算、物联网的关系
云计算、大数据和物联网代表了IT领域最新的技术发展趋势,三者相辅相成,既有联系又有区别。
- 云计算为大数据提供了技术基础;大数据为云计算提供用武之地。
- 云计算为物联网提供海量数据存储能力;物联网为云计算技术提供了广阔的应用空间。
- 物联网是大数据的重要来源;大数据技术为物联网数据分析提供支撑。
第二章 大数据处理架构Hadoop
1、Hadoop的发展历史
Apache软件基金会旗下的开源分布式平台,基于Java语言开发,具有很好的跨平台性,核心是分布式文件系统HDFS和MapReduce。Hadoop源自始于Apache Nutch项目。
2、Hadoop的特性
高可靠性、高效性、高可扩展性、高容错性、成本低、运行在Linux平台、支持多种编程语言。
3、Hadoop1.0与Hadoop2.0的区别
Hadoop2.0增加了HDFS HA和YARN两个系统。
4、Hadoop生态系统
5、Hadoop生态系统组件及功能
6、core-site.xml和hdfs-site.xml配置文件
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>file:/usr/local/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
- hadoop.tmp.dir表示存放临时数据的目录,即包括NameNode的数据,也包括DataNode的数据。该路径任意指定,只要实际存在该文件夹即可。
- name为fs.defaultFS的值,表示hdfs路径的逻辑名称。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/usr/local/hadoop/tmp/dfs/data</value>
</property></configuration>
- dfs.replication表示副本的数量,伪分布式要设置为1。
- dfs.namenode.name.dir表示本地磁盘目录,是存储fsimage文件的地方。
- dfs.datanode.data.dir表示本地磁盘目录,HDFS数据存放block的地方。
第三章 分布式文件系统HDFS
1、分布式文件系统的结构
分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群。分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode)。
2、HDFS的局限性
不适合低延迟数据访问、无法高效存储大量小文件、不支持多用户写入及任意修改文件。
3、块的概念
HDFS默认一个块64MB,HDFS2.0后默认大小128MB。
块的优点:
- 支持大规模文件存储:一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量
- 简化系统设计:大大简化了存储管理,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据
- 适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性
4、名称节点和数据节点
- 名称节点:存储元数据、元数据保存在内存中、保存文件,block,datanode之间的映射关系。
- 数据节点:存储文件内容、文件内容保存在磁盘、维护了block id到datanode本地文件的映射关系。
5、名称节点的数据结构和启动
在HDFS中,名称节点(NameNode)负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog。
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据。
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作。
- 名称节点记录了每个文件中各个块所在的数据节点的位置信息
在名称节点启动的时候,它会将FsImage文件中的内容加载到内存中,之后再执行EditLog文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。
一旦在内存中成功建立文件系统元数据的映射,则创建一个新的FsImage文件和一个空的EditLog文件。
名称节点启动之后,HDFS中的更新操作会重新写到EditLog文件中,因为FsImage文件一般都很大(GB级别的很常见),如果所有的更新操作都往FsImage文件中添加,这样会导致系统运行的十分缓慢,但是,如果往EditLog文件里面写就不会这样,因为EditLog 要小很多。每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新。
需要注意的是,名称节点在启动的过程中处于“安全模式”,只能对外提供读操作,无法提供写操作。启动过程结束后,系统会退出安全模式,进入正常运行状态,提供写操作。
6、数据节点
数据节点是分布式文件系统HDFS的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表。每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中。
7、第二名称节点
在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大。虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响用户的使用。
第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上。
第二名称节点的工作:
- 1、每隔一段时间,第二名称节点会和名称节点通信,请求其停止使用EditLog文件,暂时将新到达的写操作添加到一个新文件EditLog.new中。
- 2、第二名称节点把名称中的FsImage文件和EditLog文件拉回本地,再加载到内存中。
- 3、对二者执行合并操作。在内存中逐条执行EditLog文件中的操作,使得FsImage保持最新。
- 4、合并结束后,第二名称节点会把合并后得到的最新的FsImage文件发送到名称节点。
- 5、名称节点收到后,会用最新的FsImage文件替换旧的FsImage文件,同时用EditLog.new文件替换EditLog文件。
8、HDFS体系结构
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群包括一个名称节点(NameNode)和若干个数据节点(DataNode)。名称节点作为中心服务器,负责管理文件系统的命名空间及客户端对文件的访问。集群中的数据节点一般是一个节点运行一个数据节点进程,负责处理文件系统客户端的读/写请求,在名称节点的统一调度下进行数据块的创建、删除和复制等操作。每个数据节点的数据实际上是保存在本地Linux文件系统中的。
9、HDFS通信协议
- HDFS是一个部署在集群上的分布式文件系统,因此,很多数据需要通过网络进行传输。
- 所有的HDFS通信协议都是构建在TCP/IP协议基础之上的。
- 客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互。
- 名称节点和数据节点之间则使用数据节点协议进行交互。
- 客户端与数据节点的交互是通过RPC(Remote Procedure
Call)来实现的。在设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求。
10、HDFS存储原理
冗余数据保存
HDFS采用多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上。
优点:加快数据传输速度、容易检查数据错误、保证数据可靠性。
数据存取策略
- 数据存放:
第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
第二个副本:放置在与第一个副本不同的机架的节点上
第三个副本:与第一个副本相同机架的其他节点上
更多副本:随机节点
- 数据读取:
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID。当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据。
数据错误的种类
数据错误的三种:名称节点出错、数据节点出错、数据出错。
11、HDFS常用命令
- hadoop fs -ls :显示 指定的文件的详细信息
- hadoop fs -mkdir :创建指定的文件夹
- hadoop fs -cat :将指定的文件的内容输出到标准输出(stdout)
- hadoop fs -copyFromLocal :将本地源文件复制到路径指定的文件或文件夹中
第四章 分布式数据库HBase
1、HBase从BigTable说起
BigTable是一个分布式存储系统
2、HBase和BigTable的底层技术对应关系:
- 文件存储系统:HDFS(HBase)和GFS(BigTable)
- 海量数据处理:Hadoop MapReduce(HBase)和MapReduce(BigTable)
- 协同服务管理:Zookeeper(HBase)和Chubby(BigTable)
3、HBase与传统数据库相比:
- 数据类型:关系数据库采用关系模型,具有丰富的数据类型和存储方式,HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串。
- 数据操作:关系数据库中包含了丰富的操作,其中会涉及复杂的多表连接。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,因为HBase在设计上就避免了复杂的表和表之间的关系。
- 存储模式:关系数据库是基于行模式存储的。HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的。
- 数据索引:关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引——行键,通过巧妙的设计,HBase中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。
- 数据维护:在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而在HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
- 可伸缩性:关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。
4、HBase数据模型
- 表:HBase采用表来组织数据,表由行和列组成,列划分为若干个列族
- 行:每个HBase表都由若干行组成,每个行由行键(row key)来标识。
- 列族:一个HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元
- 列限定符:列族里的数据通过列限定符(或列)来定位
- 单元格:在HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组byte[]
- 时间戳:每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引
HBase中需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即[行键, 列族, 列限定符, 时间戳]
注意:HBase按列族进行物理存储。
5、HBase的实现包含三个功能组件
- 库函数:链接到每个客户端
- Master主服务器:负责管理和维护HBase表的分区信息,维护Region服务器列表,分配Region,负载均衡
- Region服务器:负责存储和维护分配给自己的Region,处理来自客户端的读写请求
客户端并不是直接从Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据。
客户端并不依赖Master,而是通过Zookeeper来获得Region位置信息,大多数客户端甚至从来不和Master通信,这种设计方式使得Master负载很小 。
开始只有一个Region,后来不断分裂。
Region拆分操作非常快,接近瞬间,因为拆分之后的Region读取的仍然是原存储文件,直到“合并”过程把存储文件异步地写到独立的文件之后,才会读取新文件。
6、HBase的三层结构
- 元数据表,又名.META.表,存储了Region和Region服务器的映射关系。当HBase表很大时,
.META.表也会被分裂成多个Region
- 根数据表,又名-ROOT-表,记录所有元数据的具体位置。-ROOT-表只有唯一一个Region,名字是在程序中被写死的
- Zookeeper文件记录了-ROOT-表的位置
7、Region服务器工作原理
- 用户读写数据过程:用户写入数据时,被分配到相应Region服务器去执行。用户数据首先被写入到MemStore和Hlog中。只有当操作写入Hlog之后,commit()调用才会将其返回给客户端。当用户读取数据时,Region服务器会首先访问MemStore缓存,如果找不到,再去磁盘上面的StoreFile中寻找。
- 缓存的刷新:系统会周期性地把MemStore缓存里的内容刷写到磁盘的StoreFile文件中,清空缓存,并在Hlog里面写入一个标记。每次刷写都生成一个新的StoreFile文件,因此,每个Store包含多个StoreFile文件。每个Region服务器都有一个自己的HLog文件,每次启动都检查该文件,确认最近一次执行缓存刷新操作之后是否发生新的写入操作;如果发现更新,则先写入MemStore,再刷写到StoreFile,最后删除旧的Hlog文件,开始为用户提供服务。
- StoreFile的合并:每次刷写都生成一个新的StoreFile,数量太多,影响查找速度。调用Store.compact()把多个合并成一个。合并操作比较耗费资源,只有数量达到一个阈值才启动合并。
8、HLog工作原理
- 分布式环境必须要考虑系统出错。HBase采用HLog保证系统恢复。HBase系统为每个Region服务器配置了一个HLog文件,它是一种预写式日志(Write
Ahead Log)。
- 用户更新数据必须首先写入日志后,才能写入MemStore缓存,并且,直到MemStore缓存内容对应的日志已经写入磁盘,该缓存内容才能被刷写到磁盘。
- Zookeeper会实时监测每个Region服务器的状态,当某个Region服务器发生故障时,Zookeeper会通知Master。
- Master首先会处理该故障Region服务器上面遗留的HLog文件,这个遗留的HLog文件中包含了来自多个Region对象的日志记录。
- 系统会根据每条日志记录所属的Region对象对HLog数据进行拆分,分别放到相应Region对象的目录下,然后,再将失效的Region重新分配到可用的Region服务器中,并把与该Region对象相关的HLog日志记录也发送给相应的Region服务器。
- Region服务器领取到分配给自己的Region对象以及与之相关的HLog日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入到MemStore缓存中,然后,刷新到磁盘的StoreFile文件中,完成数据恢复。
- 共用日志优点:提高对表的写操作性能;缺点:恢复时需要分拆日志。
9、HBase性能优化的方法
- 行键:行键是按照字典序存储,因此,设计行键时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块。
举个例子:如果最近写入HBase表中的数据是最可能被访问的,可以考虑将时间戳作为行键的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE - timestamp作为行键,这样能保证新写入的数据在读取时可以被快速命中。
- InMemory:创建表的时候,可以通过HColumnDescriptor.setInMemory(true)将表放到Region服务器的缓存中,保证在读取的时候被cache命中。
- Max Version:创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int
maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。
- Time To Live:创建表的时候,可以通过HColumnDescriptor.setTimeToLive(int
timeToLive)设置表中数据的存储生命期,过期数据将自动被删除,例如如果只需要存储最近两天的数据,那么可以设置setTimeToLive(2 * 24 * 60 * 60)。
10、HBase常见的shell命令
create ‘temptable’,’f1’,’f2’,’f3’
list
put ‘temptable’,’r1’,’f1:c1’,’hello,dblab’
scan ‘temptable’
get ‘temptable’,’r1’,{
COLUMN=>’f1:c1’}
enable/disable ‘temptable’
drop ‘temptable’
第五章 NoSQL
1、NoSQL的含义
2、NoSQL兴起的原因
关系数据库无法满足海量数据的管理需求、数据高并发的需求、高可扩展性和高可用性的需求
3、Web2.0的特点
- 网站系统通常不要求严格的数据库事务
- 不要求严格的读写实时性
- 通常不包含大量复杂的SQL查询(去结构化,存储空间换取更好的查询性能)
4、NoSQL与关系数据库对比
关系数据库
- 优势:以完善的关系代数理论作为基础,有严格的标准,支持事务ACID四性,借助索引机制可以实现高效的查询,技术成熟,有专业公司的技术支持
- 劣势:可扩展性较差,无法较好支持海量数据存储,数据模型过于死板、无法较好支持Web2.0应用,事务机制影响了系统的整体性能等
NoSQL数据库
- 优势:可以支持超大规模数据存储,灵活的数据模型可以很好地支持Web2.0应用,具有强大的横向扩展能力等
- 劣势:缺乏数学理论基础,复杂查询性能不高,大都不能实现事务强一致性,很难实现数据完整性,技术尚不成熟,缺乏专业团队的技术支持,维护较困难等
5、NoSQL数据库的四大类型
6、CAP
- C(Consistency):一致性,是指任何一个读操作总是能够读到之前完成的写操作的结果,也就是在分布式环境中,多点的数据是一致的,或者说,所有节点在同一时间具有相同的数据;
- A:(Availability):可用性,是指快速获取数据,可以在确定的时间内返回操作结果,保证每个请求不管成功或者失败都有响应;
- P(Tolerance of Network Partition):分区容忍性,是指当出现网络分区的情况时(即系统中的一部分节点无法和其他节点进行通信),分离的系统也能够正常运行,也就是说,系统中任意信息的丢失或失败不会影响系统的继续运作。
7、BASE
说起BASE(Basically Availble, Soft-state, Eventual consistency),不得不谈到ACID。
ACID的四性:
- A(Atomicity):原子性,是指事务必须是原子工作单元,对于其数据修改,要么全都执行,要么全都不执行
- C(Consistency):一致性,是指事务在完成时,必须使所有的数据都保持一致状态
- I(Isolation):隔离性,是指由并发事务所做的修改必须与任何其它并发事务所做的修改隔离
- D(Durability):持久性,是指事务完成之后,它对于系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持
BASE的基本含义:
基本可用(Basically Availble)、软状态(Soft-state)、最终一致性(Eventual consistency)
- 基本可用:指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用,也就是允许分区失败的情形出现。
- 软状态:“软状态(soft-state)”是与“硬状态(hard-state)”相对应的一种提法。数据库保存的数据是“硬状态”时,可以保证数据一致性,即保证数据一直是正确的。“软状态”是指状态可以有一段时间不同步,具有一定的滞后性。
- 最终一致性:
一致性的类型包括强一致性和弱一致性,二者的主要区别在于高并发的数据访问操作下,后续操作是否能够获取最新的数据。对于强一致性而言,当执行完一次更新操作后,后续的其他读操作就可以保证读到更新后的最新数据;反之,如果不能保证后续访问读到的都是更新后的最新数据,那么就是弱一致性。
最终一致性是弱一致性的一种特例,允许后续的访问操作可以暂时读不到更新后的数据,但是经过一段时间之后,必须最终读到更新后的数据。
8、MongoDB的概念
第六章 云数据库
1、概念
云数据库是部署和虚拟化在云计算环境中的数据库。云数据库是在云计算的大背景下发展起来的一种新兴的共享基础架构的方法,它极大地增强了数据库的存储能力,消除了人员、硬件、软件的重复配置,让软、硬件升级变得更加容易。云数据库具有高可扩展性、高可用性、采用多租形式和支持资源有效分发等特点。
2、特性
动态可扩展性、高可用性、较低的使用代价、易用性、高性能、免维护、安全。
第七章 MapReduce
1、传统并行计算框架与MapReduce的区别
2、模型介绍
- MapReduce将复杂的、运行于大规模集群上的并行计算过程高度地抽象到了两个函数:Map和Reduce。
- 编程容易,不需要掌握分布式并行编程细节,也可以很容易把自己的程序运行在分布式系统上,完成海量数据的计算。
- MapReduce采用“分而治之”策略,一个存储在分布式文件系统中的大规模数据集,会被切分成许多独立的分片(split),这些分片可以被多个Map任务并行处理。
- MapReduce设计的一个理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,因为,移动数据需要大量的网络传输开销。
- MapReduce框架采用了Master/Slave架构,包括一个Master和若干个Slave。Master上运行JobTracker,Slave上运行TaskTracker。
- Hadoop框架是用Java实现的,但是,MapReduce应用程序则不一定要用Java来写。
3、Map函数和Reduce函数
4、MapReduce体系结构
主要由四个部分组成,分别是:Client、JobTracker、TaskTracker以及Task。
- Client:用户编写的MapReduce程序通过Client提交到JobTracker端,用户可通过Client提供的一些接口查看作业运行状态。
- JobTracker:JobTracker负责资源监控和作业调度,JobTracker监控所有TaskTracker与Job的健康状况,一旦发现失败,就将相应的任务转移到其他节点,JobTracker会跟踪任务的执行进度、资源使用量等信息,并将这些信息告诉任务调度器(TaskScheduler),而调度器会在资源出现空闲时,选择合适的任务去使用这些资源。
- TaskTracker:TaskTracker
会周期性地通过“心跳”将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时接收JobTracker发送过来的命令并执行相应的操作(如启动新任务、杀死任务等),TaskTracker使用“slot”等量划分本节点上的资源量(CPU、内存等)。一个Task 获取到一个slot后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot 分为Mapslot 和Reduce slot 两种,分别供MapTask 和Reduce Task 使用。
- Task:Task 分为Map Task 和Reduce Task 两种,均由TaskTracker 启动。
5、MapReduce的执行过程
- 不同的Map任务之间不会进行通信
- 不同的Reduce任务之间也不会发生任何信息交换
- 用户不能显式地从一台机器向另一台机器发送消息
- 所有的数据交换都是通过MapReduce框架自身去实现的
6、分片
HDFS 以固定大小的block 为基本单位存储数据,而对于MapReduce 而言,其处理单位是split。split 是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。
7、任务数量
- Map任务的数量:Hadoop为每个split创建一个Map任务,split的多少决定了Map任务的数目。大多数情况下,理想的分片大小是一个HDFS块
- Reduce任务的数量:最优的Reduce任务个数取决于集群中可用的reduce任务槽(slot)的数目。通常设置比reduce任务槽数目稍微小一些的Reduce任务个数(这样可以预留一些系统资源处理可能发生的错误)
第八章 Hadoop架构再探讨
1、Hadoop1.0的不足
- 抽象层次低,需人工编码
- 表达能力有限
- 开发者自己管理作业(Job)之间的依赖关系
- 难以看到程序整体逻辑
- 执行迭代操作效率低
- 资源浪费(Map和Reduce分两阶段执行)
- 实时性差(适合批处理,不支持实时交互式)
2、Hadoop1.0到2.0的改进
3、HA工作原理
HDFS HA(High Availability)是为了解决单点故障问题。HA集群设置两个名称节点,“活跃(Active)”和“待命(Standby)”。两种名称节点的状态同步,可以借助于一个共享存储系统来实现。一旦活跃名称节点出现故障,就可以立即切换到待命名称节点。Zookeeper确保一个名称节点在对外服务。名称节点维护映射信息,数据节点同时向两个名称节点汇报信息
4、新一代资源管理调度框架YARN
ResourceManager
- 处理客户端请求
- 启动/监控ApplicationMaster
- 监控NodeManager
- 资源分配与调度
ApplicationMaster
- 为应用程序申请资源,并分配给内部任务
- 任务调度、监控与容错
NodeManager
- 单个节点上的资源管理
- 处理来自ResourceManger的命令
- 处理来自ApplicationMaster的命令
第九章Spark
1、spark的特点
运行速度快、容易使用、通用性、运行模式多样
2、spark和Hadoop对比
- 使用Hadoop进行迭代计算非常耗资源
- Spark将数据载入内存后,之后的迭代计算都可以直接使用内存中的中间结果作运算,避免了从磁盘中频繁读取数据
- Spark基于DAG的任务调度执行机制,要优于Hadoop MapReduce的迭代执行机制
3、spark设计理念
一个软件栈满足不同应用场景
4、spark生态系统组件
5、spark中的基本概念
- RDD:是Resillient Distributed Dataset(弹性分布式数据集)的简称,是分布式内存的一个抽象概念,提供了一种高度受限的共享内存模型
- DAG:是Directed Acyclic Graph(有向无环图)的简称,反映RDD之间的依赖关系
- Executor:是运行在工作节点(WorkerNode)的一个进程,负责运行Task
- Application:用户编写的Spark应用程序
- Task:运行在Executor上的工作单元
- Job:一个Job包含多个RDD及作用于相应RDD上的各种操作
- Stage:是Job的基本调度单位,一个Job会分为多组Task,每组Task被称为Stage,或者也被称为TaskSet,代表了一组关联的、相互之间没有Shuffle依赖关系的任务组成的任务集
6、spark运行基本流程
- 1、首先为应用构建起基本的运行环境,即由Driver创建一个SparkContext,进行资源的申请、任务的分配和监控。
- 2、资源管理器为Executor分配资源,并启动Executor进程。
- 3、SparkContext根据RDD的依赖关系构建DAG图,DAG图提交给DAGScheduler解析成Stage,然后把一个个TaskSet提交给底层调度器TaskScheduler处理;Executor向SparkContext申请Task,Task
Scheduler将Task发放给Executor运行,并提供应用程序代码。
- 4、Task在Executor上运行,把执行结果反馈给TaskScheduler,然后反馈给DAGScheduler,运行完毕后写入数据并释放所有资源。
总体而言,Spark运行架构具有以下特点:
(1)每个Application都有自己专属的Executor进程,并且该进程在Application运行期间一直驻留。Executor进程以多线程的方式运行Task
(2)Spark运行过程与资源管理器无关,只要能够获取Executor进程并保持通信即可
(3)Task采用了数据本地性和推测执行等优化机制
7、RDD运行原理
- 1、RDD读入外部数据源进行创建
- 2、RDD经过一系列的转换(Transformation)操作,每一次都会产生不同的RDD,供给下一个转换操作使用
- 3、最后一个RDD经过“动作”操作进行转换,并输出到外部数据源
8、RDD之间的依赖关系
- 窄依赖表现为一个父RDD的分区对应于一个子RDD的分区或多个父RDD的分区对应于一个子RDD的分区
- 宽依赖则表现为存在一个父RDD的一个分区对应一个子RDD的多个分区
9、Stage的划分
Spark通过分析各个RDD的依赖关系生成了DAG,再通过分析各个RDD中的分区之间的依赖关系来决定如何划分Stage,具体划分方法是:
- 在DAG中进行反向解析,遇到宽依赖就断开
- 遇到窄依赖就把当前的RDD加入到Stage中
- 将窄依赖尽量划分在同一个Stage中,可以实现流水线计算
被分成三个Stage,在Stage2中,从map到union都是窄依赖,这两步操作可以形成一个流水线操作
分区7通过map操作生成的分区9,可以不用等待分区8到分区10这个map操作的计算结束,而是继续进行union操作,得到分区13,这样流水线执行大大提高了计算的效率。
Stage的类型
ShuffleMapStage和ResultStage
(1)ShuffleMapStage:在它之后还有其他Stage,它的输出一定需要经过Shuffle过程,并作为后续Stage的输入;这种Stage是以Shuffle为输出边界,其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出,其输出可以是另一个Stage的开始;在一个Job里可能有该类型的Stage,也可能没有该类型Stage;
(2)ResultStage:最终的Stage,没有输出,而是直接产生结果或存储。这种Stage是直接输出结果,其输入边界可以是从外部获取数据,也可以是另一个ShuffleMapStage的输出。在一个Job里必定有该类型Stage。因此,一个Job含有一个或多个Stage,其中至少含有一个ResultStage。
10、RDD执行过程
a、创建RDD对象;
b、SparkContext负责计算RDD之间的依赖关系,构建DAG;
c、DAGScheduler负责把DAG图分解成多个Stage,每个Stage中包含了多个Task,每个Task会被TaskScheduler分发给各个WorkerNode上的Executor去执行。
11、spark SQL部署方式
- Standalone(类似于MapReduce1.0,slot为资源分配单位)
- Spark on Mesos(和Spark有血缘关系,更好支持Mesos)
- Spark on YARN
第十章 流计算
1、常见的流计算框架
商业级的流计算平台(IBM …)、开源流计算框架(Twitter storm,yahoo)、公司为支持自身业务开发的流计算框架(Facebook,dstream)
2、流处理系统与传统的数据处理系统有如下不同
- 流处理系统处理的是实时的数据,而传统的数据处理系统处理的是预先存储好的静态数据。
- 用户通过流处理系统获取的是实时结果,而通过传统的数据处理系统,获取的是过去某一时刻的结果。
- 流处理系统无需用户主动发出查询,实时查询服务可以主动将实时结果推送给用户。