从Spark架构中透视Job(DT大数据梦工厂)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从Spark架构中透视Job(DT大数据梦工厂)相关的知识,希望对你有一定的参考价值。
内容:
1、通过案例观察Spark架构;
2、手动绘制Spark内部架构;
3、Spark Job的逻辑视图解析;
4、Spark Job的物理视图解析;
Action触发的Job或者checkpoint触发Job
==========通过案例观察Spark架构 ============
jps看到的master,作用:管理集群的计算资源,主要指内存、CPU,也会考虑磁盘或者网络;还做接受客户端提交的作业请求,分配资源。说明:作业粗粒度,提交的时候就分配资源,作业运行的过程时候,一般用已分配的资源,除非运行过程发生异常。
Worker进程,主要负责当前节点每寸和CPU的资源使用。
Spark是主从分布式的。
启动spark-shell
./spark-shell --master spark://Master:7077,Worker1:7077,Worker2:7077
再刷新web控制台
为什么是24个cores,每个节点的内存1024M呢?
spark-env.sh里面有配置
[email protected]:/usr/local/spark/spark-1.6.0-bin-hadoop2.6/conf# cat spark-env.sh
export JAVA_HOME=/usr/java/jdk1.8.0_71
export SCALA_HOME=/usr/local/scala-2.10.4
export HADOOP_HOME=/usr/local/hadoop-2.6.0
export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.0/etc/hadoop
#export SPARK_MASTER_IP=Master
export SPARK_WORKER_MEMORY=2g
export SPARK_EXCUTOR_MEMORY=2g
export SPARK_DRIVER_MEMORY=2g
export SPARK_WORKER_CORES=8
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=Master:2181,Worker1:2181,Worker2:2181 -Dspark.deploy.zookeeper.dir=/spark"
启动spark-shell分配了资源了吗?
当然分配了,standalone的模式是粗粒度分配资源的。
spark-shell默认情况下没有任何的job,此时stage等都没有,但是还是会分配资源的。
但是executors是存在的:
和下面的图也能对应起来:
一个Worker上默认一个executor,也可以多个executor,如果只有一个executor的时候CPU利用率不高,则可以配置多个。
无论Spark有多少作业,都是在注册的时候分配的资源。默认资源的分配方式,在每个Worker上为当前程序分配一个executorbackend,且默认情况下会最大化的使用cores和memory。如果不加限制,Spark一旦运行,直接把资源占满,这个时候就需要yarn或者mesos等资源管理器。
task运行在executor上面:
一次能运行多少个并发的task,取决于当前的executor能够使用的cores的数量。
sc.textFile("/historyserverforSpark/README.md", 3).flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_,1).cache
并行度也是继承的
sc.textFile("/historyserverforSpark/README.md", 3).flatMap(_.split(" ")).map(word=>(word,1)).reduceByKey(_+_).sortByKey().cache
3个并行作业被继承了。
==========手动绘制Spark内部架构 ============
Master、Driver、Worker、Executor
/usr/local/spark/spark-1.6.0-bin-hadoop2.6/bin/spark-submit --class com.dt.spark.SparkApps.cores.WordCount_Cluster --master spark://Master:7077 /root/Documents/SparkApps/SparkAppsInJava.jar
提交作业,即drvier是由spark-submit来提交的
E xecutor里面的线程 是否关心运行啥代码?线程只是计算资源,所以由于线程不关心具体Task中运行什么代码,所以Task和Thread是解耦合的。所以Thread是可以被复用的。
具体运行什么,通过Runner的接口来运行封装的代码的。
当集群启动的时候,首先启动master进程,负责整个集群资源的管理和分配,并接收作业的提交,且为作业分配计算资源。即每个工作节点,默认情况下都会启动一个Worker Process来管理当前节点的memory、CPU等计算资源。并且向master汇报Worker还能够正常工作。
当用户作业提交给Master时,Master会为程序分配ID并分配计算资源,默认情况下为当前应用程序在每个Process分配一个GoarseGrainedExecutorBackend进程,该进程默认情况下会最大化的使用当前节点上的内存和CPU。
每个线程可以被复用执行多个task
每个appication都包含一个driver和多个executors,每个executor里面运行的多个
==========Spark Job的逻辑视图解析 ============
整个集群是master和worker节点,是master-slave结构
worker是worknode上的守护节点,worker节点上有work process
work process会为接收master的指令,为当前要运行的应用程序分配GoarseGrainedExecutorBackend进程
worker process会不会管理计算资源?不会。worker process 知识走一趟形式,看上去是它管理的资源,但是真正管理资源的是master!!!master管理每台机器上的计算资源的。
Drvier里面有main方法,有SparkContext。。。
数据在stage内部是流过去的。一个stage里面有多个transformation
==========Spark Job的物理视图解析 ============
上图中,stage5是stage6的mapper。stage6是stage5的reducer.
Spark是一个更加精致和更加高效的Map Reduce思想的具体实现。
最后一个stage里面的task是result task类型,前面的所有stage中的task的类型都是shuffleMapTask类型的
stage里面的内容一定是在executor中执行的。
而且stage必须是从前往后执行。
Spark的一个应用程序,可以为不同的Action产生众多的Job,每个Job至少有一个Stage
本讲课程的重要作用:巩固前面的重要内容,且开启下面Spark的密码之旅。
王家林老师名片:
中国Spark第一人
新浪微博:http://weibo.com/ilovepains
微信公众号:DT_Spark
博客:http://blog.sina.com.cn/ilovepains
手机:18610086859
QQ:1740415547
本文出自 “一枝花傲寒” 博客,谢绝转载!
以上是关于从Spark架构中透视Job(DT大数据梦工厂)的主要内容,如果未能解决你的问题,请参考以下文章
Spark Runtime(DriverMassterWorkerExecutor)内幕解密(DT大数据梦工厂)