spark源码分析

Spark2.0-RDD分区原理分析

纵饮孤独 提交于 2020-03-24 09:00:02
3 月,跳不动了?>>> Spark分区原理分析 介绍 分区是指如何把RDD分布在spark集群的各个节点的操作。以及一个RDD能够分多少个分区。 一个分区是大型分布式数据集的逻辑块。 那么思考一下:分区数如何映射到spark的任务数?如何验证?分区和任务如何对应到本地的数据? Spark使用分区来管理数据,这些分区有助于并行化分布式数据处理,并以最少的网络流量在executors之间发送数据。 默认情况下,Spark尝试从靠近它的节点读取数据到RDD。由于Spark通常访问分布式分区数据,为了优化transformation(转换)操作,它创建分区来保存数据块。 存在在HDFS或Cassandra中的分区数据是一一对应的(由于相同的原因进行分区)。 默认情况下,每个HDFS的分区文件(默认分区文件块大小是64M)都会创建一个RDD分区。 默认情况下,不需要程序员干预,RDD会自动进行分区。但有时候你需要为你的应用程序,调整分区的大小,或者使用另一种分区方案。 你可以通过方法 def getPartitions: Array[Partition] 来获取RDD的分区数量。 在spark-shell中执行以下代码: val v = sc.parallelize(1 to 100) scala> v.getNumPartitions res2: Int = 20 /

spark2.1源码分析1:Win10下IDEA源码阅读环境的搭建

有些话、适合烂在心里 提交于 2020-03-04 16:53:41
环境:win10、IDEA2016.3、maven3.3.9、git、scala 2.11.8、java1.8.0_101、sbt0.13.12 下载: #git bash中执行: git clone https://github.com/apache/spark.git git tag git checkout v2.1.0-rc5 git checkout -b v2.1.0-rc5 导入IDEA,开始调试: file–open–选中根目录pom.xml,open as project 编译: 等待IDEA index文件完成 打开Maven Project–Profiles–勾选:hadoop-2.6、yarn 点击import changes,再次等待IDEA index文件完成 Maven Project–Generate Sources and Update Folders For All Projects mvn -T 6 -Pyarn -Phadoop-2.6 -DskipTests clean package bin/spark-shell 错误: Exception in thread "main" java.lang.ExceptionInInitializerError at org.apache.spark.package$.<init>(package

Spark 源码和应用开发环境的构建

﹥>﹥吖頭↗ 提交于 2020-03-04 16:51:27
引言 Spark 现在无疑是大数据领域最热门的技术之一,读者很容易搜索到介绍如何应用 Spark 技术的文章,但是作为开发人员,在了解了应用的概念之后,更习惯的是打开开发环境,开发一些应用来更深入的学习 spark 知识,在遇到问题的时候,也希望能够深入调试 Spark 源代码来解决问题。但是由于 Spark 技术本身较新,对于初学者,在构建开发调试环境的过程中,总会遇到这样那样的问题。而其使用的 Scala 语言,SBT 构建工具相对于 Java 语言,Maven 构建工具而言,也比较小众,因些在 Web 上能够参考的信息相对也比较少。本文结合作者的实践,从 Spark 的源码开始编译整个项目,同时给出了一些在编译过程中可能出现的问题,供使用参考。文中各步骤展示的编译方法主要用于方便学习 Spark 源码,若仅需要编写 Spark 应用则不需要如此繁复的流程,具体引用方法可参考最后一章。 环境要求 系统:Windows/Linux/Mac OS IDE:Eclipse/IntelliJ 其他依赖:Scala,Sbt,Maven Eclipse 下开发调试环境的配置 该小节中使用的各项工具分别为:Windows 7+Eclipse Java EE 4.4.2+Scala 2.10.4+Sbt 0.13.8+Maven3.3.3,测试的 Spark 版本为 1.4.0。 1.配置

如果你在准备面试,就好好看看这130道题

我的未来我决定 提交于 2020-02-27 05:01:02
这些题目是一个知识星球的球友发给我的,其中有几个题帮着解答了一下。希望对大家有帮助。 如果你不知道如何准备面试,那么看看这个。 年假马上来临,我相信有不少读者都在准备或者考虑面试,无论如何不妨收藏一下。 如果你某个题目不知道答案,那么就去搜一下,如果搜不到,在公众号回复【加群】,可以加到群里寻求小伙伴们的求助。或者扫最下面的二维码加小助手好友并留言,有时间后我会回复你。 顺便多提一句, 计算机基础和语言基础 请大家务必重视,如果你不是计算机专业,那么这些东西都要平时多看看。 这130个题暂时没有答案,很多题目《大数据技术与架构》都发过文章讲解过,需要你自己去准备,去看,去思考,真正理解。不要妄想别人喂给你,毕竟我们是人不是鸭子。 1、HashMap 和 Hashtable 区别 2、Java 垃圾回收机制和生命周期 3、怎么解决 Kafka 数据丢失的问题 4、zookeeper 是如何保证数据一致性的 5、hadoop 和 spark 在处理数据时,处理出现内存溢出的方法有哪些? 6、java 实现快速排序 7、设计微信群发红包数据库表结构(包含表名称、字段名称、类型) 8、如何选型:业务场景、性能要求、维护和扩展性、成本、开源活跃度 9、Spark如何调优 10、Flink和spark的通信框架有什么异同 11、Java的代理 12、Java的内存溢出和内存泄漏 13

Spark 源码解析 : DAGScheduler中的DAG划分与提交

痞子三分冷 提交于 2020-02-26 02:24:54
一、Spark 运行架构 Spark 运行架构如下图: 各个RDD之间存在着依赖关系,这些依赖关系形成有向无环图DAG,DAGScheduler对这些依赖关系形成的DAG,进行Stage划分,划分的规则很简单,从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。完成了Stage的划分,DAGScheduler基于每个Stage生成TaskSet,并将TaskSet提交给TaskScheduler。TaskScheduler 负责具体的task调度,在Worker节点上启动task。 二、源码解析:DAGScheduler中的DAG划分 当RDD触发一个Action操作(如:colllect)后,导致SparkContext.runJob的执行。而在SparkContext的run方法中会调用DAGScheduler的run方法最终调用了DAGScheduler的submit方法: def submitJob[T, U]( rdd: RDD[T], func: (TaskContext, Iterator[T]) => U, partitions: Seq[Int], callSite: CallSite, resultHandler: (Int, U) => Unit, properties: Properties): JobWaiter[U] = { //

Spark源码

随声附和 提交于 2020-02-25 18:11:02
Spark版本:2.1.x Spark有许多模式,比如standlone 这里分析Spark on yarn 的部署流程。在这种模式中有几个重要的角色我们列出来。Driver、Executor、AM、NM、RM等,我们将在源码中将这几个组件串联起来,分析在Spark on yarn下这几个组件是如何工作的。 入口 spark-submit 中调用的类为 org.apache.spark.deploy.SparkSubmit 具体分析过程不赘述。 所以我们直接从SparkSubmit 分析,后续的逻辑。 1 % org.apache.spark.deploy.SparkSubmit %% main %%% SparkSubmitArguments(args) 进入main方法SparkSubmitArguments(args)进行参数准备,这是一个class对象,当我们使用new SparkSubmitArguments(args)的时候,其中的所有的代码从上至下依次执行。 %% submit(appArgs) %%% prepareSubmitEnvironment(args) 在这个方法中,返回了方法参数,其中 mainClass代表的参数是org.apache.spark.deploy.yarn.Client %%% Runmain() 此方法中以开启线程的方式

图解Spark中CoarseGrainedExecutorBackend的执行流程

喜欢而已 提交于 2020-02-11 06:25:48
Spark在Yarn-Cluster部署模式下,程序在提交之后会依次创建三个进程:SparkSubmit,ApplicationMaster和CoarseGrainedExecutorBackend。本文主要在对源码进行分析之后以图解的方式展示CoarseGrainedExecutorBackend的执行流程。 由上图的执行流程可以看出,CoarseGrainedExecutorBackend进程主要有以下几个作用: (1)向Driver注册Executor进程 (2)在接收到注册成功的message之后,创建Executor对象 (3)接收Driver分配的任务 来源: CSDN 作者: 满岛菜鸟 链接: https://blog.csdn.net/weixin_43616627/article/details/104228805

第5章 RDD编程进阶

社会主义新天地 提交于 2020-02-08 17:08:01
上篇: 第4章 大数据Spark连接HBase数据读取与保存 Spark 三大数据结构 RDD:分布式数据集 广播变量:分布式只读共享变量 累加器: 分布式只写共享变量 1、累加器 累加器用来对信息进行聚合,通常在向 Spark传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们想要的效果。 代码具体实现: package com . study . bigdatabase import org . apache . hadoop . hbase . HBaseConfiguration import org . apache . hadoop . hbase . client . Put import org . apache . hadoop . hbase . io . ImmutableBytesWritable import org . apache . hadoop . hbase . mapred . TableOutputFormat import org . apache . hadoop . hbase . util . Bytes

Spark学习之路 (十六)SparkCore的源码解读(二)spark-submit提交脚本[转]

懵懂的女人 提交于 2020-01-26 18:12:08
概述 上一篇主要是介绍了spark启动的一些脚本,这篇主要分析一下Spark源码中提交任务脚本的处理逻辑,从spark-submit一步步深入进去看看任务提交的整体流程,首先看一下整体的流程概要图: 源码解读 spark-submit # -z是检查后面变量是否为空(空则真) shell可以在双引号之内引用变量,单引号不可 #这一步作用是检查SPARK_HOME变量是否为空,为空则执行then后面程序 #source命令: source filename作用在当前bash环境下读取并执行filename中的命令 #$0代表shell脚本文件本身的文件名,这里即使spark-submit #dirname用于取得脚本文件所在目录 dirname $0取得当前脚本文件所在目录 #$(命令)表示返回该命令的结果 #故整个if语句的含义是:如果SPARK_HOME变量没有设置值,则执行当前目录下的find-spark-home脚本文件,设置SPARK_HOME值 if [ -z "${SPARK_HOME}" ]; then source "$(dirname "$0")"/find-spark-home fi # disable randomized hash for string in Python 3.3+ export PYTHONHASHSEED=0 #执行spark

Spark学习之路 (十)SparkCore的调优之Shuffle调优[转]

吃可爱长大的小学妹 提交于 2020-01-26 18:04:18
概述 大多数Spark作业的性能主要就是消耗在了shuffle环节,因为该环节包含了大量的磁盘IO、序列化、网络数据传输等操作。因此,如果要让作业的性能更上一层楼,就有必要对shuffle过程进行调优。但是也必须提醒大家的是,影响一个Spark作业性能的因素,主要还是代码开发、资源参数以及数据倾斜,shuffle调优只能在整个Spark的性能调优中占到一小部分而已。因此大家务必把握住调优的基本原则,千万不要舍本逐末。下面我们就给大家详细讲解shuffle的原理,以及相关参数的说明,同时给出各个参数的调优建议。 shuffle的定义 Spark的运行主要分为2部分:   一部分是驱动程序,其核心是SparkContext;   另一部分是Worker节点上Task,它是运行实际任务的。程序运行的时候,Driver和Executor进程相互交互:运行什么任务,即Driver会分配Task到Executor,Driver 跟 Executor 进行网络传输; 任务数据从哪儿获取,即Task要从 Driver 抓取其他上游的 Task 的数据结果,所以有这个过程中就不断的产生网络结果。其中,下一个 Stage 向上一个 Stage 要数据这个过程,我们就称之为 Shuffle。 HashShuffleManager的运行原理 在Spark的源码中,负责shuffle过程的执行