![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Spark深入剖析学习笔记
Spark深入剖析学习笔记
一角残叶
人生如逆旅,我亦是行人
展开
-
Spark 核心编程(1)- Spark基本工作原理和RDD
1 Spark 基本工作原理分布式主要基于内存(少数情况基于磁盘)迭代式计算1. MapReduce 分为 map 和 reduce 阶段,所以在一个 job 里处理有限2. spark 可以很多阶段,因为是内存迭代式的计算2 RDDResilient Distributed Dataset,弹性分布式数据集,spark的核心抽象;RDD 在抽象上来说是一种元素集合,包含了...原创 2019-01-04 16:47:03 · 281 阅读 · 0 评论 -
Spark 核心编程(7)- 共享变量
1 共享变量工作原理默认情况下,如果在一个算子的函数中使用了某个外部的变量,那么这个变量的值会被拷贝到每个 Task。此时每个 Task 只能操作自己的那份变量副本。Spark 为此提供了2种共享变量,一种是 Broadcast Variable(广播变量),另一种是 Accumulator(累加变量)。Broadcast Variable会将使用到的变量,仅仅为每个节点拷贝一份,更大的用...原创 2019-01-07 17:14:01 · 185 阅读 · 0 评论 -
Spark 核心编程(8)-基于排序机制的 wordcount
1 基于排序机制的 wordcount统计每个单词出现的次数按照每个单词出现次数的数量,降序排序1.1 Java 版本package demo2;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spark.api.java.JavaRD...原创 2019-01-07 19:15:37 · 162 阅读 · 0 评论 -
Spark 核心编程(9)- 二次排序
1 二次排序按照文件的第一列排序如果第一列相同,则按照第二列排序1.1 Java 版本1. 实现自定义的key,要实现 Ordered接口和 Serializable 接口,在 key 中实现自己对多个列的排序算法2. 将包含文本的 RDD,映射成key 为自定义的 key,value 为文本的 JavaPairRDD3. 使用 sortedByKey 算子按照自定义的 key ...原创 2019-01-07 20:06:59 · 210 阅读 · 0 评论 -
Spark 核心编程(10)-Top N
1 TopN1.1 对文件内数字,取最大的前 3 个Java 版本package topn;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spark.api.java.JavaRDD;import org.apache.spark...原创 2019-01-07 21:04:21 · 233 阅读 · 0 评论 -
Spark内核源码深度剖析(1) - Spark整体流程 和宽依赖和窄依赖
1原创 2019-01-08 10:01:43 · 217 阅读 · 1 评论 -
Spark内核源码深度剖析(2) -基于 YARN 的两种提交模式
1 Spark 的3种提交模式standlone模式,基于 Spark 自己的 Master-Worker集群;基于YARN的 yarn-cluster模式基于YARN的yarn-client模式2 yarn-client模式用于测试,因为 Driver 运行在本地客户端,负责调度 application,会与yarn集群产生超大量的网络通信,导致网卡流量激增;好处就是本地可以看...原创 2019-01-08 11:07:05 · 254 阅读 · 0 评论 -
Spark内核源码深度剖析(3) - SparkContext 解析
1 SparkContext 解析TaskScheduler 如何注册application,executor如何反向注册DAGSchedulerSparkUI原创 2019-01-08 15:23:42 · 187 阅读 · 0 评论 -
Spark内核源码深度剖析(4) -Master解析
1 Master 主备切换Master 可以配置2个,Spark原生的 standlone模式是支持Master主备切换的。Spark Master 主备切换可以基于2种机制,一种是基于文件系统的,一种是基于 Zookeeper的。基于文件系统的主备切换机制,需要在 Active Master挂掉之后,手动去切换到 standby master 上;基于 zookeeper 的主备切换机制...原创 2019-01-08 17:24:36 · 228 阅读 · 0 评论 -
Spark内核源码深度剖析(5) -Worker解析
1 Worker 解析Worker 启动 Driver 的一个基本的原理,Worker内部会启动一个线程,这个线程可以理解为,就是 DriverRunner 。然后 DriverRunner 会去负责启动 Driver 进程,并在之后对Driver 进程进行管理;Worker启动Executor,其实和 Driver 的原理是一致的,都是通过一个 Worker 内部的本地线程,也就是 Exe...原创 2019-01-08 21:22:15 · 175 阅读 · 0 评论 -
Spark内核源码深度剖析(6) - DAGScheduler原理
1 DAGScheduler stage 的划分会从触发 action 操作那个 rdd 开始往前倒推,首先会为最后一个 rdd 创建一个 stage,然后往前倒推的时候,如果发现对某个 rdd 是宽依赖,那么就会将宽依赖的那个 rdd 创建一个新的 stage,那个 rdd 就是新的 stage 的最后一个 rdd,然后依次类推,继续往前倒推,根据窄依赖或者宽依赖进行 stage 的划分,直...原创 2019-01-09 11:00:38 · 241 阅读 · 2 评论 -
Spark内核源码深度剖析(7) - Executor原理
1 Executor 原理原创 2019-01-09 15:17:19 · 196 阅读 · 0 评论 -
Spark内核源码深度剖析(9) - Shuffle原理
1 Shuffle 原理1.1 出现 Shffle 的情况reduceByKeygroupByKeysortByKeycountByKeyjoincogroup2 shuffle 原理图假设有一个节点,只有2个CPU,上面运行了4个ShuffleMapTask;假设有另外一个节点,上面也运行了4个 ResultTask,等待获取 ShuffleMapTask 的输出数据,...原创 2019-01-09 20:08:31 · 224 阅读 · 0 评论 -
Spark内核源码深度剖析(8) -Task原理
1 Task 原理原创 2019-01-09 16:15:16 · 188 阅读 · 0 评论 -
Spark 核心编程(6)-RDD 持久化
1 RDD 持久化将 RDD 持久化在内存中,当对RDD执行持久化操作时,每个节点都会将自己的操作的RDD的 partition持久化到内存中,并且在之后对该 RDD 的反复使用使用中直接使用内存缓存的 partition.使用 RDD 持久化,在某些时候,可以将 spark 应用程序的性能提升 10倍;要持久化一个 RDD ,只要调用 cache() 或者 persist()。在该 RD...原创 2019-01-07 16:11:01 · 167 阅读 · 0 评论 -
Spark 核心编程(5)- action
1 常用的 actionreducecollectcounttakesaveAsTextFilecountByKeyforeach2 reduce2.1 Java 版本 public static void reduce() { SparkConf conf = new SparkConf() .setAppName("re...原创 2019-01-07 15:04:52 · 110 阅读 · 0 评论 -
Spark 核心编程(4)- transfomation测试和案例
1 常用 transformation2 map 算子测试2.1 java 版import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.j...原创 2019-01-07 12:24:23 · 275 阅读 · 0 评论 -
Spark内核源码深度剖析(11) -CacheManager 原理
1 CacheManager原创 2019-01-10 14:41:24 · 255 阅读 · 0 评论 -
Spark 核心编程(2)- Spark架构原理 和创建RDD
1 Spark 架构原理DriverMasterWorkerExecutorTask1.1 各部分功能图Driver 注册了一些 Executor后,就可以开始正式执行 spark 应用程序了。第一步是创建 RDD,读取数据源;HDFS 文件被读取到多个 Worker节点,形成内存中的分布式数据集,也就是初始RDD;Driver会根据程序对RDD的定义的操作,提交 Tas...原创 2019-01-04 22:47:34 · 313 阅读 · 0 评论 -
Spark内核源码深度剖析(12) -Checkpoint 原理
1 Spark Checkpoint有些时候,Spark应用程序特别复杂,从初始的RDD开始,到最后整个应用程序完成,有非常多的步骤,比如超过20 个 transformation 操作。而且整个应用运行的时间也特别长;这种情况就比较适合 checkpoint 。因为对于特别复杂的 Spark 应用,有很高的风险,会出现某个要反复使用的 RDD ,因为节点的故障,虽然之前持久化过,但是还是导...原创 2019-01-10 15:46:58 · 180 阅读 · 0 评论 -
Spark性能优化(1)——总体介绍 + 内存消耗诊断
1 Spark 性能优化手段使用高性能序列化类库;优化数据结构;对多次使用的 RDD 进行持久化,Checkpoint;使用序列化的持久化级别;Java 虚拟机垃圾回收调优;提高并行度;广播共享数据;数据本地化;reduceByKey 和 grioupByKey 的合理使用;Shuffle调优 !!!!!!2 内存消耗诊断2.1 内存的去处每个 Java 对象,都有...原创 2019-01-10 16:59:13 · 295 阅读 · 0 评论 -
Spark 核心编程(3)- transfomation 和 action
1 transfomatio 和 actiontransformation 操作会针对已有的 RDD 创建一个新的RDD,而 action 则主要是对 RDD 进行最后的操作,比如遍历、reduce,保存到文件,并可以返回结果给 Driver 程序;...原创 2019-01-05 11:27:54 · 270 阅读 · 0 评论 -
Spark性能优化(2)—— 高性能序列化类库
1 数据序列化在任何分布式的系统,序列化很重要,如果使用的序列化技术在执行序列化的时候很慢,或者序列化后数据还是很大,那么会导致分布式程序性能下降很多。所以 Spark 性能优化的第一步,就是进行序列化的性能优化;Spark 默认会在一些地方对数据进行序列化,比如 shuffle。此外,如果用户的算子函数使用了外部的数据(比如 java 内置类型或者自定义类型),那么也需要对其序列化;Sp...原创 2019-01-10 19:52:34 · 170 阅读 · 0 评论 -
Spark性能优化(3)——优化数据结构
1 优化数据结构优先使用数据和字符串,而不是集合类。也就是优先使用 Array, 而不是 ArrayList,LinkedList,HashMap等集合;比如,List<Integer> list = new ArrayList<Integer>(), 将其替换为 int[] array = new int[]。这样 array 既比 List 少了额外信息的存...原创 2019-01-10 22:04:22 · 185 阅读 · 0 评论 -
Spark性能优化(4)—— 对多次使用的 RDD 进行持久化或 Checkpoint
1 对多次使用的 RDD 进行持久化或 Checkpoint在程序中,对某一个 RDD,基于它进行了多次 transformation 或者 action 操作。那么就非常有必要对其进行持久化操作,以避免对一个 RDD 反复进行计算。此外,如果要保证在 RDD 持久化数据可能丢失的情况下,还要保证高性能,那么可以对RDD 进行 Checkpoint 操作。1.1 案例这里对一个 R...原创 2019-01-10 22:35:06 · 612 阅读 · 0 评论 -
Spark性能优化(5)—— 使用序列化的持久化级别
1 使用序列化的持久化级别处理对多次使用的 RDD 进行持久化操作之外,还可以进一步优化其性能。因为很可能,RDD 的数据时持久化到内存,或者磁盘中的。那么,此时如果内存大小不是特别充足,完全可以使用序列化的持久化级别,比如 MEMORY_ONLY_SER,MEMORY_AND_DISK_SER等。使用 RDD.persist(StorageLevel.MEMORY_ONLY_SER)这样的...原创 2019-01-10 22:47:03 · 206 阅读 · 0 评论 -
Spark性能优化(6)——JVM 垃圾回收调优
1 背景介绍如果在持久化 RDD 的时候,持久化了大量的数据,那么 JVM 的 GC 就可能成为一个性能瓶颈。因为JVM 会定期进行垃圾回收,此时就会追踪所有的 Java 对象,并且在 GC 时,找到那些已经不再使用的对象,然后清理旧的对象,给新的对象腾出内存空间GC 的性能开销和内存中的对象的数量成正比的。所以首先要使用更加高效的数据结构,比如 Array 和 String ;其次在持久化...原创 2019-01-11 09:58:03 · 376 阅读 · 0 评论 -
Spark性能优化(7)——提高并行度
1 提高并行度spark-submit 配置了 2 个executor,每个 executor ,有5个 CPU corenew SparkConf().set("spark.default.parallelism","5"),表示 所有 RDD 的 partition 都被设置为 5 个,也就是每个 RDD 的数据,都会被分成 5 份。那么针对 RDD 的 partition,一个 pa...原创 2019-01-11 10:19:33 · 403 阅读 · 0 评论 -
Spark性能优化(8)—— 广播共享数据 +数据本地化
1 广播共享数据如果算子函数中使用哦了特别大的数据,那么建议将该数据进行广播。这样不至于将一个大数据拷贝到每一个 task 上去,而是给每个节点拷贝一份,然后节点上的 task 共享该数据,这样就可以减少大数据在节点上的内存消耗,减少数据到节点的网络传输消耗。2 数据本地化如果数据和计算它的代码是分开的,通常来说,移动代码到其他节点,会比移动数据到代码所在节点速度快,因为代码比较小,Spar...原创 2019-01-11 10:53:20 · 200 阅读 · 0 评论 -
Spark性能优化(9)——reduceByKey,groupByKey +shuffle性能优化
1 reduceByKey,groupByKey如果可以用 reduceByKey,就用它,因为它会在map 端,先进行本地 combine ,可以大大减少要传输到 reduce 端的数据量,减少网络传输的开销;只有在 reduceByKey 处理不了的时候,才用 groupByKey().map() 代替val counts = pairs.reduceByKey(_ +_)va...原创 2019-01-11 16:00:27 · 1716 阅读 · 0 评论 -
Spark内核源码深度剖析(10) -BlockManger 原理分析
1原创 2019-01-10 10:38:09 · 214 阅读 · 0 评论