-
Spark是【大规模数据分析的统一引擎】
-
Spark从数据的输入到结果的输出之间的所有数据结构都是基于【RDD】的。
-
Spark4大特点
-
1-【速度快】
-
面试题为什么Spark比MapReduce快?
-
1-【MapReduce的中间数据是基于hdfs磁盘的多次读写,而Spark的中间数据是基于内存的,内存被磁盘快。】
2-【MapReduce的最小的计算单元task是以进程形式存在的,而Spark的最小计算单元是以线程形式存在的,线程的启动和销毁比进程快。】
3-Spark基于将job划分成DAG,在DAG内部将多个计算合并成pipeline通道,进行合并计算,节省时间。
-
2-【容易使用】
-
上图只用一行代码就能搞定从数据的加载-->到分析-->到输出。
-
3-【通用性强】
-
一站式搞定大数据所有场景。
-
4-【运行方式多样】
- 可以运行在多种资源管理器上比如【Hadoop的Yarn】,【kubernetes简称k8s】,【mesos】,【spark自身携带的standalone】。
- 可以加载读取几乎所有的数据源比如【MySQL】,【HDFS】,【hive】。。。
-
- 小结:速度快,易用,通用,随处运行。
-
Spark的组件
【了解】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()
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等程序)
当然还要一些配置
-
-
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
客户端【是】打印了结果值
可以在YARN8088页面上看到运行记录
cluster 模式
-
Driver 在【(yarn)集群的某台空闲的机器】运行
注意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,负载均衡。
-
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
-
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和内存
-