Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(1)
大数据处理肯定是分布式的了,那就面临着几个核心问题:可扩展性,负载均衡,容错处理。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大数据处理》系列文章,请进入YoyaProgrammer公众号,点击 核心技术,点击 Spark大数据处理。
分类 Spark大数据处理
优雅程序员 原创 转载请注明出处
Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(1)的更多相关文章
- Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(2)
在上一篇文章中,我们讲了Spark大数据处理的可扩展性和负载均衡,今天要讲的是更为重点的容错处理,这涉及到Spark的应用场景和RDD的设计来源. Spark的应用场景 Spark主要针对两种场景: ...
- Spark小课堂Week4 从控制台看Spark逻辑结构
Spark小课堂Week4 从控制台看Spark逻辑结构 层级关系: 从监控控制台,我们可以看到如下关系: 一个 Job 包含 n Stage 一个 Stage 包含 n Task Job0解决什么问 ...
- 一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了
一文看懂大数据的技术生态圈,Hadoop,hive,spark都有了 转载: 大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它 ...
- Spark(火花)快速、通用的大数据处理引擎框架
一.什么是Spark(火花)? 是一种快速.通用处理大数据分析的框架引擎. 二.Spark的四大特性 1.快速:Spark内存上采用DAG(有向无环图)执行引擎非循环数据流和内存计算支持. 内存上比M ...
- 通过WordCount解析Spark RDD内部源码机制
一.Spark WordCount动手实践 我们通过Spark WordCount动手实践,编写单词计数代码:在wordcount.scala的基础上,从数据流动的视角深入分析Spark RDD的数据 ...
- Spark踩坑记——从RDD看集群调度
[TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...
- 大数据系列之并行计算引擎Spark部署及应用
相关博文: 大数据系列之并行计算引擎Spark介绍 之前介绍过关于Spark的程序运行模式有三种: 1.Local模式: 2.standalone(独立模式) 3.Yarn/mesos模式 本文将介绍 ...
- 大数据系列之并行计算引擎Spark介绍
相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...
- 分布式处理与大数据平台(RabbitMQ&Celery&Hadoop&Spark&Storm&Elasticsearch)
热门的消息队列中间件RabbitMQ,分布式任务处理平台Celery,大数据分布式处理的三大重量级武器:Hadoop.Spark.Storm,以及新一代的数据采集和分析引擎Elasticsearch. ...
随机推荐
- hadoop本地调试方法
Mapreduce 是Hadoop上一个进行分布式数据运算和统计的框架,但是每次运行程序的时候都需要将程序打包并上传的集群环境中运行,这就会让程序的调试变得十分不方便.所以在这里写下这篇博客和大家交流 ...
- leetcode884
class Solution { public: void SplitString(const string& s, vector<string>& v, const st ...
- 「小程序JAVA实战」运行微信官方demo(四)
转自:https://idig8.com/2018/08/09/xiaochengxu-chuji-04/ 微信官方小程序的demo 介绍 https://mp.weixin.qq.com/cgi-b ...
- PYTHON 中的字符集
一.前言 Python中的字符编码是个老生常谈的话题,今天来梳理一下相关知识,希望给其他人些许帮助. Python2的 默认编码 是ASCII,不能识别中文字符,需要显式指定字符编码:Python3的 ...
- C# XML 文件中的空格值问题
C# XML 文件中的空格值问题 运行环境:Window7 64bit,.NetFramework4.61,C# 6.0: 编者:乌龙哈里 2017-02-15 近期正在写我的简易标记文件格式的程序, ...
- IAR FOR ARM 各版…
用过Keil和IAR,个人感觉是IAR还是很不错的.下载地址是: http://files.iar.com/ftp/pub/box/CD-EWARM-6301-3142.zip V6.30.1(该地址 ...
- SQL CLR学习
SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出现的新功能,它将.NET Framework中的CLR服务注入到 SQL Serv ...
- 2014年:Linux和开源的福祸之年
(1)Heartbleed漏洞 Heartbleed漏洞,是今年开源软件曝出的最大糗事.Heartbleed漏洞是OpenSSL的重大漏洞,这项严重缺陷(CVE-2014-0160)的产生是由于未能在 ...
- GNU 和 g++(转)
百度知道 GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.Richard Stallman最早是在net.unix ...
- jQuery基础教程-第8章-002Adding jQuery object methods
一.Object method context 1.We have seen that adding global functions requires extending the jQuery ob ...