spark点滴

~spark的核心是把数据源抽象为分布式对象RDD,分布在各个计算节点的内存中。本地计算+内存+集群计算使得spark效率比较高。

~对于用户来说RDD自带各种算子,使得编写分布式程序和本地程序一样,而spark通过把RDD的算子转换成各个实际工作的task,并把task的序列化为class字节码,从而能在各个计算节点反序列化,加载并运行。

~,每个新的action操作都会使整个RDD重新计算,可以使用缓存解决。

~.sc.textFile()时,数据并没有读取进来,和转换操作一样,读取数据操作也有可能会被多次读取,这个是浪费内存的

~,RDD由分布在不同节点上的partition组成,partition是最小单位,每个分区上运行一个task, spark程序可以通过分区控制数据分布,以获得最少的网路传输。尽量使计算和数据在同一个节点,以此来提升性能。

~,如果两个RDD进行关联操作,可以先将大的RDD进行分区和持久化,使得小的RDD数据传输到大的RDD所在的分区,节省了网路传输。像reduceByKey,groupByKey等都会进行分区。控制好能提升性能。

~,累加器是讲工作节点中的值聚合到驱动器程序中的简单语法。

~,RDD闭包内的变量是会copy到每个Task中,但是广播变量只会copy至每个节点。如果变量数据量很大,则广播变量能提升性能。

~,基于分区对数据进行操作,可以避免为每个数据元素进行重复的配置工作,如数据库连接等。

~,yarn-client模式,客户端启动后直接运行用户程序,启动Driver相关的工作,driver向ClusterMaster注册,clusterMaster启动executor,另外driver充当AppMaster角色,即在客户端将RDD的一系列操作转换成DAG图,DAG图提交给DAGScheduler解析成一个个Stage,每个Stage由多个Task组成。然后把Task发送给个Executor执行。

~,yarn-cluster模式,客户端启动后提交app给ClusterMaster, clustMaster在一个executor启动driver,执行RDD为一系列task,分发至各executor执行。

~,spark基于yarn框架执行,spark的clustermaster即resourcemanager, spark的driver功能即yarn的AppMaster功能。spark的executor即yarn的container

~,窄依赖的RDD操作会在一个 stage内。

~,hadoop的configuration会广播至各个node节点上。

~,stage之间是依次执行的,不能并行

~,每个Spark应用可以有多个action操作,每个action操作触发一个job,每个job由多个stage组成,stage的划分是从触发的job的Rdd开始的(也就job的最后一个RDD),遇到宽依赖即确定宽依赖之后的RDD为一个stage,因此每一个stage结尾都是一个宽依赖,每个stage内的rdd操作由相同的Task执行,Task有两类,一类是ShuffleMapTask,用来处理stage内的所有操作直到宽依赖的shuffle过程,另一个Task类型是ResultTask,是最后一个stage的Task,因为他要负责此job的最终结果计算,并汇报给driver.

~,checkpoint机制实际上是将RDD的所有依赖计算的结果存入CheckPointRDD中,以此来替换依赖的rdd,下次计算时直接取checkpointrdd的分区数据就行。

猜你喜欢

转载自qgl.iteye.com/blog/2311337