暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

灵魂质问-Spark篇02

破晓的不止黎明 2019-08-01
273

问题一,driver的功能是什么?

1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点;
2)功能:负责向集群申请资源,向master注册信息,负责了作业的调度,负责作业的解析、生成Stage并调度TaskExecutor上。包括DAGSchedulerTaskScheduler


问题二,spark的有几种部署模式,每种模式特点?

1本地模式

Spark不一定非要跑在hadoop集群,可以在本地,起多个线程的方式来指定。将Spark应用以多线程的方式直接运行在本地,一般都是为了方便调试,本地模式分三类

·local:只启动一个executor

·local[k]:启动kexecutor

·local[*]:启动跟cpu数目相同的 executor

2standalone模式

分布式部署集群,自带完整的服务,资源管理和任务监控是Spark自己监控,这个模式也是其他模式的基础。

3Spark on yarn模式

分布式部署集群,资源和任务监控交给yarn管理,但是目前仅支持粗粒度资源分配方式,包含clusterclient运行模式,cluster适合生产,driver运行在集群子节点,具有容错功能,client适合调试,dirver运行在客户端

4Spark On Mesos模式

官方推荐这种模式(当然,原因之一是血缘关系)。正是由于Spark开发之初就考虑到支持Mesos,因此,目前而言,Spark运行在Mesos上会比运行在YARN上更加灵活,更加自然。用户可选择两种调度模式之一运行自己的应用程序:

1)粗粒度模式(Coarse-grained Mode):每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task(对应多少个“slot”)。应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源,即使不用,最后程序运行结束后,回收这些资源。

2)细粒度模式(Fine-grained Mode):鉴于粗粒度模式会造成大量资源浪费,Spark On Mesos还提供了另外一种调度模式:细粒度模式,这种模式类似于现在的云计算,思想是按需分配。


问题三, Spark技术栈有哪些组件,每个组件都有什么功能,适合什么应用场景?

可以画一个这样的技术栈图先,然后分别解释下每个组件的功能和场景
1Spark core是其它组件的基础,spark的内核,主要包含:有向循环图、RDDLingageCachebroadcast等,并封装了底层通讯框架,是Spark的基础。
2SparkStreaming是一个对实时数据流进行高通量、容错处理的流式处理系统,可以对多种数据源(如KdfkaFlumeTwitterZeroTCP 套接字)进行类似MapReduceJoin等复杂操作,将流式计算分解成一系列短小的批处理作业。
3Spark sqlSharkSparkSQL的前身,Spark SQL的一个重要特点是其能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行外部查询,同时进行更复杂的数据分析
4BlinkDB :是一个用于在海量数据上运行交互式 SQL 查询的大规模并行查询引擎,它允许用户通过权衡数据精度来提升查询响应时间,其数据的精度被控制在允许的误差范围内。
5MLBaseSpark生态圈的一部分专注于机器学习,让机器学习的门槛更低,让一些可能并不了解机器学习的用户也能方便地使用MLbaseMLBase分为四部分:MLlibMLIML OptimizerMLRuntime
6GraphXSpark中用于图和图并行计算


问题四,Spark中Work的主要工作是什么?

主要功能:管理当前节点内存,CPU的使用状况,接收master分配过来的资源指令,通过ExecutorRunner启动程序分配任务,worker就类似于包工头,管理分配新进程,做计算的服务,相当于process服务。

需要注意的是:

1worker会不会汇报当前信息给masterworker心跳给master主要只有workid,它不会发送资源信息以心跳的方式给matermaster分配的时候就知道work,只有出现故障的时候才会发送资源。

2worker不会运行代码,具体运行的是Executor是可以运行具体appliaction写的业务逻辑代码,操作代码的节点,它不会运行程序的代码的。


问题五,Spark为什么比mapreduce快?

1)基于内存计算,减少低效的磁盘交互;

2)高效的调度算法,基于DAG

3)容错机制Linage,精华部分就是DAGLingae



问题六,简单说一下hadoop和spark的shuffle相同和差异?

1)从 high-level 的角度来看,两者并没有大的差别。都是将 mapperSpark 里是 ShuffleMapTask)的输出进行 partition,不同的 partition 送到不同的 reducerSpark reducer 可能是下一个 stage 里的 ShuffleMapTask,也可能是 ResultTask)。Reducer 以内存作缓冲区,边 shuffle aggregate 数据,等到数据 aggregate 好以后进行 reduce() Spark 里可能是后续的一系列操作)。
2)从 low-level 的角度来看,两者差别不小。Hadoop MapReduce sort-based,进入 combine() reduce() records 必须先 sort。这样的好处在于 combine/reduce() 可以处理大规模的数据,因为其输入数据可以通过外排得到(mapper 对每段数据先做排序,reducer shuffle 对排好序的每段数据做归并)。目前的 Spark 默认选择的是 hash-based,通常使用 HashMap 来对 shuffle 来的数据进行 aggregate,不会对数据进行提前排序。如果用户需要经过排序的数据,那么需要自己调用类似 sortByKey() 的操作;如果你是Spark 1.1的用户,可以将spark.shuffle.manager设置为sort,则会对数据进行排序。在Spark 1.2中,sort将作为默认的Shuffle实现。
3)从实现角度来看,两者也有不少差别。Hadoop MapReduce 将处理流程划分出明显的几个阶段:map(), spill, merge, shuffle, sort, reduce() 等。每个阶段各司其职,可以按照过程式的编程思想来逐一实现每个阶段的功能。在 Spark 中,没有这样功能明确的阶段,只有不同的 stage 和一系列的 transformation(),所以 spill, merge, aggregate 等操作需要蕴含在 transformation() 中。
如果我们将 map 端划分数据、持久化数据的过程称为 shuffle write,而将 reducer 读入数据、aggregate 数据的过程称为 shuffle read。那么在 Spark 中,问题就变为怎么在 job 的逻辑或者物理执行图中加入 shuffle write shuffle read 的处理逻辑?以及两个处理逻辑应该怎么高效实现? 
Shuffle write由于不要求数据有序,shuffle write 的任务很简单:将数据 partition 好,并持久化。之所以要持久化,一方面是要减少内存存储空间压力,另一方面也是为了 fault-tolerance


问题七,Mapreduce和Spark的都是并行计算,那么他们有什么相同和区别

两者都是用mr模型来进行并行计算:

1hadoop的一个作业称为jobjob里面分为map taskreduce task,每个task都是在自己的进程中运行的,当task结束时,进程也会结束。 
2spark用户提交的任务成为application,一个application对应一个sparkcontextapp中存在多个job,每触发一次action操作就会产生一个job。这些job可以并行或串行执行,每个job中有多个stagestageshuffle过程中DAGSchaduler通过RDD之间的依赖关系划分job而来的,每个stage里面有多个task,组成tasksetTaskSchaduler分发到各个executor中执行,executor的生命周期是和app一样的,即使没有job运行也是存在的,所以task可以快速启动读取内存进行计算。 
3hadoopjob只有mapreduce操作,表达能力比较欠缺而且在mr过程中会重复的读写hdfs,造成大量的io操作,多个job需要自己管理关系。 
spark的迭代计算都是在内存中进行的,API中提供了大量的RDD操作如joingroupby等,而且通过DAG图可以实现良好的容错。


问题八,RDD机制? 

rdd分布式弹性数据集,简单的理解成一种数据结构,是spark框架上的通用货币。 

所有算子都是基于rdd来执行的,不同的场景会有不同的rdd实现类,但是都可以进行互相转换。 

rdd执行过程中会形成dag然后形成lineage保证容错性等。 从物理的角度来看rdd存储的是blocknode之间的映射。


问题九,spark有哪些组件? 

1master:管理集群和节点,不参与计算。 

2worker:计算节点,进程本身不参与计算,和master汇报。 

3Driver:运行程序的main方法,创建spark context对象。 

4spark context:控制整个application的生命周期,包括dagshedulertask scheduler等组件。 

5client:用户提交程序的入口。


问题十,spark工作机制? 

用户在client端提交作业后,会由Driver运行main方法并创建spark context上下文。 

执行add算子,形成dag图输入dagscheduler,按照add之间的依赖关系划分stage输入task scheduler task scheduler会将stage划分为task set分发到各个节点的executor中执行。


问题十一,spark的优化怎么做? 

spark调优比较复杂,但是大体可以分为三个方面来进行,1)平台层面的调优:防止不必要的jar包分发,提高数据的本地性,选择高效的存储格式如parquet2)应用程序层面的调优:过滤操作符的优化降低过多小任务,降低单条记录的资源开销,处理数据倾斜,复用RDD进行缓存,作业并行化执行等等,3JVM层面的调优:设置合适的资源量,设置合理的JVM,启用高效的序列化方法如kyro,增大off head内存等等


问题十二,简要描述Spark分布式集群搭建的步骤

1)准备linux环境,设置集群搭建账号和用户组,设置ssh,关闭防火墙,关闭seLinux,配置hosthostname

2)配置jdk到环境变量
3)搭建hadoop集群,如果要做master ha,需要搭建zookeeper集群修改hdfs-site.xml,hadoop_env.sh,yarn-site.xml,slaves等配置文件
4)启动hadoop集群,启动前要格式化namenode
5)配置spark集群,修改spark-env.xmlslaves等配置文件,拷贝hadoop相关配置到spark conf目录下
6)启动spark集群。


文章转载自破晓的不止黎明,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论