从WordCount看Spark大数据处理的核心机制(1)

转载 2015年07月07日 17:21:17

本文转自http://mp.weixin.qq.com/s?__biz=MzA5MTcxOTk5Mg==&mid=208059053&idx=2&sn=fc3a8d88663038ce7c6b127460a33158&scene=18#rd,所有权力归原作者所有。

大数据处理肯定是分布式的了,那就面临着几个核心问题:可扩展性,负载均衡,容错处理。Spark是如何处理这些问题的呢?接着上一篇的“动手写WordCount”,今天要做的就是透过这个大数据界的HelloWorld来看看Spark隐藏了哪些魔法。

请各位看官,带着分布式的问题往下看。

分布式架构

大数据时代,单机装下PB级的数据,然后在可接受的时间内处理完,不可能,所以一定是分布式的。

▶ 分布式存储

HDFS(Hadoop Distributed File System)是最常见的,和Spark配合的分布式存储系统。HDFS的存储结构如下图

每个文件被分成固定大小的块,而块作为最小的存储单位放到众多服务器上。那一旦存某个块的机器挂了,不是整个文件就洗白了吗?HDFS当然不会这么傻,文件的每个块都有备份,默认情况下一个块会存3份,分到不同的服务器。这样一来,除非某个块涉及的三台服务器全挂,否则不用担心。在合理分布3个块的情况下,三台服务器全挂的可能性比中500万还低。下面是/file.txt有三个文件块的情况。

NN是Name Node,存储文件块放在哪儿等元信息。DN是Data Node,用来存放具体的文件块。

▶ 分布式处理

有一类系统数据是分布式存储,但是处理却集中在一起。比如Mysql分库分表存数据,然后在某个服务器上,挨个获取所有库所有表的数据进行处理,这种系统的本质还是“数据分发到计算逻辑侧”,它的性能瓶颈就在于做数据处理的那台服务器。

而分布式处理的核心观念在于“把计算逻辑分发到数据侧”,有两大优点:

  • 计算逻辑分发明显比数据分发节省网络带宽,而网络带宽是分布式系统中最宝贵的资源

  • 计算逻辑在数据侧执行,消除了集中式处理中计算逻辑侧的性能瓶颈

Spark + HDFS的运行架构如下:

Driver是程序开始运行的地方,也是总控,它把计算逻辑(闭包的实例)发送到有数据块的Slave上去执行,结果再收回去汇总。

是不是看出来了?

数据更多了,加机器呗,机器多了磁盘多,磁盘多了存的多。

跑的慢了,加机器呗,机器多了磁盘多,并行加载起来,数据吐吞量大。机器多了,内存CPU也多,并行处理起来,数据吞吐量大。

提示: 分布式处理系统会把计算逻辑分发到数据侧,极大提高系统的水平扩展性。

WordCount运行机制

讲了一堆理论知识,为了让各位看官透彻理解,也为Spark程序算法优化打下坚实的基础,我们拿WordCount来举例说明,顺便说说负载均衡。

额。。。还没看“动手写WordCount”的兄弟姐妹们,建议先去看看。

▶ 数据位置感知

下面是WordCount的业务逻辑代码:

val file = "hdfs://127.0.0.1:9000/file.txt"
val lines = sc.textFile(file)
val words = lines.flatMap(line => line.split("\\s+"))
val wordCount = words.countByValue()

lines是Spark的RDD,它包含了在哪些机器上有file文件的块,信息是从HDFS来的。每文件块映射到RDD上就是一个分区,对的,没看错。如果一个文件块128MB,那么HDFS上一个1GB大小的文件就有8个文件块,由这个文件创建的RDD就会有8个分区。

之前说了,在HDFS上每个文件块默认会有3份,那RDD的分区选择了那一份呢?对滴,根据负载选择服务器负载最低的那一份。负载自动均衡了吧。

计算逻辑分发

有了这些信息,我们就知道把后续的计算逻辑该分发到哪儿去。

首先,我们得说清楚什么是计算逻辑,各位看官们想一下,类方法里面的代码是如何运行的。充分必要条件:方法代码 + 类实例(对象)的状态。似成相识吧,程序 = 算法 + 数据。算法在代码中,数据在对象的状态中。

Spark要分发计算逻辑,也是分了两部分。

第一部分是代码。为什么spark-submit执行一开始,总是一堆jar包被分发,原因就在这儿。

第二部分是类实例。类在哪儿?作为RDD各API参数的闭包。

val words = lines.flatMap(line => line.split("\\s+"))

flatMap的参数 _.split("\s+") 是闭包,闭包是引用了外部自由变量的函数,在Scala中是由匿名类实现的。更多信息,请小伙伴们GFSOSO哈。

上面的一行代码中,Spark要分发的实例就是 _.split("\s+") 的实例。

val wordCount = words.countByValue()

实际上RDD的API countByValue 也有需要分发的闭包实例,只是都在Spark的源码中,让一码给大家整理到明面上来哈。

val wordCount = words        
.mapPartitions(convertWordsInPartitionToWordCountMap) .reduce(mergeMaps)

前面我们提到了RDD的分区,mapPartitions会方法中的逻辑放到RDD的每个分区上执行,注意是远程在Slave上执行的哈。而reduce是在把每个分区的结果拿到Driver后,对结果进行两两合并,最终得到结果。

WordCount分布式运行原理

先仔细看图,相信不用下面的解释,各位看官也能看懂了。(上面的图是张巨高清的图,手机上看不清,建议转发文章到邮箱,然后到电脑上看,看懂这张图,就真的把WordCount分布式运行的机制搞懂了。)

对于WordCount而言,分布式在每个Slave的每个分区上,统计本分区内的单词计数,生成一个Map,然后将它传回给Driver,再由Driver两两合并来自各个分区的所有Map,形成最终的单词计数。

今天我们不仅说清楚了WordCount背后的分布式运行机制,而且解释了Spark的水平扩展能力,以及负载均衡。

下一篇将透过WordCount来看重中之重的容错处理,这涉及到Spark的应用场景与RDD的设计来源,可以毫不夸张地说,这才是Spark的精髓。

提示汇总

分布式处理系统会把计算逻辑分发到数据侧,极大提高系统的水平扩展性。


Spark大数据处理之从WordCount看Spark大数据处理的核心机制

大数据处理肯定是分布式的了,那就面临着几个核心问题:可扩展性,负载均衡,容错处理。Spark是如何处理这些问题的呢?接着上一篇的“动手写WordCount”,今天要做的就是透过这个大数据界的Hello...
  • anningzhu
  • anningzhu
  • 2017年03月05日 18:13
  • 70

从WordCount看Spark大数据处理的核心机制(2)

本文转自http://mp.weixin.qq.com/s?__biz=MzA5MTcxOTk5Mg==&mid=208059053&idx=3&sn=1157ab5db7bc2783e812e3dc...
  • sdujava2011
  • sdujava2011
  • 2015年07月07日 17:29
  • 417

Spark大数据计算引擎介绍

本文内容参考《Spark与Hadoop大数据分析》[美]文卡特·安卡姆 著;《大数据架构详解 从数据获取到深度学习》 朱洁 罗华霖 著。大数据生态的两个主要部分是Hadoop软件框架和Spark内存级...
  • cymy001
  • cymy001
  • 2017年11月08日 21:34
  • 151

如何低成本、高效率搭建Hadoop/Spark大数据处理平台

随着人们逐渐认识到 “大数据”的价值,互联网、电商到金融业、政企等各行业开始处理海量数据。如何低成本、敏捷高效地搭建大数据处理平台,成为影响大数据创新效率的关键。 为了让用户以最简便地方式享用阿里云全...
  • Gamay
  • Gamay
  • 2017年06月02日 13:36
  • 559

Spark(四) -- Spark工作机制

以一个简单的WordCount代码为例sc.textFile("hdfs://...").flatMap(_.split(" ")).map(_,1).reduceByKey(_+_).map(x =...
  • qq1010885678
  • qq1010885678
  • 2015年05月14日 23:38
  • 2997

MFC六大核心机制

我们选择了C++,主要是因为它够艺术、够自由,使用它我们可以实现各种想法,而MFC将多种可灵活使用的功能封装起来,我们岂能忍受这种“黑盒”操作?于是研究分析MFC的核心机制成为必然。        ...
  • ligand
  • ligand
  • 2015年11月15日 12:32
  • 3842

Spark-大数据处理框架的安装

Spark安装教程
  • github_33934628
  • github_33934628
  • 2017年06月28日 11:13
  • 195

Spark平台上的JavaWordCount示例

Spark平台上的JavaWordCount示例
  • houmou
  • houmou
  • 2016年01月17日 21:33
  • 4721

以wordcount理解spark的执行过程

以wordcount理解spark的执行过程: 1、代码以及交互界面的回应: (RDD是spark的核心抽象,所有的计算都围绕RDD进行,生成RDD,然后可以对RDD进行各种操作, 这些操作...
  • xingzhiqing
  • xingzhiqing
  • 2016年07月09日 09:17
  • 1548

用Apache Spark进行大数据处理——第二部分:Spark SQL

在Apache Spark文章系列的前一篇文章中,我们学习了什么是Apache Spark框架,以及如何用该框架帮助组织处理大数据处理分析的需求。 Spark SQL,作为Apache Spark大...
  • sinat_29581293
  • sinat_29581293
  • 2016年06月01日 16:02
  • 912
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从WordCount看Spark大数据处理的核心机制(1)
举报原因:
原因补充:

(最多只允许输入30个字)