Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(2)
在上一篇文章中,我们讲了Spark大数据处理的可扩展性和负载均衡,今天要讲的是更为重点的容错处理,这涉及到Spark的应用场景和RDD的设计来源。
Spark的应用场景
Spark主要针对两种场景:
- 机器学习,数据挖掘,图应用中常用的迭代算法(每一次迭代对数据执行相似的函数)
- 交互式数据挖掘工具(用户反复查询一个数据子集)
Spark在spark-submit外,还提供了spark-shell,它就是专门用来做交互数据挖掘的工具
MapReduce等框架并不明确支持迭代中间结果/数据子集的共享,所以需要将数据输出到磁盘,然后在每次查询时重新加载,这带来较大的开销。
既然反复写磁盘和从磁盘加载数据使得性能下降,那就把数据放到内存中,这就是Spark基于内存的弹性分布式数据集(RDD)的出发点。
自动容错
MapReduce是容错性非常好的系统。处理一步就放到磁盘,再处理一步又放到磁盘,一旦哪一步有问题,重做就好了,真可谓是一步一个脚印。Spark为了上述场景下的性能,把数据放在内存中,那整个系统的容错就成了最困难的地方。
一般来说,分布式数据集的容错性有两种方式:即数据检查点和记录数据的更新。由于面向的是大规模数据分析,数据检查点操作成本很高:需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往比内存带宽低得多,同时还需要消耗更多的存储资源(在内存中复制数据可以减少需要缓存的数据量,而存储到磁盘则会拖慢应用程序)。所以选择记录更新的方式。但是,如果更新太多,那么记录更新成本也不低。因此,RDD只支持读操作,并且只支持粗粒度转换,即在大量记录上执行的单个操作。将创建RDD的一系列转换记录下来(即Lineage),以便恢复丢失的分区。
虽然只支持粗粒度转换限制了编程模型,但是RDD仍然可以很好地适用于很多应用,特别是支持数据并行的批量分析应用,包括数据挖掘、机器学习、图算法等,因为这些程序通常都会在很多记录上执行相同的操作。
RDD抽象
RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。这些确定性操作称之为转换,如map、filter、groupBy、join(转换不是程开发人员在RDD上执行的操作)。
RDD含有如何从其他RDD计算出本RDD的相关信息(即Lineage),据此可以从物理存储的数据计算出相应的RDD分区。
在需要反复使用的某个数据集时,使用RDD的持久化,即persist,这个持久化优先是放在内存中的。
再来看看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 partialCountMap = words
.mapPartitions(convertWordsInPartitionToWordCountMap)
val wordCount = distCountMap.reduce(mergeMaps)
WordCount一共涉及到三个RDD,用于承载文本行的lines,用于承载单词的words,用于承载每个文件块上部分单词计数的partialCountMap。Lineage关系:partialCountMap的父RDD为words,words的父RDD为lines,如下图:
有了Lineage和RDD的只读特性,就可以轻松完成容错了。
如果words在slave1上的一个分区出问题了,那么我们只需要加载slave1上对应的文件块,并重新计算其lines对应的分区,进而计算得到words的这个分区。
图中每个slave中只画了一个文件块,实际上可能有多个文件块。一定要注意的是哪个分区出问题了,只会重算这一个分区,也就只会重新加载这个分区关联的文件块。
上面讨论的是窄依赖的情况,如果像groupBy这种转换,一个RDD分区需要依赖父RDD的多个分区,那么一个分区挂了,就需要计算父RDD中的多个分区。
分布式系统的三个问题:可扩展性,负载均衡,容错处理,都解决了吧。
不知道看到这里的小伙伴,心里是否有个疑问,既然RDD的API只支持粗粒度的转换,它真的能够支持这么多千奇百怪的应用场景吗?下一篇,我们一起看RDD的API,以及它对其它大数据处理框架能够处理的应用场景的等效解决方案。
推荐
查看《Spark大数据处理》系列文章,请进入YoyaProgrammer公众号,点击 核心技术,点击 Spark大数据处理。
分类 Spark大数据处理
优雅程序员 原创 转载请注明出处
Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(2)的更多相关文章
- Spark大数据处理 之 从WordCount看Spark大数据处理的核心机制(1)
大数据处理肯定是分布式的了,那就面临着几个核心问题:可扩展性,负载均衡,容错处理.Spark是如何处理这些问题的呢?接着上一篇的"动手写WordCount",今天要做的就是透过这个 ...
- 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. ...
随机推荐
- DAY2-python数据类型、字符编码、文件处理
阅读目录 一.引子 二.数字 三.字符串 四.列表 五.元祖 六.字典 七.集合 八.数据类型总结 九.运算符 十.字符编码 十一.文件处理 一.引子 1 什么是数据? x=10,10是我们要存储的数 ...
- JSP 按钮点击,onclick事件中的AJAX不执行可能的原因
<button onclick="deleteAccount()" >删除</button> 缺少了 type="button" &l ...
- MongoDB数据导入hbase + 代码
需求: 从mongoDB里面查出来数据,判断是否有该列簇,如果有则导入此条数据+列簇,如果没有,则该条数据不包含该列簇 直接贴出代码: package Test; import java.util.A ...
- python之Dict和set类型
Dict就是一种key:value的表格: >>> d = { 'Adam':95, 'Lisa':85, 'Bart':59, 'Paul':75 } >>> p ...
- UML在实践中的现状和一些建议
本文是我在csdn上看到的文章,由于认识中的共鸣,摘抄至此. 原文地址:http://blog.csdn.net/vrman/article/details/280157 UML在国内不少地方获得了应 ...
- actionbar中添加searchview并监听期伸缩/打开的方法
首先在xml中设置actionviewclass <item android:id="@+id/m1" android:title="setting" a ...
- TabHost两种不同的实现方式
第一种:继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.只要定义具体Tab内容布局就行了 第二种:不用继承TabActivity,在布局文件中定 ...
- 设置MySQL允许外网访问(转)
设置MySQL允许外网访问 1.修改配置文件sudo vim /etc/mysql/my.cnf把bind-address参数的值改成你的内/外网IP或0.0.0.0,或者直接注释掉这行. 2.登 ...
- ROS探索总结(二)——ROS总体框架
个人分类: ROS 所属专栏: ROS探索总结 一. 总体结构 根据ROS系统代码的维护者和分布来标示,主要有两大部分: (1)main:核心部分,主要由Willow G ...
- ROS Learning-024 (提高篇-002) rviz的安装和使用
ROS 提高篇-002 - rviz 的安装和使用 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LTS ROS 版本:ROS ...