赞
踩
- 定义:复杂的批量数据处理,通常的时间跨度在几分钟到数小时之间。
-
- 7.1 批处理技术的概念
- 数据批处理,其最主要的应用场景就是传统的ETL过程。如电信领域的KPI,KQI计算。经过探针采集上来后,按照一定的规则转换成原始单据,根据业务需求,按周期(15分钟,60分钟,天)等
- 粒度计算成业务单据。这一过程使用数据库来承担。传统的数据库遇到瓶颈后,就出现了MPP技术。google研究员另辟蹊径,从传统的函数式编程里得到灵感,发明了MapReduce,使得大规模扩展成为
- 可能。Spark一开始就是为了替代MapReduce,后来逐渐发展成了数据处理统一平台。除了迭代式的计算外,大规模机器学习需要另外的框架,所以会讲到BSP技术。在这个过程会遇到两个关键的技术:
- 一种是CodeGen,另外一种是CPU亲和技术。批处理为了提高吞吐量,cpu的利用率是关键。
-
- 7.2 MPP DB技术
- 传统的数据库人员第一时间想到的是用数据库来承担etl的后分析,因为数据库最大的好处是对sql的支持。
- 以 Greenplum 为代表的的 MPP 数据库,这类数据库突破了传统数据库单点的瓶颈,扩展性得到一定的提升,在一定数据规模下(TB级别),MPP可以起到很好的效果。在数据量持续上升(PB),
- 由于MPP本身架构上的限制,遇到了明显的扩展瓶颈。Hadoop的出现,解决了扩展性问题。
- 另外MPP的计算和存储过程是耦合的,这方面比不上mapreduce,hdfs的分离设计。分离最大的优点是,除了mapreduce 引擎外,还可以根据业务需求选择图计算,深度学习等其他框架。从
- 目前的应用来说,一份数据选择多个引擎以应对多个业务是必然的选择。
-
- 7.3 MapReduce编程框架
- 7.3.1 MapReduce起源
- hadoop 的思想起源于google的几篇论文,论文中写道,mapreduce的灵感来源于函数式语言(如Lisp)中内置的函数Map和Reduce。简单来说,在函数式编程语言里面,Map表示对一张
- 列表(List)中的每个元素进行计算,Reduce 表示对一张列表中的每个元素进行迭代式计算。它们具体的计算是通过传入的函数来实现的,而map和reduce提供的是计算框架。不过,这样的解释
- 到现实中的mapreduce相差太远,仍然需要一个跳跃。再仔细看,reduce既然能做迭代计算,那就表示列表中的元素是相关的;而map则是对列表中的每个元素做单独处理,这表示列表中的数据
- 是杂乱无章的。这样看来,就有点联系了。在mapreduce里,map处理的是原始数据,自然是杂乱无章的,各条数据之间是没有联系的;到了reduce阶段,数据是以key后根跟着若干value来组织的,
- 这些value有相关性,符合函数式语言里map和reduce的基本思想。
-
- 这样就可以把mapreduce理解为:把一对杂乱无章的数据按照某种特征归纳起来,然后处理并得到最后的结果。map面对的是杂乱无章的,互不相关的数据,它解析每个数据,从中提取出key和value,
- 也就是提取数据的特征。经过mapreduce的shuffle阶段之后,在reduce阶段看到的是已经归纳好的数据,在此基础上可以做进一步处理以便得到结果。
-
- 7.3.2 MapReduce原理
- mapreduce是一种云计算的核心计算模式,是一种分布式运算技术,也是简化的分布式并行编程模式,主要用于大规模并行程序并行问题。
-
- mapreduce模式的主要思想是自动将一个大的计算(如程序)拆解成map(映射)和reduce(化简)的方式。
-
- 数据被分隔后,通过map函数将数据映射成不同的区块,分配给计算机集群进行处理,已到达分布式运算的效果,再通过reduce函数将结果会整,从而输出开发者所需的结果。
-
- mapreduce借鉴了函数式程序设计语言的设计思想,其软件实现是指定一个map函数,把键值对(key/value)映射成新的键值对,形成一系列中间结果形式的键值对,然后把他们传递给reduce(规约)
- 函数,把具有相同中间形式key的value合并在一起。map和reduce函数具有一定的相关性。
-
- mapreduce致力于解决大规模数据处理的问题,因此在设计之初就考虑了数据的局部性原理,将整个问题分而治之。mapreduce集群由普通的pc构成,为无共享式架构。在处理之前,将数据集分布至各个
- 节点;在处理时,每个节点就近读取本地存储的数据处理(map),将处理后的数据进行合并(Combine),排序(Shuffle and Sort)后再分发(至Reduce节点),从而避免了大量数据的传输,提供了处理效率。
- 无共享架构的另一个好处是配合复制(Replication)策略,集群可以具有良好的容错性,一部分节点宕机不会影响整个集群的正常工作。
-
- 7.3.3 Shuffle
- shuffle过程是mapreduce的核心,也被称为奇迹发生的地方。
-
- shuffle的大致范围就是怎样把MapTask 的输出结果有效的传送至Reduce端。也可以这样理解,shuffle描述了数据从MapTask输出到ReduceTask输入的这一过程。
-
- 在hadoop这样的集群环境中,大部分MapTask与 ReduceTask 的执行在不同的节点上。当然很多情况下Reduce在执行时需要跨节点去拉取其他节点的MapTask结果。如果集群正在运行的job有
- 很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种消耗是正常的,我们不能限制,能做的就是最大化的减少不必要的消耗。另外,在节点内,相比于内存,磁盘IO对job完成时间的影响
- 也是可观的。
- 从最基本的要求来说,我们对shuffle过程的期望可以有:完整的从map端拉取数据到reduce端;在跨节点拉取数据时,尽可能的减少对带宽的不必要损耗,减少磁盘IO对task执行的影响。
-
- 先看Map端的情况,整个过程分为4个步骤:
- 1.在maptask执行时,其输入数据来源于hdfs的Block。Split与Block的对应关系默认是一对一。在WordCount例子中,假设map的输入数据都是像"aaa"这样的字符串
- 2.在经过Mapper的运行后,输出是这样的一个key/value对:key是"aaa",value是1.我们知道这个job有3个ReduceTask,到底当前的"aaa"应该交给哪个Reducer区处理,是需要决定的。
- MapReduce提供了Partitioner接口,其作用是根据key或者value及Reduce的数量来决定当前的这对输出数据最终应该交给哪个ReduceTask处理。默认对key进行哈希运算后,再以ReduceTask
- 数据取模。在该案例中,"aaa"经过Partition(分区)后返回0,也就是对输出数据应该交由第一个Reducer来处理。接下来需要将数据写入内存缓冲区中。缓冲区的作用是批量收集Map结果,减少磁盘
- IO。
- 3.内存缓冲区的大小优先,默认是100MB。当maptask的输出结果有很多时,内存可能会不足,所以需要在一定条件下将缓冲区的数据临时写入磁盘,然后重新利用这个缓冲区。这个从内存往磁盘写数据
- 的过程被称为Spill,中文可以译为溢写。
- 4.每次溢写都会在磁盘上生成一个溢写文件,如果map的输出结果很大,就会有多次这样的溢写发生,磁盘上就会有很多溢写文件存在。当maptask真正完成时,内存缓冲区的数据将全部溢写到磁盘中形成
- 一个溢写文件。最终磁盘中会至少有一个这样的溢写文件存在(如果map的输出结果很少,那么当map执行完成时,就会产生一个溢写文件)。因为最终的文件只有一个,所以需要将这些溢写文件归并到一起,
- 这样过程就叫Merge,至此,Map端的所有工作已经结束。
-
- 每个ReduceTask 不断的通过 rpc 从JobTracker哪里获取MapTask是否完成的信息。如果reducetask 获取某台 tasktracker上的maptask执行完成,那么shuffle 的后半段过程开始启动。简单的说,
- reducetask在执行之前的工作就是不断的拉取当前job里每个maptask的最终结果,然后对从不同地方拉取过来的数据进行不断的Merge,最终形成一个文件作为ReduceTask的输入文件。
-
- Shuffle 在 reduce 端的过程也能用三个点概括:
- 1.copy 过程,即简单的拉取数据。reduce 进程启动一些数据 copy线程(Fetcher),通过http方式请求maptask所在的TaskTracker获取MapTask的输出文件。因为maptask早已结束,所以这些文件
- 就由TaskTracker管理。
- 2.Merge阶段。同Map端的Merge动作,只是数组中存放的是不同Map段复制过来的数据。复制古来的数据会先放入内存缓冲区中,当内存中的数据量达到一定阈值时,就会启动内存到磁盘的Merge。与Map端
- 类似,这也是溢写的过程,会在磁盘中生成众多的溢写文件,然后将这些溢写文件进行归并。
- 3.Reducer 的输入文件。不断进行Merge后,最后会生成一个"最终文件"。这个文件可能存放在磁盘上,可能也存放在内存中,默认存放在磁盘上。当Reducer的输入文件已定时,整个shuffle过程才最终
- 结束。
-
- 7.3.4 性能差的主要原因
- 宏观上,hadoop的每个作业都要经历2个阶段:MapPhase 和 ReducePhase。对于mapphase,又主要包含4个子阶段:从磁盘上读取数据 -> 执行map函数 -> combine 结果 -> 将结果写到磁盘上;
- 对于ReducePhase,同样包含4个子阶段:从各个MapTask 上读取相应的数据(Shuffle) -> sort -> 执行 Reduce 函数 -> 将结果保存到 hdfs 中。
-
- hadoop 处理流程中的两个子阶段严重降低了其性能。一方面,map阶段产生的中间结果要写到磁盘上,这样做的主要目的是提供系统的可靠性,但代价是降低了系统性能;另一方面,shuffle阶段采用http协议
- 从各个MapTask上远程复制结果,这种设计思路同样降低了系统性能。
- 可以看出,磁盘读写速度慢是导致MapReduce性能差的主要原因。Spark恰好看到了内存容量的增大和成本降低,决定用一个基于内存的框架去代替MapReduce,在性能上有了极大的提升。
-
- 7.4 Spark架构和原理
- 7.4.1 Spark的起源和特点
- Spark 起源于美国加利福尼亚大学伯克利分校 AMPLab 的集群计算平台。它立足与内存计算,从多迭代批量处理出发,兼收并蓄数据仓库,流处理和图像计算等多种计算范式。
-
- 1.内存发展趋势
- 内容的发展一直遵循摩尔定律,价格一直下降,而容量一直增加。现在的主流服务器,几百GB或者几TB的内存都很常见,内存的发展使得内存数据库得以实现,如著名的
- VoltDB。Spark 也看好这种趋势,所以设计的是一个基于内存的分布式处理软件,也就是说Spark的目标是取代MapReduce。
-
- 2.Spark的愿景
- 当前开源社区针对不同的场景,存在多种引擎,如 Hadoop,Cassandra,Mesos等。Spark的愿景是做一个统一的引擎,可以统一批处理,交互式处理,流处理等多个场景,
- 降低开发和运维难度。
-
- 3.Spark与Hadoop对比
- 1.spark的中间数据存放在内存中,对于迭代式运算而言,效率更高
- 2.spark更适合迭代式运算比较多的数据挖掘和机器学习运算,因为spark离的RDD的抽象概念。
- 3.spark比hadoop更通用
- 4.spark提供的数据集操作类型很多,而hadoop只提供了map和reduce两种操作。
- 5.容错性。在分布式数据集计算时通过Checkpoiint来实现容错
- 6.可用性。spark通过提供丰富的scala,java,python api 及交互式shell来提供可用性。
-
- 4.Spark与Hadoop结合
- spark 可以直接对hdfs 进行数据读写。同样支持 Spark on YARN。spark 可以和 mapreduce 运行在同一集群中,共享存储资源与计算。
-
- 5.Spark 的适用场景
- spark 是基于内存的迭代计算框架,适用于需要多次操作特定数据集的场合。需要反复操作的次数越多,需要读取的数据量越大,性能提升越大;数据量小但是计算密集
- 度较大的场合,性能提升就相对较小。
- 由于RDD的特性,spark 不适合那种异步细粒度更新状态的应用。如web服务的存储于增量的web爬虫与索引。总体来说,spark的使用范围较广,且较为通用。
-
- 7.4.2 Spark的核心概念
- 1.概念
- 1) 基本概念
- 1.RDD : Resilient Distributed Dataset,弹性分布式数据集
- 2.Operation : 作用于rdd的各种错,包括Transformation 和 Action
- 3.Job: 作业,一个job包含多个rdd及作用于响应rdd上的各种Operation。
- 4.Stage:一个作业分为多个阶段
- 5.Partition:数据分区,一个rdd中的数据可以分成多个不同的区。
- 6.DAG:Directed Acycle Graph,有向无环图,反应rdd之间的依赖关系
- 7.Narrow Dependency:窄依赖,子rdd依赖于父rdd中固定的data partition.
- 8.Wide Dependency:宽依赖,子rdd对父rdd中的所有Data Partition都有依赖
- 9.Caching Management:缓存管理,对rdd的中间计算结果进行缓存管理,以加快整体的处理速度
-
- 2) 编程模型
- rdd是只读的数据分区集合,注意是数据集。
-
- 3) 运行态
- 不管是什么样的静态模型,其在动态运行的时候无外乎由进程,线程组成。用spark的术语来说,Static View 称为 Dataset View,而Dynamic View 称为
- Partition View。
-
- 4) 部署
- spark 支持 Standalone,Mesos,YARN 等部署模式。
-
- 5) Resilient Distributed Dataset(RDD)弹性分布式数据集
- rdd 是spark的最基本抽象,是对分布式内存的抽象使用,以操作本地集合的方式来操作分布式数据集的抽象实现。rdd是spark最核心的内容,它表示已被分区,不可变的,
- 能够被并行操作的数据集,不同的数据集格式对应不同的rdd实现。rdd必须是可序列化的。rdd可以缓存到内存中,每次对rdd数据集的操作结果都可以存放到内存中,下一个操作
- 可以直接从内存中输入,省去了mapreduce大量的磁盘io操作。
-
- 2.Spark机制详解
- 1.编程接口
- spark 通过预编程语言集成的方式暴露rdd的操作。
-
- 1.scala
- 2.java
- 3.python
- 4.spark sql
- 5.DataSource API
- 6.DataFrame API
- 7.DataFrame
-
- 7.Shuffle 实现
- 在MapReduce 框架中,shuffle 是连接map和reduce的桥梁,在map和reduce 两个过程中必须经过 shuffle 这个环节,shuffle的性能高低直接影响到整个程序的性能和
- 吞吐量。spark作为一个 mapreduce 框架的一种实现,自然也实现了shuffle的逻辑。
-
- 1.shuffle 简介
- shuffle 是mapreduce 框架中的一个特定的 phase,介于 map phase 和 reduce phase 之间。当 map 的输出结果被 reduce 使用时,输出结果需要按key进行
- 哈希运算,并且分发到每一个 Reducer 上,这个过程就是 shuffle。由于shuffle 涉及磁盘的读写和网络传输,因此shuffle性能的高低直接影响到整个程序的运行效率。
-
- 7.5 BSP框架
- spark,hadoop 是迭代模式,只适合一般的计算,在机器学习等计算量非常大的领域,传统的迭代式模型不再使用。BSP 就是为了解决一些特定场景的计算量问题。
-
- 7.5.1 什么是BSP模型
- BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型。和mapreduce 一样,google 并没有开源Pregel,Apache 按照 Pregel的思想提供了类型的框架
- Hama。
- 并行计算模型通常是指并行算法的设计和分析出发,将各种并行计算机的基本特征抽象出来,形成一个抽象的计算模型。常见的并行计算模型有 PRAM模型,LogP模型,BSP模型,C3模型,BDM 模型。
-
- 7.5.2 并行模型介绍
-
- 7.5.3 BSP模型基本原理
- 7.5.4 BSP模型的特点
- 7.5.5 BSP模型的评价
- 7.5.6 BSP与MapReduce对比
- 7.5.7 BSP模型的实现
- google 的 Pregel,首次提出将bsp模型应用于图计算。
- Yahoo 的 Apache Giraph 专注于迭代图计算。
- Apache Hama 。
-
- 7.5.8 Apache Hama简介
-
- 7.6 批处理关键技术
- 在批处理中追求吞吐量,所以对cpu的利用率要求很高,本节会介绍两种批处理中提高cpu利用率的技术。
-
- 7.6.1 CodeGen
- 7.6.2 CPU亲和技术
- cpu 亲和是指进程要在某个给定的cpu上尽量长时间的运行而不被迁移到其他处理器的倾向性。
-
- linux 内核进程调度器天生就具有被称为软cpu亲和性的特性,这就意味着进程通常不会在处理器之间频繁迁移。2.6版本的linux内核中还包含了一种特性,它让开发人员
- 可以实现硬cpu亲和性,这意味着应用程序可以显示的指定进程在哪台处理器上运行。
- 什么是linux内核的硬亲和性?在linux内核中,所有的进程都有一个相关的数据结构,称为 task_struct。其中与亲和性相关度最高的是 cpus_allowed 位掩码。这个
- 位掩码由n位组成,与系统中的n台逻辑处理器一一对应。具有4个物理cpu的系统可以有4位。如果这些cpu都启用了超线程,那么这个系统就有一个8位的位掩码。如果为给定的进程
- 设置了给定的位,那么这个进程就可以在相关的cpu上运行。因此,如果一个进程可以在任何cpu上运行,并且能够根据需要在处理器之间迁移,那么位掩码就全是1.实际上,这就是
- linux中进程的默认状态。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。