BOB(中国)官方入口-BOB网址是多少

BOB体育官方网址 面试|十分钟聊透Spark

202110月08日

BOB体育官方网址 面试|十分钟聊透Spark

本文转载自微信公多号「大数据技术与数仓」,作者西贝。转载本文请相关大数据技术与数仓公多号。

Spark是一个迅速的大数据处理引擎,在实际的生产环境中,行使十分普及。现在,Spark照样是大数据开发专门主要的一个工具,因而在面试的过程中,Spark也会是被重点考察的对象。对于初学者而言,面对众多的Spark相关概念,暂时会难以厘清头绪,对于操纵Spark开发的同学而言,未必候也会对这些概念感到暧昧。本文主要梳理了几个关于Spark的比较主要的几个概念,在面试的过程中倘若被问到Spark相关的题目,详细能够从以下几个方面睁开即可,期待对你有所协助。本文主要包括以下内容:

运走架构 运走流程 实走模式 驱动程序 共享变量 宽倚赖窄倚赖 持久化 分区 综相符实践案例 构成

Spark栈包括SQL和DataFrames,MLlib机器学习,GraphX和SparkStreaming。用户能够在联相符个行使程序中无缝组相符操纵这些库。

架构

Spark运走架构包括集群资源管理器。其中,集群资源管理器能够是Spark自带的资源管理器,也能够是YARN或Mesos等资源管理框架。

运走流程

当一个Spark行使被挑交时,最先必要为这个行使构建首基本的运走环境,即由义务限制节点的通信以及进走资源的申请、义务的分配和监控等。SparkContext会向资源管理器注册并申请运走Executor的资源; 资源管理器为Executor分配资源,并启动Executor进程,Executor运走情况将随着“心跳”发送到资源管理器上; SparkContext按照RDD的倚赖相关构建DAG图,DAG图挑交给DAG调度器进走处理;Executor向SparkContext申请义务,义务调度器将义务分发给Executor运走,同时,SparkContext将行使程序代码发放给Executor; 义务在Executor上运走,把实走效果逆馈给义务调度器,然后逆馈给DAG调度器,运走完毕后写入数据并开释一切资源。 MapReduceVSSpark

与Spark相比,MapReduce具有以下弱点:

外达能力有限 磁盘IO支付大 延宕高 义务之间的衔接涉及IO支付 在前一个义务实走完善之前,其他义务就无法最先,难以胜任复杂、多阶段的计算义务

与MapReduce相比,Spark具有以下益处:详细包括两个方面

一是行使多线程实走详细的义务,缩短义务的启动支付; 二是Executor中有一个BlockManager存储模块,会将内存和磁盘共同行为存储设备,当必要多轮迭代计算时,能够将中间效果存储到这个存储模块里,下次必要时,就能够直接读该存储模块里的数据,而不必要读写到HDFS等文件体系里,因而有效缩短了IO支付;或者在交互式查询场景下,预先将外缓存到该存储体系上,从而能够挑高读写IO性能。 驱动程序和Executor

运走main函数的驱动程序进程位于集群中的一个节点上,负责三件事:

维护相关Spark行使程序的新闻。 反响用户的程序或输入。 跨Executor分析、分配和调度作业。

驱动程序进程是绝对必要的——它是Spark行使程序的核心,并在行使程序的生命周期内维护一切相关新闻。

Executor负责实际实走驱动程序分配给他们的义务。这意味着每个Executor只负责两件事:

实走驱动程序分配给它的代码。 向Driver节点汇报该Executor的计算状态 分区

为了让每个executor并走实走做事,Spark将数据分解成称为partitions的块。分区是位于集群中一台物理机器上的走的荟萃。Dataframe的分区外示数据在实走期间如何在机器集群中物理分布。

倘若你有一个分区,即使你有数千个Executor,Spark的并走度也只有一个。倘若你有许多分区但只有一个实走器,Spark照样只有一个并走度,由于只有一个计算资源。

实走模式:ClientVSClusterVSLocal

实走模式能够在运走行使程序时确定Driver和Executor的物理位置。

有三栽模式可供选择:

集群模式。 客户端模式。 本地模式。

集群模式能够是运走Spark行使程序最常见的方式。在集群模式下,用户将预译的代码挑交给集群管理器。除了启动Executor之外,集群管理器会在集群内的做事节点进程。这意味着集群管理器负责管理与Spark行使程序相关的一切进程。

客户端模式与集群模式几乎相通,只是Spark驱动程序保留在挑交行使程序的客户端节点上。这意味着客户端机器负责维护Sparkdriver进程,集群管理器维护executor进程。清淡将这个节点称之为网关节点。

本地模式能够被认为是在你的计算机上运走一个程序,spark会在联相符个JVM中运走驱动程序和实走程序。

RDDVSDataFrameVSDataSet

RDD

一个RDD是一个分布式对象荟萃,其内心是一个只读的、分区的记录荟萃。每个RDD能够分成多个分区,差别的分区保存在差别的集群节点上得到新的RDD。

基于内存

RDD是位于内存中的对象荟萃。RDD能够存储在内存、磁盘或者内存添磁盘中,但是,Spark之因而速度快,是基于如许一个原形:数据存储在内存中,并且每个算子不会从磁盘上挑取数据。

分区

分区是对逻辑数据集划分成差别的自力片面,分区是分布式体系性能优化的一栽技术方法,能够缩短网络流量传输BOB体育官方网址,将相通的key的元素分布在相通的分区中能够缩短shuffle带的影响。RDD被分成了多个分区,这些分区分布在集群中的差别节点。

强类型

RDD中的数据是强类型的,当创建RDD的时候,一切的元素都是相通的类型,该类型倚赖于数据集的数据类型。

懒添载

Spark的转换操作是懒添载模式,这就意味着只有在实走了action操作之后,才会往实走一些列的算子操作。

不可修改

RDD一旦被创建,就不克被修改。只能从一个RDD转换成另外一个RDD。

并走化

RDD是能够被并走操作的,由于RDD是分区的,每个分区分布在差别的机器上,因而每个分区能够被并走操作。

持久化

由于RDD是懒添载的,只有action操作才会导致RDD的转换操作被实走,进而创建出相对答的RDD。对于一些被重复操纵的RDD,能够对其进走持久化操作,从而挑高计算效果。

DataFrame

DataFrame代外一个不可变的分布式数据荟萃,其核心现在标是让开发者面对数据处理时,只关心要做什么,而不必关心怎么往做,将一些优化的做事交由Spark框架本身往处理。DataFrame是具有Schema新闻的,也就是说能够被望做具有字段名称和类型的数据,相通于相关型数据库中的外,但是底层做了许多的优化。创建了DataFrame之后,就能够操纵SQL进走数据处理。

用户能够从多栽数据源中组织DataFrame,例如:组织化数据文件,Hive中的外,外部数据库或现有RDD。DataFrameAPI声援Scala,Java,Python和R,在Scala和Java中,row类型的DataSet代外DataFrame,即Dataset[Row]等同于DataFrame。

DataSet

DataSet是Spark1.6中增补的新接口,是DataFrame的扩展,它具有RDD的益处。值得仔细的是,BOB体育官方网址DatasetAPI在Scala和Java中可用Python不声援DatasetAPI。

另外DataSetAPI能够缩短内存的操纵由于Spark框架清新DataSet的数据组织因此在持久化DataSet时能够撙节许多的内存空间。

共享变量

Spark挑供了两栽类型的共享变量:广播变量和累添器。广播变量能够将一切义务的数据累添到一个共享效果中。

广播变量

广播变量批准用户在集群中共享一个不可变的值该共享的、不可变的值被持计划到集群的每台节点上。清淡在必要将一份幼批据集则必要将两者join在一首这时就能够操纵广播变量将该外广播到集群的每个节点。详细如下图所示:

如上图最先Driver将序列化对象分割成幼的数据库然后将这些数据块存储在Driver节点的BlockManager上。当ececutor中实走详细的task时每个executor最先尝试从本身所在节点的BlockManager挑取数据倘若之前已经挑取的该广播变量的值就直接操纵它。倘若异国找到则会向长途的Driver或者其他的Executor中挑取广播变量的值一旦获取该值就将其存储在本身节点的BlockManager中。这栽机制能够避免Driver端向多个executor发送数据而造成的性能瓶颈。

累添器

累添器是Spark挑供的另外一个共享变量与广播变量差别累添器是能够被修改的是可变的。每个transformation会将修改的累添器值传输到Driver节点累添器能够实现一个累添的功能相通于一个计数器。Spark本身声援数字类型的累添器用户也能够自定义累添器的类型。

宽倚赖和窄倚赖

RDD中差别的操作会使得差别RDD中的分区产差别的倚赖主要有两栽倚赖:宽倚赖和窄倚赖。宽倚赖是指一个父RDD的一个分区对答一个子RDD的多个分区窄倚赖是指一个父RDD的分区对答与一个子RDD的分区或者多个父RDD的分区对答一个子RDD分区。

窄倚赖会被划分到联相符个stage中如许能够以管道的方法迭代实走。宽倚赖所倚赖的分区清淡有多个因而必要跨节点传输数据。容易灾方面望两栽倚赖的计算效果恢复的方式是差别的窄倚赖只必要恢复父RDD丢失的分区即可而宽倚赖则必要考虑恢复一切父RDD丢失的分区。

DAGScheduler会将Job的RDD划分到差别的stage中并构建一个stage的倚赖相关即DAG。如许划分的现在标是既能够保障异国倚赖相关的stage能够并走实走又能够保证存在倚赖相关的stage挨次实走。stage主要分为两栽类型一栽是ShuffleMapStage另一栽是ResultStage。其中ShuffleMapStage是属于上游的stage而ResulStage属于最下游的stage这意味着上游的stage先实走末了实走ResultStage。

持久化

方式

在Spark中RDD采用惰性求值的机制每次遇到action操作都会从头最先实走计算。每次调用action操作都会触发一次从头最先的计算。对于必要被重复操纵的RDDspark声援对其进走持久化议决调用persist方法即可实现RDD的持计划。议决持久化机制能够避免重复计算带的支付。值得仔细的是当调用持久化的方法时只是对该RDD标记为了持久化必要等到第一次实走action操作之后才会把计算效果进走持久化。持久化后的RDD将会被保留在计算节点的内存中被后面的走动操作重复操纵。

Spark挑供的两个持久化方法的主要区别是:cache方法。

持久化级别的选择

Spark挑供的持久化存储级别是在内存操纵与CPU效果之间做权衡清淡保举下面的选择方式:

倘若内存能够原谅RDD能够操纵默认的持久化级别即MEMORY_ONLY。这是CPU最有效果的选择能够使作用在RDD上的算子尽能够第迅速实走。 倘若内存不足用能够尝试操纵MEMORY_ONLY_SER操纵一个迅速的序列化库能够撙节许多空间比如Kryo。

tips:在一些shuffle算子中比如reduceByKey即便异国显性调用persist方法Spark也会自动将中间效果进走持久化如许做的现在标是避免在shuffle期间发生故障而造成重新计算整个输入。即便如此照样保举对必要被重复操纵的RDD进走持久化处理。

coalesceVSrepartition

repartition算法对数据进走了shuffle操作并创建了大幼十分的数据分区。coalesce操作相符并现有分区以避免shuffle除此之外coalesce操作仅能用于缩短分区不克用于增补分区。

值得仔细的是:操纵coalesce在缩短分区时并异国对一切数据进走了移动仅仅是在原分区的基础之上进走了相符并而已因而效果较高但是能够会引首数据倾斜。

综相符案例

一栽数仓技术架构

SparkStreaming实时同步

订阅消耗:

SparkStreaming消耗kafka埋点数据

数据写入:

将解析的数据同时写入HDFS上的某个暂时现在录下及Hive外对答的分区现在录下

幼文件相符并:

由于是实时数据抽取因而会生成大量的幼文件幼文件的生成取决于SparkStreaming的BatchInterval比如一分钟一个batch那么一分钟就会生成一个幼文件

基于SparkSQL的批处理

ODS层到DWD层数据往重

SparkStreaming数据输出是AtLeastOnce能够会存在数据重复。在ODS层到DWD层进走明细数据处理时必要对数据操纵row_number往重。

JDBC写入MySQL

数据量大时必要对数据进走重分区并且为DataSet分区级别竖立连接采用批量挑交的方式。

操纵DISTRIBUTEBY子句避免生成大量幼文件

spark.sql.shuffle.partitions的默认值为200会导致以下题目

对于较幼的数据200是一个过大的选择由于调度支付清淡会导致处理速度变慢同时会造成幼文件的产生。 对于大数据集200很幼无法有效行使集群中的资源

操纵DISTRIBUTEBYcast这边的N是指详细末了落地生成多少个文件数。

手动维护offset至HBase

当作业发生故障或重启时要保障从现在的消耗位点往处理数据单纯的仰仗SparkStreaming本身的机制是不太理想生产环境中清淡借助手动管理维护kafka的offset。

流行使监指控警BOB体育官方网址

实现StreamingListener接口重写onBatchStarted与onBatchCompleted方法 获取batch实走完善之后的时间写入Redis数据类型的key为自定义的详细字符串value是batch处理完的终结时间 添入流作业监控 启动准时义务监控上述步骤写入redis的kv数据一旦超出给定的阈值则报错并发出告警关照 操纵Azkaban准时调度该义务
回到顶部

Powered by BOB(中国)官方入口-BOB网址是多少 @2018 RSS地图 HTML地图