SparkBase

SparkBase_第1张图片

  • Spark是【大规模数据分析的统一引擎】

  • Spark从数据的输入到结果的输出之间的所有数据结构都是基于【RDD】的。

  • SparkBase_第2张图片

    Spark4大特点

    • 1-【速度快】

    • 面试题为什么Spark比MapReduce快?

    • 1-【MapReduce的中间数据是基于hdfs磁盘的多次读写,而Spark的中间数据是基于内存的,内存被磁盘快。】

      2-【MapReduce的最小的计算单元task是以进程形式存在的,而Spark的最小计算单元是以线程形式存在的,线程的启动和销毁比进程快。】

      3-Spark基于将job划分成DAG,在DAG内部将多个计算合并成pipeline通道,进行合并计算,节省时间。

    • 2-【容易使用】

    • SparkBase_第3张图片

       上图只用一行代码就能搞定从数据的加载-->到分析-->到输出。

    • 3-【通用性强】

    • SparkBase_第4张图片

       一站式搞定大数据所有场景。

    • 4-【运行方式多样】

    • 可以运行在多种资源管理器上比如【Hadoop的Yarn】,【kubernetes简称k8s】,【mesos】,【spark自身携带的standalone】。
    • 可以加载读取几乎所有的数据源比如【MySQL】,【HDFS】,【hive】。。。
  • 小结:速度快,易用,通用,随处运行。
  • Spark的组件

    SparkBase_第5张图片

【了解】Spark的底层通信框架

  • spark1.6前,用【akka】

  • spark2以后,完全用【netty】

【掌握】测试2-使用spark-submit命令计算圆周率。

/export/server/spark/bin/spark-submit --master local[*]  /export/server/spark/examples/src/main/python/pi.py 10           

【掌握】测试3-运行pyspark命令

启动pyspark命令,能正常进入交互界面即可。

/export/server/spark/bin/pyspark --master local[*]

简单案例:读取文本文件/etc/profile,用spark计算行数。

 rdd = sc.textFile('file:///etc/profile')
 rdd.count()

SparkBase_第6张图片

Spark On Yarn

SparkBase_第7张图片

 SparkBase_第8张图片

SparkBase_第9张图片

Spark on Yarn的本质

SparkBase_第10张图片

  • 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等程序)

      当然还要一些配置

  • 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

SparkBase_第11张图片

 客户端【是】打印了结果值

可以在YARN8088页面上看到运行记录

SparkBase_第12张图片

cluster 模式

  • Driver 在【(yarn)集群的某台空闲的机器】运行

  • SparkBase_第13张图片

 注意APPMaster和Driver【合为一体】了。

${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页面中查看。

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,负载均衡。

 SparkBase_第14张图片

Spark的命令参数

公共参数

  • --master :Spark使用什么资源管理器来分配【core】和【内存】资源,后面可以跟【local】 ,【yarn】,【(已废弃) spark://node1:7077】等,企业中用的最多的是【yarn】

  • --deploy-mode :只有【2】个值,【client】和【cluster】,区别是【Driver】进程运行在哪里

  • --name :给Spark程序起一个名字,后期可以在WEBUI(默认端口是【4040】)页面上看到

  • 【了解,不用记】--class 包名.类名 需要跟上xx.jar:固定用法,需要配合spark-submit使用的,意思是提交jar包中的类的main方法程序。

    • 比如

        SPARK_HOME=/export/server/spark
        ${SPARK_HOME}/bin/spark-submit \
        --master local[*] \
        --class org.apache.spark.examples.SparkPi \
        ${SPARK_HOME}/examples/jars/spark-examples_2.12-3.1.2.jar \
        10

SparkBase_第15张图片

  • Driver进程相关参数:

    • --driver-memory 申请【Driver】进程的【内存】有大多。

    • 【用的很少】--driver-cores :仅当是以--deploy-mode 是【cluster】时才有意义。表示【Driver】进程申请几个【core】

  • Executor进程相关参数

    • Executor启动后,一直运行到死结束,不会频繁创建销毁。里面的线程会频繁的启动和销毁。

    • 通常说的Executor指的就是CoarseGrainedExecutorBackend

      CoarseGrainedSchedulerBackend存在于Driver端

      CoarseGrainedExecutorBackend就是Executor端

    • 【仅了解】--total-executor-cores :仅当用Spark 的【standalone】方式才有意义,表示所有的executor一共申请多少个【核数】

    • --executor-cores :当Spark on 【yarn】 时有意义,表示每个executor进程申请几个【core】。yarn默认是1个。企业中一般指定为【3-5】个,通常是【4】.

    • --num-executors :仅当是【yarn】时才有意义,表示一共申请多少个【Executor】。

    • --executor-memory 申请的【executor】的【内存】有多大。Executor进程中的一个core一般可以支配3-5G的内存,如果是3G,executor-memory 最好设为executor-cores*3 ,比如12G

    • 【仅了解】--queue 就是用来隔离CPU和内存资源的。每个队列中都包含了指定容量的CPU和内存

你可能感兴趣的:(大数据)