当前位置:   article > 正文

7.大数据架构详解:从数据获取到深度学习 --- 批处理技术

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

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/721519
推荐阅读
相关标签
  

闽ICP备14008679号