本文转自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的精髓。

提示汇总

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

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

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

    本文转自http://mp.weixin.qq.com/s?__biz=MzA5MTcxOTk5Mg==&mid=208059053&idx=3&sn=1157ab5db7bc ...

  2. 《Spark大数据分析:核心概念、技术及实践》大数据技术一览

    本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1节,作者穆罕默德·古勒(Mohammed Guller)更多章节内容可以访问云栖社区"华章 ...

  3. 《Spark大数据分析:核心概念、技术及实践》一3.5 API

    本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第3章,第3.5节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区& ...

  4. 《Spark大数据分析:核心概念、技术及实践》一1.5 NoSQL

    本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第1章,第1.5节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区& ...

  5. 《Spark大数据分析:核心概念、技术及实践》一3.6 惰性操作

    本节书摘来自华章出版社<Spark大数据分析:核心概念.技术及实践>一书中的第3章,第3.6节,作者[美] 穆罕默德·古勒(Mohammed Guller),更多章节内容可以访问云栖社区& ...

  6. Spark 大数据处理最佳实践

    开源大数据社区 & 阿里云 EMR 系列直播 第十一期 主题:Spark 大数据处理最佳实践 讲师:简锋,阿里云 EMR 数据开发平台 负责人 内容框架: 大数据概览 如何摆脱技术小白 Spa ...

  7. 【Spark大数据处理】动手写WordCount

    本文转自http://mp.weixin.qq.com/s?__biz=MzA5MTcxOTk5Mg==&mid=207906066&idx=1&sn=f9cc48a55343 ...

  8. Spark大数据处理讲课笔记2.1 初识Spark

    文章目录 零.本节学习目标 一.Spark的概述 (一)Spark的组件 1.Spark Core 2.Spark SQL 3.Spark Streaming 4.MLlib 5.Graph X 6. ...

  9. spark的数三角形算法_数据算法 Hadoop Spark大数据处理技巧 PDF 下载

    相关截图: 资料简介: 本书介绍了很多基本设计模式.优化技术和数据挖掘及机器学习解决方案,以解决生物信息学.基因组学.统计和社交网络分析等领域的很多问题.这本书还概要介绍了MapReduce.Hado ...

最新文章

  1. Fade 数字切换动效
  2. 【Java代码实现】递归两大经典问题-----“汉诺塔问题” 与 “青蛙跳台阶问题” 讲解
  3. from __future__ import absolute_import, division, print_function
  4. 咨询公司建议完美批准私有化
  5. (012) java后台开发之Apache与Tomcat有什么关系和区别
  6. matlab之结构体的创建与存储(CSV数据)
  7. mongodb基本概念
  8. 从SourceForge上获取CVS管理的开源代码
  9. Quartus波形仿真教程
  10. 启动MySQL发生系统错误 1058
  11. 【经典】吴恩达《机器学习》课程
  12. matalb编写程序实现ps的“素描滤镜”
  13. 农银e管家怎么显示服务器不对,农银e管家电脑版
  14. css3实现磨砂效果,CSS3打造磨砂玻璃背景效果
  15. 尿素和车用尿素的区别
  16. 【题】【贪心】NKOJ3827 火车运输
  17. nedc和epa续航里程什么意思_NEDC续航里程什么意思?WLTP和NEDC续航差多少
  18. mysql thread conn_MySQL源码阅读2-连接与线程管理
  19. 笔记:计时器和空闲处理
  20. c语言编程输出1000以内能被3整除的数,【C语言】找出1000以内可以被3整除的数

热门文章

  1. matlab R2012a in ubuntu12.04
  2. MAC OS上将项目提交到github
  3. TextView 内容居中
  4. 在ASP.NET 中实现单用户登录(利用Cache, 将用户信息保存在服务器缓存中)[转]
  5. IIS之Web服务器
  6. java充血模型orm框架,关于领域驱动设计和贫血、失血、充血模型
  7. java url工具_UrlTool官方版|UrlTool (java Url转换工具)下载v1.1-乐游网软件下载
  8. 【连载】如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2)
  9. 典型案例:Bug 9776608-多个用户使用错误密码登录同一个用户而造成的用户无法登录异常...
  10. Oracle中ascii为0的陷阱