
深入理解Spark
文章平均质量分 82
通过阅读Spark源码,深入理解Spark内部各个子系统的工作原理,并给性能调优和开发工作提供参考意义。
泰山不老生
耿嘉安,15年IT经验。《深入理解Spark》与《Spark内核设计的艺术》两书的作者。Apache Spark Contributor和MongoDB Contributor。曾就职于阿里巴巴,基于ODPS构建大数据商业解决方案——御膳房。曾负责艺龙大数据平台的架构工作。现在负责360对于Spark的运维、调优、扩展、开发等工作。在大量的工作实践中,对J2EE、JVM、Tomcat、Spring、Hadoop、Spark、MySQL、Redis、Zookeeper都有深入研究。早期从事J2EE企业级应用开发,对Java相关技术有独到见解。业余喜欢研究中国古代历史,古诗词,旅游,足球等。
展开
-
Spark2.1.0——广播管理器BroadcastManager
BroadcastManager用于将配置信息和序列化后的RDD、Job以及ShuffleDependency等信息在本地存储。如果为了容灾,也会复制到其他节点上。创建BroadcastManager的代码实现如下。val broadcastManager = new BroadcastManager(isDriver, conf, securityManager)Broa...原创 2019-04-28 10:25:32 · 2281 阅读 · 0 评论 -
Spark2.1.0——存储体系概述
本书在5.7节曾介绍过存储体系的创建,那时只为帮助读者了解SparkEnv,现在是时候对Spark的存储体系进行详细的分析了。简单来讲,Spark存储体系是各个Driver、Executor实例中的BlockManager所组成的。但是从一个整体出发,把各个节点的BlockManager看成存储体系的一部分,那么存储体系还有更多衍生内容,比如块传输服务、map任务输出跟踪器、Shuffle管理器等...原创 2019-04-09 15:49:38 · 18631 阅读 · 0 评论 -
Spark常见故障诊断(一)
本人维护的Spark主要运行在三个Hadoop集群上,此外还有其他一些小集群或者隐私集群。这些机器加起来有三万台左右。目前运维的Spark主要有Spark2.3和Spark1.6两个版本。用户在使用的过程中难免会发生各种各样的问题,为了对经验进行沉淀,也为了给Spark用户提供一些借鉴,这里将对各类问题如何处理进行介绍。由于故障种类繁多,所以我会开多个博客逐一进行介绍。本文介绍一些Spark1...原创 2019-04-01 09:29:18 · 12469 阅读 · 9 评论 -
Spark2.1.0——Spark环境更新
阅读提示:本文是对SparkContext中对用户通过--jars(或spark.jars)和--files(或spark.files)参数添加的外部资源进行的分析。用户提交任务时往往需要添加额外的jar包或其它文件,用户任务的执行将依赖这些文件。这些文件该如何指定?任务在各个节点上运行时又是如何获取到这些文件的呢?我们首先回答第一个问题。在SparkContext的初始化过程中会读取用户...原创 2018-12-27 11:56:35 · 1342 阅读 · 4 评论 -
Spark2.1.0——ContextCleaner的工作原理分析
ContextCleaner是SparkContext中的组件之一。ContextCleaner用于清理那些超出应用范围的RDD、Shuffle对应的map任务状态、Shuffle元数据、Broadcast对象以及RDD的Checkpoint数据。创建ContextCleaner创建ContextCleaner的代码如下。 _cleaner = if (_conf....原创 2018-12-17 09:54:32 · 6870 阅读 · 0 评论 -
Spark2.1.0——Executor动态分配的实现原理
ExecutorAllocationManager的作用已在《Spark2.1.0——SparkContext概述》一文有过介绍,更为准确地说,ExecutorAllocationManager是基于工作负载动态分配和删除Executor的代理。简单讲,ExecutorAllocationManager与集群管理器之间的关系可以用图1来表示。图1 Executo...原创 2018-12-10 09:43:15 · 9373 阅读 · 2 评论 -
Spark2.1.0——创建SparkUI的分析
阅读建议:阅读本文前,最好先阅读《Spark2.1.0——SparkUI的实现》和《Spark2.1.0——WebUI框架体系》。 在SparkContext的初始化过程中,会创建SparkUI。有了对WebUI的总体认识,现在是时候了解SparkContext是如何构造SparkUI的了。SparkUI是WebUI框架的使用范例,了解了SparkUI的创建过程,读者对Mast...原创 2018-12-03 09:47:25 · 1314 阅读 · 0 评论 -
Spark2.1.0——WebUI框架体系
阅读建议:阅读本文前最好先阅读《Spark2.1.0——SparkUI的实现》一文。 Spark UI构建在WebUI的框架体系之上,因此应当首先了解WebUI。WebUI定义了一种Web界面展现的框架,并提供返回Json格式数据的Web服务。WebUI用于展示一组标签页,WebUITab定义了标签页的规范。每个标签页中包含着一组页面,WebUIPage定义了页面的规范。我们将...原创 2018-11-20 09:53:34 · 2023 阅读 · 2 评论 -
Spark2.1.0——SparkUI的实现
任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策。也许有人说,可以增加日志来解决这个问题。日志只能解决你的程序逻辑在运行期的监控,进而发现Bug,以及提供对业务有帮助的调试信息。当你的JVM进程奔溃或者程序响应速度很慢时,这些日志将毫无用处。好在JVM提供了jstat、jstack、jinfo、jmap、jhat等工具帮助我们分析,更有VisualVM的可视化界面以更加直...原创 2018-11-20 09:53:05 · 4182 阅读 · 9 评论 -
Spark2.1.0——SparkContext初始化之Spark环境的创建
阅读指导:在《Spark2.1.0——SparkContext概述》一文中,曾经简单介绍了SparkEnv。本节内容将详细介绍SparkEnv的创建过程。 在Spark中,凡是需要执行任务的地方就需要SparkEnv。在生产环境中,SparkEnv往往运行于不同节点的Executor中。但是由于local模式在本地执行的需要,因此在Driver本地的Executor也需要Spa...原创 2018-11-16 09:48:37 · 1458 阅读 · 0 评论 -
Spark2.1.0——SparkContext概述
Spark应用程序的提交离不开Spark Driver,后者是驱动应用程序在Spark集群上执行的原动力。了解Spark Driver的初始化,有助于读者理解Spark应用程序与Spark Driver的关系。Spark Driver的初始化始终围绕着SparkContext的初始化。SparkContext可以算得上是Spark应用程序的发动机引擎,轿车要想跑起来,发动机首先要启动。Spar...原创 2018-11-12 10:07:23 · 2886 阅读 · 0 评论 -
Spark2.1.0——深入浅出度量系统
对于一个系统而言,首先考虑要满足一些业务场景,并实现功能。随着系统功能越来越多,代码量级越来越高,系统的可维护性、可测试性、性能都会成为新的挑战,这时监控功能就变得越来越重要了。在国内,绝大多数IT公司的项目都以业务为导向,以完成功能为目标,这些项目在立项、设计、开发、上线的各个阶段,很少有人会考虑到监控的问题。在国内,开发人员能够认真的在代码段落中打印日志,就已经属于最优秀的程序员了。然而,在国...原创 2018-10-09 09:50:31 · 4252 阅读 · 7 评论 -
深入浅出Spark2.1.0度量系统——Source继承体系
阅读提示:阅读本文前,最好请阅读《Spark2.1.0——深入浅出度量系统》一文。 任何监控都离不开度量数据的采集,离线的数据采集很容易做到和被采集模块之间的解耦,但是对于实时度量数据,尤其是那些内存中数据的采集就很难解耦。这就类似于网页监控数据的埋点一样,你要在网页中加入一段额外的js代码(例如Google分析,即便你只是引入一个js文件,这很难让前端工程师感到开心)。还有一...原创 2018-10-09 19:06:45 · 1603 阅读 · 7 评论 -
深入浅出Spark2.1.0度量系统——Sink继承体系
阅读提示:阅读本文前,最好请阅读《Spark2.1.0——深入浅出度量系统》和《深入浅出Spark2.1.0度量系统——Source继承体系》。 Source准备好度量数据后,我们就需要考虑如何输出和使用的问题。这里介绍一些常见的度量输出方式:阿里数据部门采用的一种度量使用方式就是输出到日志;在命令行运行过Hadoop任务(例如:mapreduce)的使用者也会发现控制台打印的...原创 2018-10-09 19:06:59 · 2431 阅读 · 9 评论 -
Spark2.1.0事件总线分析——SparkListenerBus详解
阅读提示:阅读本文前,最好先阅读《Spark2.1.0之源码分析——事件总线》和《Spark2.1.0事件总线分析——ListenerBus的继承体系》。 有了《Spark2.1.0之源码分析——事件总线》文中对ListenerBus的定义及《Spark2.1.0事件总线分析——ListenerBus的继承体系》文中对ListenerBus类继承体系的介绍,本小节将详细介绍Sp...原创 2018-09-18 10:07:03 · 2335 阅读 · 0 评论 -
Spark2.1.0事件总线分析——LiveListenerBus详解
阅读提示:阅读本文前,最好先阅读《Spark2.1.0之源码分析——事件总线》、《Spark2.1.0事件总线分析——ListenerBus的继承体系》及《Spark2.1.0事件总线分析——SparkListenerBus详解》几篇文章的内容。LiveListenerBus继承了SparkListenerBus,并实现了将事件异步投递给监听器,达到实时刷新UI界面数据的效果。LiveList...原创 2018-09-27 09:39:49 · 2796 阅读 · 6 评论 -
Spark2.1.0事件总线分析——ListenerBus的继承体系
阅读提示:阅读本文前,最好先阅读《Spark2.1.0之源码分析——事件总线》。 通过阅读《Spark2.1.0之源码分析——事件总线》一文,理解了ListenerBus的定义后,本小节一起来看看有哪些类继承了它。ListenerBus的类继承体系如图1所示。图1 ListenerBus的类继承体系 从图1中可以看到有三种ListenerBus的具体实现,分别为...原创 2018-09-11 09:43:08 · 1110 阅读 · 0 评论 -
Spark2.1.0之源码分析——事件总线
Spark定义了一个特质[1]ListenerBus,可以接收事件并且将事件提交到对应事件的监听器。为了对ListenerBus有个直观的理解,我们先来看看它的代码实现,见代码清单1。代码清单1 ListenerBus的定义private[spark] trait ListenerBus[L <: AnyRef, E] extends Logging...原创 2018-09-03 10:14:20 · 4365 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC客户端TransportClient详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 《...原创 2018-08-28 10:48:46 · 2450 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC服务端引导程序TransportServerBootstrap
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 《...原创 2018-08-20 10:56:59 · 2672 阅读 · 4 评论 -
spark2.1.0之源码分析——服务端RPC处理器RpcHandler详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》...原创 2018-08-13 10:21:13 · 3254 阅读 · 2 评论 -
spark2.1.0之源码分析——RPC传输管道处理器详解
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》 《spark2.1.0之源码分析——RPC管道初始化》 ...原创 2018-08-01 10:55:17 · 1218 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC管道初始化
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 《spark2.1.0之源码分析——RPC服务器TransportServer》在《spark2.1.0之源码分析——RPC客户端工厂Tran...原创 2018-07-25 10:32:57 · 2557 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC服务器TransportServer
提示:阅读本文前最好先阅读:《Spark2.1.0之内置RPC框架》 《spark2.1.0之源码分析——RPC配置TransportConf》 《spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory》 TransportServer是RPC框架的服务端,可提供高效的、低级别的流服务。在说明《Spark2.1.0之内置RPC框架》一文...原创 2018-07-17 10:32:36 · 1353 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC客户端工厂TransportClientFactory
提示:阅读本文前最好先阅读《Spark2.1.0之内置RPC框架》和《spark2.1.0之源码分析——RPC配置TransportConf》。 TransportClientFactory是创建传输客户端(TransportClient)的工厂类。在说明《Spark2.1.0之内置RPC框架》文中的图1中的记号①时提到过TransportContext的createClientFact...原创 2018-07-10 10:16:52 · 2307 阅读 · 0 评论 -
spark2.1.0之源码分析——RPC配置TransportConf
在《Spark2.1.0之内置RPC框架》提到TransportContext中的TransportConf给Spark的RPC框架提供配置信息,它有两个成员属性——配置提供者conf和配置的模块名称module。这两个属性的定义如下: private final ConfigProvider conf; private final String module;其中conf...原创 2018-07-02 18:31:02 · 1467 阅读 · 0 评论 -
Spark2.1.0之内置RPC框架
在Spark中很多地方都涉及网络通信,比如Spark各个组件间的消息互通、用户文件与Jar包的上传、节点间的Shuffle过程、Block数据的复制与备份等。在Spark 0.x.x与Spark 1.x.x版本中,组件间的消息通信主要借助于Akka[1],使用Akka可以轻松的构建强有力的高并发与分布式应用。但是Akka在Spark 2.0.0版本中被移除了,Spark官网文档对此...原创 2018-06-27 09:27:34 · 9415 阅读 · 3 评论 -
spark2.1.0之配置与源码分析
任何优秀的软件或服务都会提供一些配置参数,这些配置参数有些是内置的,有些则是可以由用户配置的。对于熟悉Java的开发人员来说,对JVM进行性能调优是一个经常需要面对的工作,这个过程常常伴随着各种JVM参数的调整与测试。之所以将这些参数交给具体的开发人员去调整,是因为软件或者服务的提供者也无法保证给定的默认参数是最符合用户应用场景与软硬件环境的。一个简单的例子:当用户的QPS发生变化时,...原创 2018-06-21 14:49:21 · 1243 阅读 · 2 评论 -
Spark2.1.0之模型设计与基本架构
Spark编程模型 正如Hadoop在介绍MapReduce编程模型时选择word count的例子,并且使用图形来说明一样,笔者对于Spark编程模型也选择用图形展现。 Spark 应用程序从编写到提交、执行、输出的整个过程如图2-5所示。图2-5 代码执行过程图2-5中描述了Spark编程模型的关键环节的步骤如下:用户使用SparkContext提供的API(常用的有t...原创 2018-06-12 09:41:32 · 2309 阅读 · 6 评论 -
Spark2.1.0之模块设计
在阅读本文之前,读者最好已经阅读了《Spark2.1.0之初识Spark》和《Spark2.1.0之基础知识》两篇文章。本文将主要介绍Spark2.1.0版本中的模块设计以及各个模块的功能和特点。整个Spark主要由以下模块组成:Spark Core:Spark的核心功能实现,包括:基础设施、SparkContext(Application通过SparkContext提交)、Spark执行环境(S...原创 2018-06-05 10:00:02 · 1818 阅读 · 2 评论 -
Spark2.1.0之基础知识
在阅读本文之前,读者最好已经阅读了《Spark2.1.0之初识Spark》一文,本文将对Spark的基础知识进行介绍。但在此之前,读者先跟随本人来一次简单的时光穿梭,最后还将对Java与Scala在语言上进行比较。版本变迁 经过5年多的发展,Spark目前的版本是2.3.0。Spark主要版本的发展过程如下:Spark诞生于UCBerkeley的AMP实验室(2009)。Spar...原创 2018-05-24 09:49:08 · 3501 阅读 · 0 评论 -
Spark2.1.0之代码结构及载入Ecplise方法
一、项目结构 在大型项目中,往往涉及非常多的功能模块,此时借助于Maven进行项目、子项目(模块)的管理,能够节省很多开发和沟通成本。整个Spark项目就是一个大的Maven项目,包含着多个子项目。无论是Spark父项目还是子项目,本身都可以作为独立的Maven项目来管理。core是Spark最为核心的功能模块,提供了RPC框架、度量系统、Spark UI、存储体系、调度系统、计算引...原创 2018-05-17 10:01:58 · 1523 阅读 · 0 评论 -
Spark2.1.0之初体验
在《Spark2.1.0之运行环境准备》一文中,已经介绍了如何准备好基本的Spark运行环境,现在是时候实践一下,以便于在使用过程中提升读者对于Spark最直接的感触!本文通过Spark的基本使用,让读者对Spark能有初步的认识,便于引导读者逐步深入学习。运行spark-shell 在《Spark2.1.0之运行环境准备》一文曾经简单运行了spark-shell,并用下图进行...原创 2018-05-04 10:01:45 · 5419 阅读 · 10 评论 -
Spark2.1.0之运行环境准备
学习一个工具的最好途径,就是使用它。这就好比《极品飞车》玩得好的同学,未必真的会开车,要学习车的驾驶技能,就必须用手触摸方向盘、用脚感受刹车与油门的力道。在IT领域,在深入了解一个系统的原理、实现细节之前,应当先准备好它的运行环境或者源码阅读环境。如果能在实际环境下安装和运行Spark,显然能够提升读者对于Spark的一些感受,对系统能有个大体的印象,有经验的工程师甚至能够猜出一些S...原创 2018-05-04 10:15:12 · 2095 阅读 · 0 评论 -
Spark2.1.0之剖析spark-shell
通过在spark-shell中执行word count的过程,让读者了解到可以使用spark-shell提交Spark作业。现在读者应该很想知道spark-shell究竟做了什么呢?脚本分析 在Spark安装目录的bin文件夹下可以找到spark-shell,其中有代码清单1-1所示的一段脚本。代码清单1-1 spark-shell脚本function m...原创 2018-04-20 09:30:10 · 4366 阅读 · 0 评论 -
Spark1.6.0功能扩展——为HiveThriftServer2增加HA
前言 HiveThriftServer2是Spark基于HiveServer2实现的多Session管理的Thrift服务,提供对Hive的集中式管理服务。HiveThriftServer2作为Yarn上的Application,目前只支持yarn-client模式——即Driver运行在本地,ApplicationMaster运行在NodeManager所管理的Container中。yarn-c...原创 2018-04-16 10:10:36 · 2910 阅读 · 0 评论 -
Spark2.1.0之初识Spark
随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题;社交圈子从现实搬到了Facebook、Twitter、微信等社交平台上;女孩子们现在少了逛街,多了在各大电商平台上的购买;喜欢棋牌的人能够在对战平台上找到世界各地的玩家对弈。在国内随着网民数量的持续增加,造成互联网公司的数据在体量、产生速度、多样性等方面呈现出巨大的变化。 互联网产生的...原创 2018-04-09 09:48:51 · 4809 阅读 · 12 评论 -
Spark1.6.0——HiveThriftServer2的生命周期管理
前言几年前,我在刚刚进入大数据领域的时候,很快就了解到Hive所提供的一种另类的SQL。最初使用Hive的命令行提交任务,后来便用上了HiveServer和HiveServer2。半年前第一次注意到Spark的Thrift服务,当时心中就笃定它肯定与HiveServer2有着某种联系,直到在工作中真正使用它。在使用HiveThriftServer2的过程中,通过故障排查、源码分析和功能优化...原创 2018-03-09 11:43:03 · 4097 阅读 · 0 评论 -
Spark2.1命令工具类CommandUtils的源码分析
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录F的内容都在本文呈现。 CommandUtils是Spark中最常用的工具类之一,其作用是为了构建进程。如果不太关心其实现也不影响对Spark源码的阅读和原理的学习。我们要介绍的方法如下:buildProcessBuilder功能描述:基于给定的参数创建ProcessBuil...原创 2018-03-09 11:40:53 · 1032 阅读 · 0 评论 -
附录G Netty与NettyUtils
注:本文是为了配合《Spark内核设计的艺术 架构设计与实现》一书的内容而编写,目的是为了节省成本、方便读者查阅。书中附录G的内容都在本文呈现。 Netty是一个NIO客户端服务器框架,使得开发高性能、高可靠性的网络服务器和客户端程序变得快速且容易。它极大地简化化了网络编程,如TCP和UDP套接字服务器。 “快速和容易”并不意味着应用程序会有难维护和性能低的问题。Netty是一个精心设计的框架,...原创 2018-02-07 09:39:31 · 2915 阅读 · 0 评论