- 浏览: 599413 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
前言
很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。
比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:
1.RDD的定义,RDD是一个分布式的不可变数据集合
2.Spark 是一个内存处理引擎
如果你没有主动对RDDCache/Persist,它不过是一个概念上存在的虚拟数据集,你实际上是看不到这个RDD的数据的全集的(他不会真的都放到内存里)。
RDD的本质是什么
一个RDD 本质上是一个函数,而RDD的变换不过是函数的嵌套。RDD我认为有两类:
* 输入RDD,典型如KafkaRDD,JdbcRDD
* 转换RDD,如MapPartitionsRDD
我们以下面的代码为例做分析:
textFile 会构建出一个NewHadoopRDD,
map函数运行后会构建出一个MapPartitionsRDD
saveAsTextFile触发了实际流程代码的执行
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。
NewHadoopRDD是数据来源,每个parition负责获取数据,获得过程是通过iterator.next 获得一条一条记录的。假设某个时刻拿到了一条数据A,这个A会立刻被map里的函数处理得到B(完成了转换),然后开始写入到HDFS上。其他数据重复如此。所以整个过程:
理论上某个MapPartitionsRDD里实际在内存里的数据等于其Partition的数目,是个非常小的数值。
NewHadoopRDD则会略多些,因为属于数据源,读取文件,假设读取文件的buffer是1M,那么最多也就是partitionNum*1M 数据在内存里
saveAsTextFile也是一样的,往HDFS写文件,需要buffer,最多数据量为 buffer* partitionNum
所以整个过程其实是流式的过程,一条数据被各个RDD所包裹的函数处理。
刚才我反复提到了嵌套函数,怎么知道它是嵌套的呢?
如果你写了这样一个代码:
有成千上万个map,很可能就堆栈溢出了。为啥?实际上是函数嵌套太深了。
按上面的逻辑,内存使用其实是非常小的,10G内存跑100T数据也不是难事。但是为什么Spark常常因为内存问题挂掉呢? 我们接着往下看。
Shuffle的本质是什么?
这就是为什么要分Stage了。每个Stage其实就是我上面说的那样,一套数据被N个嵌套的函数处理(也就是你的transform动作)。遇到了Shuffle,就被切开来,所谓的Shuffle,本质上是把数据按规则临时都落到磁盘上,相当于完成了一个saveAsTextFile的动作,不过是存本地磁盘。然后被切开的下一个Stage则以本地磁盘的这些数据作为数据源,重新走上面描述的流程。
我们再做一次描述:
所谓Shuffle不过是把处理流程切分,给切分的上一段(我们称为Stage M)加个存储到磁盘的Action动作,把切分的下一段(Stage M+1)数据源变成Stage M存储的磁盘文件。每个Stage都可以走我上面的描述,让每条数据都可以被N个嵌套的函数处理,最后通过用户指定的动作进行存储。
为什么Shuffle 容易导致Spark挂掉
前面我们提到,Shuffle不过是偷偷的帮你加上了个类似saveAsLocalDiskFile的动作。然而,写磁盘是一个高昂的动作。所以我们尽可能的把数据先放到内存,再批量写到文件里,还有读磁盘文件也是个费内存的动作。把数据放内存,就遇到个问题,比如10000条数据,到底会占用多少内存?这个其实很难预估的。所以一不小心,就容易导致内存溢出了。这其实也是一个很无奈的事情。
我们做Cache/Persist意味着什么?
其实就是给某个Stage加上了一个saveAsMemoryBlockFile的动作,然后下次再要数据的时候,就不用算了。这些存在内存的数据就表示了某个RDD处理后的结果。这个才是说为啥Spark是内存计算引擎的地方。在MR里,你是要放到HDFS里的,但Spark允许你把中间结果放内存里。
总结
我们从一个较新的角度解释了RDD 和Shuffle 都是一个什么样的东西。
转自:http://www.jianshu.com/p/b70fe63a77a8
很多初学者其实对Spark的编程模式还是RDD这个概念理解不到位,就会产生一些误解。
比如,很多时候我们常常以为一个文件是会被完整读入到内存,然后做各种变换,这很可能是受两个概念的误导:
1.RDD的定义,RDD是一个分布式的不可变数据集合
2.Spark 是一个内存处理引擎
如果你没有主动对RDDCache/Persist,它不过是一个概念上存在的虚拟数据集,你实际上是看不到这个RDD的数据的全集的(他不会真的都放到内存里)。
RDD的本质是什么
一个RDD 本质上是一个函数,而RDD的变换不过是函数的嵌套。RDD我认为有两类:
* 输入RDD,典型如KafkaRDD,JdbcRDD
* 转换RDD,如MapPartitionsRDD
我们以下面的代码为例做分析:
sc.textFile("abc.log").map().saveAsTextFile("")
textFile 会构建出一个NewHadoopRDD,
map函数运行后会构建出一个MapPartitionsRDD
saveAsTextFile触发了实际流程代码的执行
所以RDD不过是对一个函数的封装,当一个函数对数据处理完成后,我们就得到一个RDD的数据集(是一个虚拟的,后续会解释)。
NewHadoopRDD是数据来源,每个parition负责获取数据,获得过程是通过iterator.next 获得一条一条记录的。假设某个时刻拿到了一条数据A,这个A会立刻被map里的函数处理得到B(完成了转换),然后开始写入到HDFS上。其他数据重复如此。所以整个过程:
理论上某个MapPartitionsRDD里实际在内存里的数据等于其Partition的数目,是个非常小的数值。
NewHadoopRDD则会略多些,因为属于数据源,读取文件,假设读取文件的buffer是1M,那么最多也就是partitionNum*1M 数据在内存里
saveAsTextFile也是一样的,往HDFS写文件,需要buffer,最多数据量为 buffer* partitionNum
所以整个过程其实是流式的过程,一条数据被各个RDD所包裹的函数处理。
刚才我反复提到了嵌套函数,怎么知道它是嵌套的呢?
如果你写了这样一个代码:
sc.textFile("abc.log").map().map().........map().saveAsTextFile("")
有成千上万个map,很可能就堆栈溢出了。为啥?实际上是函数嵌套太深了。
按上面的逻辑,内存使用其实是非常小的,10G内存跑100T数据也不是难事。但是为什么Spark常常因为内存问题挂掉呢? 我们接着往下看。
Shuffle的本质是什么?
这就是为什么要分Stage了。每个Stage其实就是我上面说的那样,一套数据被N个嵌套的函数处理(也就是你的transform动作)。遇到了Shuffle,就被切开来,所谓的Shuffle,本质上是把数据按规则临时都落到磁盘上,相当于完成了一个saveAsTextFile的动作,不过是存本地磁盘。然后被切开的下一个Stage则以本地磁盘的这些数据作为数据源,重新走上面描述的流程。
我们再做一次描述:
所谓Shuffle不过是把处理流程切分,给切分的上一段(我们称为Stage M)加个存储到磁盘的Action动作,把切分的下一段(Stage M+1)数据源变成Stage M存储的磁盘文件。每个Stage都可以走我上面的描述,让每条数据都可以被N个嵌套的函数处理,最后通过用户指定的动作进行存储。
为什么Shuffle 容易导致Spark挂掉
前面我们提到,Shuffle不过是偷偷的帮你加上了个类似saveAsLocalDiskFile的动作。然而,写磁盘是一个高昂的动作。所以我们尽可能的把数据先放到内存,再批量写到文件里,还有读磁盘文件也是个费内存的动作。把数据放内存,就遇到个问题,比如10000条数据,到底会占用多少内存?这个其实很难预估的。所以一不小心,就容易导致内存溢出了。这其实也是一个很无奈的事情。
我们做Cache/Persist意味着什么?
其实就是给某个Stage加上了一个saveAsMemoryBlockFile的动作,然后下次再要数据的时候,就不用算了。这些存在内存的数据就表示了某个RDD处理后的结果。这个才是说为啥Spark是内存计算引擎的地方。在MR里,你是要放到HDFS里的,但Spark允许你把中间结果放内存里。
总结
我们从一个较新的角度解释了RDD 和Shuffle 都是一个什么样的东西。
转自:http://www.jianshu.com/p/b70fe63a77a8
发表评论
文章已被作者锁定,不允许评论。
-
Spark Driver和Executor资源调度学习
2017-05-31 16:14 978一、引子 在Worker Actor中,每次LaunchE ... -
Spark 实现TopN的问题(groupBy)
2017-05-31 14:11 1403t2.txt ab 11 ab 23 ab 13 a ... -
Spark block和partition的区别
2017-05-31 13:48 978hdfs中的block是分布式存储的最小单元,类似于盛放文件的 ... -
Spark 什么是DAG(有向无环图)(窄依赖和宽依赖)
2017-05-26 16:46 2154在Spark里每一个操作生成一个RDD,RDD之间连一条边,最 ... -
Spark 为什么比Hadoop快
2017-05-25 16:12 1336Spark SQL比Hadoop Hive快, ... -
Spark 集群的搭建(1.6.3)
2017-05-24 10:41 8参考内容:http://www.cnblogs.com/one ... -
Spark shuffle实现详细探究学习
2017-04-28 15:08 573Background 在MapReduce框架中,shuffl ... -
Spark collect和take函数学习(RDD-->Array)
2017-04-27 15:44 2109将RDD转成Scala数组,并返回。 函数原型 def ... -
Spark MLlib平台的协同过滤算法---电影推荐系统学习
2017-04-27 15:33 627import org.apache.log4j.{Level, ... -
Spark parallelize函数和makeRDD函数的区别(Array-->RDD)
2017-04-27 14:56 833我们知道,在Spark中创建RDD的创建方式大概可以分为三种: ... -
Spark Streaming实时计算学习
2017-04-27 10:31 942随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处 ... -
Spark 集群的搭建学习(1.6.3)
2017-04-25 14:30 787Spark是一个快速、通用的计算集群框架,它的内核使用Scal ... -
Spark SQL简单示例学习
2017-04-25 14:17 762Spark SQL 作为Apache Spark大数据框架的一 ... -
Spark RDD基于内存的集群计算容错抽象(核心概念)
2017-04-11 20:09 675摘要 本文提出了分布 ... -
Spark 入门知识学习
2017-04-08 11:46 406什么是Spark Apache Spark是 ...
相关推荐
Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据Spark 案例测试数据...
Spark以其内存计算模型著称,极大地提高了数据处理速度,比传统的Hadoop MapReduce快上许多倍。Spark的核心组件包括:Spark Core(基础执行引擎)、Spark SQL(用于SQL查询和数据集成)、Spark Streaming(处理实时...
- 当Executor的内存达到限制时,Spark会尝试将部分数据页换到磁盘上,以避免OutOfMemoryError(OOM)错误的发生。 #### 五、性能调优技巧 为了提高Spark应用的性能,以下是一些常用的内存管理调优技巧: - **调整...
在Spark作业执行过程中,当遇到执行内存不足的情况时,系统会尝试进行内存清理,释放存储内存中的数据,从而保证执行内存的充足。如果执行内存中的安全区域不足,则会触发垃圾回收操作。因此,合理配置相关内存参数...
6. 性能优化:Spark的内存计算特性使其在大数据处理中具有高效率,但同时也需注意资源管理,避免内存溢出等问题。系统可能采用动态资源调度、数据分区等策略,以提高计算性能和资源利用率。 7. 报告生成:分析完成...
本篇文章将以"Spark_competition"数据集为例,深入探讨如何利用Spark进行大数据分析,以及涉及到的相关知识点。 一、Spark核心概念与架构 Spark的核心在于它的弹性分布式数据集(Resilient Distributed Datasets,...
总的来说,Spark大数据处理数据性能优化涉及到多个层面,包括架构理解、数据读写优化、执行计划调整、资源管理、并行度设定、延迟优化、缓存管理以及监控调试。深入学习这些知识点,有助于我们在处理海量数据时,...
这部分工作可能涉及到Spark的数据加载、清洗、转换和聚合操作。例如,使用Spark的DataFrame API读取JSON数据,处理缺失值和异常值,然后通过groupByKey或groupBy函数按城市进行分组,计算每个城市的气温和降水量平均...
接着,书中的章节会深入到Spark SQL,这是Spark用于处理结构化数据的部分,它允许用户使用SQL或者DataFrame/Dataset API进行查询,同时支持多种数据源。Spark SQL的引入使得Spark在数据分析领域更加易用,对SQL熟悉...
总的来说,《Spark快速数据处理》会带领读者了解如何利用Spark进行大数据分析,包括如何设置和管理Spark集群,编写Spark程序,以及如何运用Spark的各个模块进行高效的数据处理和分析。通过这本书的学习,读者将能够...
4. 缓存策略:利用RDD持久化,将常用数据缓存到内存,减少重复计算。 5. SQL优化:使用DataFrame或Dataset API,避免冗余转换,使用合适的数据类型和列裁剪。 6. Shuffle优化:减少shuffle操作,使用broadcast ...
该项目是大三下学期的课程设计,使用的数据集来自知名数据网站 Kaggle 的 tmdb-movie-metadata 电影数据集,以Python为编程语言,使用大数据框架Spark对数据进行了预处理,然后分别从多个方面对数据进行了分类和分析...
本文主要探讨了基于Spark框架的大数据挖掘技术,涉及到Spark的核心功能、系统生态、以及在大数据挖掘中的应用。下面将对所包含的知识点进行详细阐述。 首先,Spark是当前工业生产中广泛应用的开源大数据分布式计算...
Spark作为一款强大的分布式计算框架,以其内存计算的特性,大大提升了数据处理的速度,使得实时分析和复杂计算成为可能。这本书详细介绍了Spark的核心概念和技术,帮助读者掌握如何在大数据领域运用Spark进行高效的...
Spark是Apache软件基金会旗下的开源大数据处理框架,由加州大学伯克利分校的AMP实验室开发,是基于内存计算的大数据并行处理系统。它提供了高层次的APIs,比如Java、Scala、Python、R等,用于数据挖掘、机器学习、...
sparkStreaming消费数据不丢失,sparkStreaming消费数据不丢失
《Spark大数据分析与实战》课程是一门深入探讨Apache Spark在大数据处理领域的应用和技术的课程,其课后练习答案集提供了对课程所讲授知识的巩固和实践。这是一份珍贵的配套教学资源,旨在帮助学生更好地理解和掌握...
本设计旨在构建一个基于Spark的大数据分析平台,该平台将利用Scala编程语言进行开发,通过Spark SQL对数据进行处理,并最终将处理后的结果存储到MySQL数据库中,以便后续的数据可视化及分析。 #### 二、关键技术...
根据提供的文件信息,本文将详细解析Solaris Spark内存模型的核心概念与原理,涵盖硬件内存模型与软件内存模型的关键知识点。 ### Solaris Spark 内存模型概述 #### 1. 引言 在共享内存的多处理器系统中,内存...
在本项目实战中,我们将探讨如何使用Java编程语言,结合Spark和Hive,将Hive中的数据高效地导入到ElasticSearch(ES)中,并利用ES的别名机制实现数据更新的平滑过渡。以下是对这个流程的详细解析: 1. **Hive数据...