深入研究火花内部和建筑
Apache Spark是一个开源分布式通用群集计算框架。SPARK应用程序是JVM流程,它使用SPARK作为第三方库运行用户代码。
作为此博客的一部分,我将展示Spark在纱线体系结构上的工作方式,其中涉及的各种基础背景过程,例如:
- 火花上下文
- 纱线资源经理,应用程序主和执行人的启动(容器)。
- 设置环境变量,工作资源。
- roogrgrainingExecorbackend和基于Netty的RPC。
- 闪闪发光的人。
- 执行工作(逻辑计划,物理计划)。
- Spark-Webui。
火花上下文
火花上下文是任何火花应用程序的入口点和核心。火花壳只不过是一个基于Scala的带有Spark Binaries的REPL,它将创建一个称为Spark上下文的对象SC。
我们可以启动火花壳,如下所示:
火花壳 - 大师纱\
-conf spark.ui.port = 12345 \
-num-executors 3 \
- 执行核2 \
- 执行记忆500m
作为火花壳的一部分,我们提到了数字执行者。他们指出要使用的工人节点的数量以及这些工人节点的每个核心数量并行执行任务。
或者,您可以使用默认配置启动Spark Shell。
Spark-Shell - 主纱
该配置作为作为的一部分存在Spark-env.sh
我们的驱动程序程序是在网关节点上执行的,这不过是火花壳。它将创建一个火花上下文并启动应用程序。
可以使用火花上下文对象使用sc。
创建火花上下文后,它将等待资源。资源可用后,Spark上下文设置了内部服务,并建立了与Spark执行环境的连接。
纱线资源经理,应用程序主和执行人的启动(容器)。
一旦创建了火花上下文,它将检查集群管理器并启动应用程序主即,启动一个容器,并注册信号处理程序。
应用程序主启动后,它将与驱动程序建立连接。
接下来,ApplicationMasterEndpoint触发一个代理应用程序,可以连接到资源管理器。
现在,纱线容器将执行以下操作,如图所示。
ii)yarnrmclient将向应用程序主持人注册。
iii)Yarnallocator:将要求3个执行器容器,每个容器有2个内核和884 MB内存,包括384 MB开销
iv)am启动记者线程
现在,纱线分配器从驱动程序接收令牌以启动执行器节点并启动容器。
设置环境变量,工作资源和启动容器。
每次启动一个容器时,它都会在其中完成以下3件事。
- 设置ENV变量
Spark Runtime环境(SparkEnv)是带有Spark服务的运行时环境,用于相互交互,以建立Spark应用程序的分布式计算平台。
- 设置工作资源
- 启动容器
YARN执行程序启动上下文将每个执行程序分配给执行程序ID,以识别相应的执行程序(通过Spark WebUI)并启动coolgragenledExeCutorBackend。
roogrgrainingExecorbackend和基于Netty的RPC。
从资源管理器获得资源后,我们将看到执行者启动
croughgrainingExecutorBackend是控制单个执行人的生命周期的executorBackend。它将执行人的状态发送给驾驶员。
启动执行权限后,croungrainingExeCutorBackend寄存了执行程序RPC端点和信号处理程序,以与驱动程序通信(即使用RogialgrangedScheduler RPC端点),并告知其准备启动任务。
基于Netty的RPC-它用于在工人节点,火花上下文,执行者之间进行通信。
NetTyrPcendPoint用于跟踪工作节点的结果状态。
rpcendpointAddress是带有RPCADDRESS和名称的RPC环境注册的端点的逻辑地址。
如下所示,它的格式如下:
这是RocalgrainingExeCutorBackend通过RPCENV在DriverUrl上启动可用驱动程序的通信的第一刻。
闪闪发光的人
SparkListener(调度程序侦听器)是一类,可以听到Spark的Dagscheduler中的执行事件,并记录应用程序的所有事件信息,例如执行人,驱动程序分配详细信息以及作业,阶段以及任务以及其他环境属性的更改。
SparkContext启动了驾驶员内部的生计。它将JobProgressListener注册为livelistenerbus,它收集了所有数据以显示Spark UI中的统计数据。
默认情况下,只能启用WebUI的侦听器,但是如果我们要添加任何其他侦听器,那么我们可以使用Spark.Extralisteners。
Spark带来了两名听众展示大多数活动的听众
i)StatsReportListener
ii)EventLoggingListener
EventLoggingListener:如果您想进一步分析应用程序的性能,超出了Spark历史服务器的一部分,则可以处理事件日志数据。Spark事件日志记录已处理的作业/阶段/任务上的信息。可以启用如下所示...
事件日志文件可以如下所示读取
- Spark驱动程序在Spark.evenlog.dir目录中作为JSON文件中的工作负载/perf指标登录。
- 每个应用程序有一个文件,文件名包含应用程序ID(因此包括时间戳)application_1540458187951_38909。
它显示了事件的类型和每个条目的数量。
现在,让我们添加StatsReportListener到Spark.Extralisteners并检查工作状态。
启用org.apache.spark.scheduler.statsreportlistener记录器的信息记录级别以查看Spark事件。
要启用听众,请将其注册到SparkContext。可以通过两种方式完成。
i)在Spark应用程序中使用SparkContext.AddsParkListener(侦听器:SparkListener)方法。
单击链接以实现自定义侦听器 -CustomListener
ii)使用conf命令行选项
让我们阅读一个示例文件并执行计数操作以查看StatsReportListener。
执行工作(逻辑计划,物理计划)。
在火花中,rdd(弹性分布式数据集)是抽象层的第一级。它是可以并行操作的群集节点上分区的元素集合。RDD可以通过两种方式创建。
i)p合理化驱动程序程序中的现有集合
ii)在外部存储系统中引用数据集
RDD是通过使用Hadoop文件系统中的文件或驱动程序程序中的现有Scala集合而创建的,然后对其进行了转换。
让我们进行样品片段,如下所示
上述摘要的执行分为两个阶段。
6.1逻辑计划:在此阶段,使用一组转换创建了一个RDD,它通过构建计算链(一系列RDD)作为转换图表来跟踪驱动程序程序中的这些转换,以产生一个称为A的RDD血统图。
转换可以进一步分为两种类型
- 狭窄的转换:可以作为一个阶段执行的操作管道,并且不需要在分区中跨越数据,例如,地图,过滤器等。
现在,数据将使用广播变量读取到驱动程序中。
- 广泛的转型:在这里,每个操作都需要调整数据,因此,对于每个广泛的转换,将创建新的阶段,例如,ReadyByKey等。
我们可以使用Todebugstring
6.2身体计划:在此阶段,一旦我们触发了RDD的动作,DAG调度程序查看RDD Lineage,并提出了最佳的执行计划,其中包括阶段和任务以及Taskschedulerimpl,并将作业执行为一组任务。
一旦我们执行了动作操作,SparkContext就会触发工作并记录RDD,直到第一个阶段(即在任何广泛转换之前)作为Dagscheduler的一部分。
现在,在进入下一个阶段(广泛的转换)之前,它将检查是否有任何分区数据进行洗牌,以及是否缺少依赖的父级操作结果,如果缺少任何此类阶段通过使用DAG(定向无环图)来执行操作的那部分,这使其具有容错性。
对于缺少任务,它将任务分配给执行者。
每个任务都被分配给执行程序的cromergragingExecutorBackend。
它从Namenode获取块信息。
现在,它执行计算并返回结果。
接下来,Dagscheduler寻找新运行的阶段,并触发下一个阶段(降低bykey)操作。
Shuffleblockfetcheriterator会得到块。
现在,减少操作分为两个任务并执行。
完成每个任务后,执行人将结果返回给驱动程序。
作业完成后,将显示结果。
Spark-Webui
Spark-UI有助于理解代码执行流以及完成特定作业所花费的时间。可视化有助于找出执行过程中发生的任何基本问题,并进一步优化SPARK应用程序。
我们将看到Spark-UI可视化是前一个的一部分步骤6。
作业完成后,您可以看到作业详细信息,例如阶段数量,即在作业执行工作期间计划的任务数量。
在单击完成的作业时,我们可以查看DAG可视化,即不同的宽和窄转换为其中的一部分。
您可以看到每个阶段所需的执行时间。
作为作业的一部分,单击特定阶段时,它将显示有关数据块居住的位置,数据大小,使用的执行人,使用的内存以及完成特定任务所花费的时间的完整详细信息。它还显示了发生的洗牌数量。
此外,我们可以单击“执行者”选项卡以查看使用的执行人和驱动程序。
既然我们已经看到了Spark的内部工作原理,则可以通过使用Spark UI,日志和调整Spark EventListeners来确定执行流程,以确定在提交Spark作业时确定最佳解决方案。
笔记:与本文相关的执行命令是我的一部分git帐户。
同样,您也可以在这里阅读更多:
如果您也愿意,可以在LinkedIn上与我联系 -Jayvardhan Reddy。
如果您喜欢阅读它,可以单击拍手,让其他人知道它。如果您希望我添加其他任何内容,请随时留下答复