Spark运行

本文详细介绍了Spark在Standalone模式下的client和cluster两种提交模式,包括各自的特点和运行流程。此外,还回顾了Hadoop YARN的基本设计思想、组成及运行流程,并讲解了Spark如何在YARN上运行,包括client和cluster模式的配置与区别。重点强调了在实际工作中提交Spark任务时通常使用cluster模式,而Spark shell和Spark SQL交互式命令行则需使用client模式。
摘要由CSDN通过智能技术生成

1 Spark StandAlone 的执行模式

1.1 client模式

Spark stand alone提交到集群中,默认的模式为client模式,默认参数是 --deploy-mode client 

例如:

/opt/apps/spark-2.3.3-bin-hadoop2.7/bin/spark-submit --master spark://node-1.51doit.cn:7077 --class cn._51doit.spark.day01.WordCount --deploy-mode client /root/spark10-1.0-SNAPSHOT.jar hdfs://node-1.51doit.cn:9000/wc hdfs://node-1.51doit.cn:9000/out01

特点:Driver是在SparkSubmit进程中   

Master跟Worker之间的通信的端口号是7077, RPC通信.

  

1.2 cluster模式

在Spark的stand alone集群中,提交spark任务时,可以使用cluster模式即--deploy-mode cluster

例如:

/bigdata/spark-2.3.3-bin-hadoop2.7/bin/spark-submit --master spark://node-1.51doit.cn:7077 --class cn._51doit.spark.day01.WordCount --deploy-mode client hdfs://node-1.51doit.cn:9000/jars/spark10-1.0-SNAPSHOT.jar hdfs://node-1.51doit.cn:9000/wc hdfs://node-1.51doit.cn:9000/out002

特点:Driver运行在集群中,不在SparkSubmit进程中,需要将jar包上传到hdfs中,让所有的worker都可以共用

   在cluster模式中Sparksubmit只是将任务的描述信息,给了Master,Master再跟一个Worker建立连接,启动一个DriverWapper,

跟Master通信启动Executor,Executor跟DriverWapper反向注册,DriverWapper构建DAG,切分Stage,生成Task,分发给Executor.

client模式和cluster模式的本质区别是Driver运行在哪里!

注意: Spark shell 和 Spark SQL的交互式命令行,必须使用client模式.

 

2. Hadoop YARN回顾

  2.1 Yarn的基本设计思想

将Hadoop 1.0中JobTracker拆分成两个独立的服务,一个全局的资源管理器ResourceManager(RM)和每个应用独有的ApplicationMaster(AM).其中RM负责整个系统的资源管理和分配,而AM负责单个的应用程序的管理 

  2.2 Yarn的基本组成

  1. ResourceManager(RM)

全局的资源管理器,负责整个系统的资源管理和分配,由调度器(ResourceScheduler)和应用管理器(Applications Master ,ASM)组成

  • 调度器(ResourceScheduler)

调度器根据容量,队列等限制条件,将系统中的资源分配给各个正在运行的应用程序.调度器不参与任何应用程序的具体工作,仅根据应用程序的资源需求进行资源分配.调度器是个可拔插的组件,用户可根据自己的需要设计新的调度器.

  • 应用程序管理器(ASM)

应用程序管理器负责整个系统中所有应用程序,包括应用程序的提交,与调度器协商资源以启动ApplicationMaster(AM),监控AM运行状态并在失败时重启它

    2.ApplicationMaster(AM)

用户提交的每个应用程序均包含一个AM,主要功能包括:

  • 1).与RM调度器协商以获取资源
  • 2).将得到的资源进一步分配给内部的任务
  • 3).与NodeManager(NM)通信,以启动\停止任务
  • 4).监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务 

 3.NodeManager(NM)

NM是每个节点上的资源和任务管理器.一方面,它会定时的向RM汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它接收并处理来自AM的Container启动\停止等请求Container

2.3 Yarn的运行流程 

 

  1. 用户向YARN提交应用程序
  2. RM(其中的调度器)为该应用程序分配第一个Container,(ASM)与对应的NM通信,要求它在这个Container中启动应用程序的AM
  3. AM首先向RM(其中的ASM)注册,这样用户可以直接通过RM查看应用程序的运行状况,然后AM会为各个任务申请资源,并监控任务的运行状态直至任务完成,运行结束.在任务未完成时,4-7步是会循环运行的
  4. AM采用轮询的方式通过RPC协议向RM(其中的调度器)申请和领取资源
  5. AM申请到资源后与对应NM通信,要求启动任务
  6. NM为任务设置好运行环境后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务.
  7. 各个任务通过RPC协议向AM汇报自己的状态和进度,让AM随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务,在应用程序运行过程中,用户可随时通过RPC向AM查询应用程序的当前状况
  8. 应用程序运行完成后,AM向RM注销并关闭自己

3. Spark On Yarn

3.1 配置hadoop

     (1)需要在/etc/profile中配置HADOOP_CONF_DIR的目录,目的是为了让Spark找到core-site.xml、hdfs-site.xml和yarn-site.xml【让spark知道NameNode、ResourceManager】,不然会包如下错误:Exception in thread "main" java.lang.Exception: When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

修改/etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_192

export HADOOP_CONF_DIR=/bigdata/hadoop-2.7.7/etc/hadoop/

(2)关闭内存资源检测

    修改yarn-sit.xml

<property>

<name>yarn.nodemanager.pmem-check-enabled</name>

<value>false</value>

</property>

<property>

<name>yarn.nodemanager.vmem-check-enabled</name>

<value>false</value>

</property>

参数说明: 

yarn.nodemanager.pmem-check-enabled

是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true 

yarn.nodemanager.vmem-check-enabled

是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true

      (3)配置一个yarn的container可以使用多个vcores,因为capacity schedule使用的是DefaultResourceCalculator,那么DefaultResourceCalculator它在加载Container时其实仅仅只会考虑内存而不考虑vcores,默认vcore就是1。yarn 默认情况下,只根据内存调度资源,所以 spark on yarn 运行的时候,即使通过--executor-cores 指定 core 个数为 N,但是在 yarn 的资源管理页面上看到使用的 vcore 个数还是 1

修改capacity-scheduler.xml

<property>

    <name>yarn.scheduler.capacity.resource-calculator</name>

    <!--

      <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value>

    -->

    <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>

</property>

    (4)重新分发到yarn中的各个节点:

for i in 2 3; do scp capacity-scheduler.xml yarn-site.xml node-$i.51doit.cn:$PWD ; done

然后,启动hdfs和yarn集群。注意:要保证yarn集群的各个节点的时间是同步的。否则回报错

 

3.2 client模式

/bigdata/spark-2.3.3-bin-hadoop2.7/bin/spark-submit --master yarn --deploy-mode client --executor-memory 1g --executor-cores 2 --num-executors 3 --class cn._51doit.spark.day01.WordCount /root/spark10-1.0-SNAPSHOT.jar hdfs://node-1.51doit.cn:9000/wc hdfs://node-1.51doit.cn:9000/out01

  1. 客户端提交一个Application,在客户端启动一个Driver进程。
  2. Driver进程会向ResourceManager发送请求,启动ApplicationMaster的资源。
  3. ResourceManager收到请求,随机选择一台NodeManager,然后该NodeManager到HDFS下载jar包和配置,接着启动ApplicationMaster【ExecutorLuacher】。这里的NodeManager相当于Standalone中的Worker节点。
  4. ApplicationMaster启动后,会向ResourceManager请求一批container资源,用于启动Executor.
  5. ResourceManager会找到一批符合条件NodeManager返回给ApplicationMaster,用于启动Executor。
  6. ApplicationMaster会向NodeManager发送请求,NodeManager到HDFS下载jar包和配置,然后启动Executor。
  7. Executor启动后,会反向注册给Driver,Driver发送task到Executor,执行情况和结果返回给Driver端

Yarn-cluster和Yarn-client区别就是Yarn-cluster的driver是在集群节点中随机选取启动,Yarn-client的driver端是在任务提交的客户端找中启动。

注意:工作中提交spark任务一般都使用cluster模式,但是spark-shell、spark-sql必须采用client

 

3.3 cluster模式

/bigdata/spark-2.3.3-bin-hadoop2.7/bin/spark-submit --master yarn --deploy-mode cluster --executor-memory 1g --executor-cores 2 --num-executors 3 --class cn._51doit.spark.day01.WordCount /root/spark10-1.0-SNAPSHOT.jar hdfs://node-1.51doit.cn:9000/wc hdfs://node-1.51doit.cn:9000/out01

 

3.4 资源分配

YARN中可以虚拟VCORE,虚拟cpu核数,以后部署在物理机上,建议配置YARN的VCORES的使用等于物理机的逻辑核数,即物理机的核数和VCORES是一一对应的

在YARN中为spark分配任务,spark的cores跟逻辑核数一一对应,另一个逻辑和对应一个VCORE,一个VCORES对应一个spark cores【官方建议spark的cores是逻辑核的2到3倍】

yarn中的资源分配,针对的是容器, 容器默认最少的资源是1024mb,  容器接受的资源,必须是最小资源的整数倍。

spark中分配的资源由两部分组成,参数 + overhead,例如 --executor-memory 1g,overhead为   

max(1024 * 0.1, 384),executor真正占用的资源应该是:1g + 384mb = 1408Mb

在yarn中,分配的资源最终都是分配给容器的1408 向上取整,例如--executor-memory 2g那么最终的内存为:2048 + Max(2048*0.1, 384)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值