运维开发网

spark基础知识介绍

运维开发网 https://www.qedev.com 2020-04-22 20:42 出处:网络 作者:运维开发网整理
数据本地性 数据计算尽可能在数据所在的节点上运行,这样可以减少数据在网络上的传输,毕竟移动计算比移动数据代价小很多。进一步看,数据如果在运行节点的内存中,就能够进一步减少磁盘的I/O的传输。在spark中,数据本地性优先级从高到低为PROCESS_LOCAL>NODE_LOCAL>NO_PREF>RACK_LOACL>ANY即最好是运行在节点内存中的数据,次要是同一个NODE,再次是同机架,最后是

数据本地性

数据计算尽可能在数据所在的节点上运行,这样可以减少数据在网络上的传输,毕竟移动计算比移动数据代价小很多。进一步看,数据如果在运行节点的内存中,就能够进一步减少磁盘的I/O的传输。在spark中,数据本地性优先级从高到低为PROCESS_LOCAL>NODE_LOCAL>NO_PREF>RACK_LOACL>ANY即最好是运行在节点内存中的数据,次要是同一个NODE,再次是同机架,最后是任意位置。

       PROCESS_LOCAL   进程本地化:task要计算的数据在同一个Executor中

  NODE_LOCAL    节点本地化:速度比 PROCESS_LOCAL 稍慢,因为数据需要在不同进程之间传递或从文件中读取

  NODE_PREF    没有最佳位置这一说,数据从哪里访问都一样快,不需要位置优先。比如说SparkSQL读取MySql中的数据

  RACK_LOCAL 机架本地化,数据在同一机架的不同节点上。需要通过网络传输数据及文件 IO,比 NODE_LOCAL 慢

  ANY   跨机架,数据在非同一机架的网络上,速度最慢

延迟执行

在任务分配到运行节点时,先判断任务最佳运行节点是否空闲,如果该节点没有足够的资源运行该任务,在这种情况下任务会等待一定的时间;如果在等待的时间内该节点释放出足够的资源,则任务在该节点运行,如果还是不足会找出次佳节点进行运行。通过这样的方式进行能让任务运行在更高级别的数据本地性节点,从而减少磁盘I/O和网络传输。一般情况下只对PROCESS_LOCAL和NODE_LOCAL两个数据本地性优先级进行等待,系统默认延迟时间为3S;

spark任务分配的原则是让任务运行在数据本地性优先级别更高的节点上,甚至可以为此等待一定的时间。该任务分派过程是由TaskSchedulerImpI.resourceOffers方法实现,该方法先对应用程序获取的资源进行混洗,以使任务能够更加均衡的分散在集群中运行,然后对任务集对应的TaskSetManager根据设置的调度算法进行排序,最后对TaskSetManager中的任务按照数据本地性分配任务运行节点,分配时先根据任务集的本地性从优先级高到低分配任务,在分配过程中动态判断集群中节点的运行情况,通过延迟执行等待数据本地性更高的节点运行。


High Available(HA)

Master异常

Master作为spark独立运行模式的核心,如果Master出现异常,则整个集群的运行状况和资源都无法进行管理,整个集群就处于群龙无首的状况,spark在设计的时候就考虑到了这个情况,在集群运行的时候,Master将启动一个或者多个Standy Master,当Master出现异常的时候,Standy Master将根据一定的规则确定其中一个接管Master。在独立运行模式中,spark支持如下几种策略,可以在配置文件spark-env.sh配置项spark.deploy.recoveryMode进行设置,默认为None.

①ZOOKEEPER:集群的元数据持久化到ZooKeeper中,当Master出现异常时,Zookeeper会通过选举机制选举出新的Master,新的Master接管时需要从Zookeeper获取持久化信息并根据这些信息回复集群状态

②FILESYSTMEM:集群的元数据持久化到本地文件系统中,当Master出现异常时,只要在该机器上重新启动Master,启动后新的Master获取持久化信息并根据这些信息恢复集群状态。

③CUSTOM:自定义恢复方式,对StandaloneRecoveryModeFactory抽象类进行实现并把该类配置到系统中,当Master出现异常时,会根据用户自定义方式恢复集群状态

④NONE:不持久化集群的元数据,当master出现异常时,启动新的Master不进行恢复集群状态,而是直接接管集群

 

 如何配置spark master的HA

1.配置zookeeper,下载SPARK并解压

2.配置spark-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_101

export HADOOP_HOME=/root/hadoop/hadoop-2.7.4

export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop

export SCALA_HOME=/root/scala/scala-2.11.8

export HIVE_HOME=/root/hive/apache-hive-2.1.1

export LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib:$LIB_NATIVE_DIR"

export SPARK_CLASSPATH=$SPARK_HOME/mysql-connector-java-5.1.39.jar

export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=spark1:2181,spark2:2181,spark3:2181,spark4:2181 -Dspark.deploy.zookeeper.dir=/spark"

说明: -Dspark.deploy.recoveryMode=ZOOKEEPER    #说明整个集群状态是通过zookeeper来维护的,整个集群状态的恢复也是通过zookeeper来维护的。就是说用zookeeper做了spark的HA配置,Master(Active)挂掉的话,Master(standby)要想变成Master(Active)的话,Master(Standby)就要像zookeeper读取整个集群状态信息,然后进行恢复所有Worker和Driver的状态信息,和所有的Application状态信息; -Dspark.deploy.zookeeper.url=spark1:2181,spark2:2181,spark3:2181,spark4:2181#将所有配置了zookeeper,并且在这台机器上有可能做master(Active)的机器都配置进来;

-Dspark.deploy.zookeeper.dir=/spark -Dspark.deploy.zookeeper.dir是保存spark的元数据,保存了spark的作业运行状态; zookeeper会保存spark集群的所有的状态信息,包括所有的Workers信息,所有的Applactions信息,所有的Driver信息,如果集群

a.在Master切换的过程中,因为程序在运行之前,已经申请过资源了,driver和Executors通讯,不需要和master进行通讯的,所有的已经在运行的程序皆正常运行!因为Spark Application在运行前就已经通过Cluster Manager获得了计算资源,所以在运行时Job本身的调度和处理和Master是没有任何关系的!

b. 在Master的切换过程中唯一的影响是不能提交新的Job:一方面不能够提交新的应用程序给集群,因为只有Active Master才能接受新的程序的提交请求;另外一方面,已经运行的程序中也不能够因为Action操作触发新的Job的提交请求;

3.复制slaves.template成slaves,配置如下:

spark1

spark2

spark3

spark4

4.将配置好安装包分发给其他节点

5.各个节点配置环境变量,并使之生效

6.启动zookeeper

 所有节点均要执行zkServer.sh start

7.启动hdfs集群

 任意一个节点执行即可

8.启动spark集群

   在一个节点启动start-all.sh,其他节点启动start-master.sh

driver的功能

1.一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点;

2.功能:负责向集群申请资源,向master注册信息,负责了作业的调度,负责作业的解析、生成Stage并调度Task到Executor上。包括DAGScheduler,TaskScheduler。

 spark的部署模式

本地模式   运行在一个机器上,可以多线程执行,默认启动和CPU核数一样的线程,此模式主要用于本地调试测试

伪分布模式 一台机器上模拟集群运行,master,worker,sparkcontext这些进程都在一台机器上

独立运行模式  spark自身实现的资源调度框架,由客户端,master节点,worker节点组成,sparkcontext可以运行在本地客户端,也可以运行在master节点上,spark-shell的spark-shell在master节点上运行,使用spark-submit提交的或者IDEA等平台开发的,sparkcontext运行在本机客户端。资源管理和任务监控是Spark自己监控,这个模式也是其他模式的基础

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

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

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

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

0

精彩评论

暂无评论...
验证码 换一张
取 消