spark集群版原理

Spark和其他大数据框架一样,计算都需要使用资源(【core】+【内存】#core就是cpu中的几核几线程的线程数

  • 1、如果只有一台服务器,那么就是使用【1台机器】的资源,一般用来做【小数据量】的测试,称之为local运行方式。

  • 2、企业中使用服务器集群。

    • 【资源管理器】:统筹各台机器有多少资源(有多少空闲的core和内存),统称为Cluster Manager(资源管理器),有很多框架,其中最出名的是yarn。

    • Spark程序不负责统筹资源,因为职责太繁重,Spark只委托上面的第三方Cluster Manager(资源管理器)来给自己提供资源。

    • 我们编写并启动一个Spark应用程序,他需要集群的资源来跑,经常需要占用几百个CPU,几百G的内存,他找【资源管理器】申请资源。【资源管理器】手握集群资源大池子(比如数千个CPU,数T内存),spark程序向他讨一口水喝。

    • 上图是2套东西叠加在一起的,一套是【资源管理器集群】,就像酒店,另一套是【Spark的运行时架构】,就像客人。客人来一波走一波,酒店一直在那儿。

      • 【资源管理器集群】。

  - 它启动后作为常驻服务,管理集群的所有【core 】+【内存 】资源。等待其他应用比如Spark应用,向自己申请资源。

  - 上图Cluster Manager和Worker Node都是【抽象】泛称。

  - 上图有多种具体实现,比如有【yarn】或【spark自身携带的standalone】。

  - 如果具体是yarn,那么上图的抽象概念,具体就是

    - ![](https://img2022.cnblogs.com/blog/2991602/202210/2991602-20221019144855178-170351528.png)

    - hadoop包含了一套资源管理器【yarn】,这个也是企业中Spark用的最多的方式,这一套称为Spark On Yarn方式。此时的Cluster Manager就是【ResourceManager】。WorkerNode就是【NodeManager】。

    - > yarn除了分配CPU内存资源给spark用,还可以分配给sqoop,hive,flink等用。

  - 【仅了解,企业不用】如果具体是standalone,那么上图的抽象概念,具体就是

    - ![](https://img2022.cnblogs.com/blog/2991602/202210/2991602-20221019144919844-677204632.png)

    - 【仅了解,企业不用】Spark自带了一套资源管理器服务进程,这一套称为**standalone运行方式**,此时的cluster Manager就是【Master】进程,workerNode就是【Worker】进程。企业通常不用Spark自带的资源管理器。

- 另一套是【spark运行时架构】。

  - ![](https://img2022.cnblogs.com/blog/2991602/202210/2991602-20221019144936579-143359342.png)

  - 【Spark应用】向【资源管理器的主节点】申请资源,来启动【Spark运行时架构】。

  - 其中【Executor进程】都要运行在有资源的机器上。

  - 【Spark运行时架构】需要依托在【申请到的资源】上跑。

  - 一个Spark程序执行完就退出,上面的运行时架构会【==销毁==】。剩下资源管理器集群继续等待其他应用来申请资源。

【重点】Spark On Yarn

快速了解Spark On Yarn的大致过程:

Spark on Yarn的本质

  • Spark On Yarn需要啥?

    • 1.需要Yarn集群:已经安装了,就是上图的集群B

    • 2.需要某台机器用来提交spark程序,比如上图的机器A,它安装了spark,依靠的是它的bin/目录下的spark-submit等命令。

    • 机器A既可以是集群B外的机器,也可以就是集群B中的某台。企业中有钱一般是前者方式。我们课程阶段穷用后者方式,比如我们用node1当做机器A。

    • 3.机器A上要有被提交的pyspark程序:如自己开发的wordcount.py

    • 4.上一步的wordcount程序会将大作业拆分成多子任务,分发到集群B的各机器上运行。则集群B的各机器需要具备【Spark环境】和【python环境】。

    • 5.上面说的【Spark环境】就是spark安装包/jars/目录下的200多个jar包

    • 满足【spark环境】有重量级方式,和轻量级方式。

    • 重量级方式就是每台机器都安装spark,不推荐。

    • 轻量级方式是将spark环境的所有jar包放在HDFS目录,让需要的节点自行去找它即可,推荐。

    • 6.上面第4点的【python环境】,需要集群每台机器都安装python3解释器。所以我们每台机器安装anaconda3。

  • 总结

    • SparkOnYarn

      不需要集群每台都安装Spark

      只需要:Yarn集群+单机版Spark(里面有提交命令,wordcount.py等程序)

      当然还要一些配置

配置过程(略)

测试yarn的client和cluster两种模式

  • Spark客户端命令有比如【spark-shell、spark-sql、pyspark、spark-submit】
  • 他们是用来提交Spark应用程序的,
  • 他们都支持集群模式(也就是Spark应用跑在yarn等资源管理集群上)
  • 企业通常使用spark on yarn资源管理集群
  • 后面我们说的【spark集群方式】,默认就是【spark on yarn集群方式】。
  • 当指定用集群方式时,需要配合指定–deploy-mode参数,表示【Driver运行在哪里】。
    • 当指定为local方式时,–deploy-mode参数是没有意义的,以为local方式就一台机器。
  • –deploy-mode参数只有2个值,一个是【client】模式,一个是【cluster】模式。
  • Client和Cluster模式最本质的区别是:
    • 1-client时,Driver程序运行在【当前提交spark应用的机器】上
    • 2-cluster时,Driver程序运行在【集群中随机的空闲一个nodemanager】上。

client 模式

  • Driver 在【当前提交spark应用的机器】运行

  • 如果不指定–deploy-mode,则它默认是【client】

  • 计算圆周率-默认是client模式

    • SPARK_HOME=/export/server/spark
      ${SPARK_HOME}/bin/spark-submit \
      --master yarn \
      --deploy-mode client \
      --driver-memory 512m \
      --executor-memory 512m \
      --executor-cores 1 \
      --num-executors 2 \
      --queue default \
      --conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
      --conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
      ${SPARK_HOME}/examples/src/main/python/pi.py \
      10
      
      
    • 客户端【是】打印了结果值

  • 调度执行过程

cluster 模式

  • Driver 在【集群中随机的空闲一个nodemanager】运行

  • 注意:cluster 模式下,APPMaster和Driver【合为一体】了。

  • 计算圆周率-cluster模式

    • ${SPARK_HOME}/bin/spark-submit \
      --master yarn \
      --deploy-mode cluster \
      --driver-memory 512m \
      --executor-memory 512m \
      --executor-cores 1 \
      --num-executors 2 \
      --queue default \
      --conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
      --conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
      ${SPARK_HOME}/examples/src/main/python/pi.py \
      10
      
      
    • 客户端【没有】打印圆周率的值,需要去YARN的8088页面跳转到19888页面中查看。

    • 以为,最后的数据都返回到driver中,而cluster模式下,driver进程不在写代码的那台客户端下面,显然,不可能打印出来嘛,要打印也是在driver机器上打印

yarn的client和cluster两种模式比较

Cluster和Client模式最最本质的区别是:Driver程序运行在哪里。

  • client模式:开发自测时使用

    • 当程序跑起来时,Driver运行在【提交程序的节点】中
    • 应用程序运行结果【会】在客户端显示,方便查看结果。
  • cluster模式:生产环境中使用该模式

    • Driver程序在【某台随机空闲的NodeManager节点上】
    • Spark应用的运行结果【不会】在客户端client显示,稍微不方便,
    • Driver与各Executor间的通信性能【更好】。

灵魂三问:

  • 为什么Spark On Yarn 时通过ApplicationMaster去向ResourceManager申请启动Executors,而不是通过Driver去干这些事情?
    • 因为在Yarn集群模式中,Spark应用需要向ResourceManager申请NodeManager的资源用于启动Executor,这个职责可以让ApplicationMaster去做,而不是让Driver去做,可以让Driver更轻松,达到解耦的目的。
  • 为什么用yarn-client方式可以在提交的机器上看到打印的结果,但是用yarn-cluster看不到,需要去yarn的历史日志才能看到?
    • 因为用yarn-client方式,Driver进程就是启动在Client上,打印的结果显示在Client机器上。但是用yarn-cluster运行Spark程序时,Driver是某台随机的NodeManager,它就算打印了,也不会显示在当前的提交机器上,但是yarn的历史日志服务,会收集所有yarn节点的日志,所以可以在yarn的历史日志页面(yarn的node1:8088页面,点击logs,再跳转19888端口页面)中查看到程序的结果。
  • 为什么企业中都使用yarn-cluster模式?
    • 1、因为这种方式,使得Driver向Executor们的通信都在同一个集群的网段中(一个机房内的服务器都在一个网段),通信效率高。而反之yarn-client模式的Driver在提交的网段,Executor们在yarn集群的网段,2个网段可能不一样,通信效率低。
    • 2、一般在企业中提交的机器就那么1-2台,如果大家都在同一台机器上用client模式运行各自的Spark应用,那么会造成所有的Driver进程都启动在这台机器上,造成这台机器的负担很重,造成所有的任务都受到影响。而随机的空闲的WorkerNode分散了各个Driver,负载均衡。

Spark应用架构

  • 【扩展】python进程和java进程概念 java程序跑起来=java进程=jvm进程

  • 下图的每个Driver或Executor,都是上面右边的jvm结构。

  • Spark应用架构就是Spark运行时架构。

  • 只有Spark应用跑起来才有应用架构,如果程序退出,则消失。

  • 运行中会有【4040】页面,运行完4040页面退出,只能去【18080】页面看历史。

    • 【了解】如果是on yarn则4040会自动跳转到8088/proxy代理页面。
  • 举例:

  • 从图中可以看到一个Spark Application运行到集群上时,由两部分组成:【一个Driver进程】和【多个Executor进程】。

    1、Driver

    • 是一个JVM Process,它运行程序的MAIN函数,必须创建SparkContext上下文对象;
    • 一个SparkApplication仅有【1】个driver;
    • Driver将大的需求作业拆分成小的任务task,将task发送给executor

    2、Executors

    • 是一个个JVM 进程,一个JVM 进程相当于一个线程池,其中有很多线程,一个 Core 一次只运行1个线程 ,1个线程只运行【1】个Task任务,所以Executor中线程数就等于Core核数;
    • 一个Spark Application可以有【多】个Executor;
    • 它的功能是执行具体任务

    3、Driver会将任务task发送给Executor执行。

【了解】Driver中如何将job拆分成task的过程

原文地址:http://www.cnblogs.com/nanguyhz/p/16806266.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性