Spark从入门到精通第八课:细致分析Spark on Yarn 模式

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pengzonglu7292/article/details/79517051
1、spark on yarn
两种模式:
    client模式(测试)
    cluster模式(生产常用)
    
区别:
    client模式的driver是运行在客户端。
    cluster模式的driver运行在NodeManager的MRApplicationMaster中。


2、client模式
启动:
    spark-submit --master yarn
    spark-submit --master yarn-client
    spark-submit --master yarn --deploy-mode client


执行流程:
    1、创建sparkContext对象时,客户端先在本地启动driver,然后客户端向ResourceManager节点申请启
        动应用程序的ApplicationMaster。
    2、ResourceManager收到请求,找到满足资源条件要求的NodeManager启动第一个Container,然
        后要求该NodeManager在Container内启动ApplicationMaster。
    3、ApplicationMaster启动成功则向ResourceManager申请资源,ResourceManager收到请求给
        ApplicationMaster返回一批满足资源条件的NodeManager列表。
    4、Applicatio拿到NodeManager列表则到这些节点启动container,并在container内启动executor,executor启动成功则会向driver注册自己。
    5、executor注册成功,则driver发送task到executor,一个executor可以运行一个或多个task。
    6、executor接收到task,首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提交给TaskScheduler。
    7、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
    8、driver会监控所有task执行的整个流程,并将执行完的结果回收。
 
弊端:
    由于client模式下driver运行在客户端,当应用程序很多且driver和worker有大量通信的时候,
        会急剧增加driver和executor之间的网络IO。
    并且大量的dirver的运行会对客户端的资源造成巨大的压力。


3、cluster模式
启动:
    spark-submit --master yarn-cluster
    spark-submit --master yarn --deploy-mode cluster
  
执行流程:
    1、创建sparkContext对象时,客户端向ResourceManager节点申请启动应用程序的
        ApplicationMaster。
    2、ResourceManager收到请求,找到满足资源条件要求的NodeManager启动第一个Container,然
        后要求该NodeManager在Container内启动ApplicationMaster。
    3、ApplicationMaster启动成功则向ResourceManager申请资源,ResourceManager收到请求给
        ApplicationMaster返回一批满足资源条件的NodeManager列表。
    4、Applicatio拿到NodeManager列表则到这些节点启动container,并在container内启动executor,executor启动成功则会向driver注册自己。
    5、executor注册成功,则driver发送task到executor,一个executor可以运行一个或多个task。
    6、executor接收到task,首先DAGScheduler按RDD的宽窄依赖关系切割job划分stage,然后将stage以TaskSet的方式提交给TaskScheduler。
    7、TaskScheduler遍历TaskSet将一个个task发送到executor的线程池中执行。
    8、driver会监控所有task执行的整个流程,并将执行完的结果回收。


    cluster模式下driver分散运行在集群节点,有效避免了client的问题。生产用的就是cluster模式。

4、参数

/opt/apps/spark-1.5.1-hadoop2.4/bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \        #作业类名
    --master yarn-clinet \                       #spark模式
    --driver-memory 4g \                    #每一个driver的内存
    --num-executors 1 \
    --executor-memory 2g \                    #每一个executor的内存
    --executor-cores 1 \                        #每一个executor占用的core数量
    --queue thequeue \                            #作业执行的队列
    /opt/apps/spark-1.5.1-hadoop2.4/lib/spark-examples-1.5.1-hadoop2.4.0.jar \            #jar包
    100                                               #传入类中所需要的参数





注:
    提交作业时spark会将lib下的spark-assembly*.jar包分发到yarn的am container中,这十分耗费资源。
    故而我们可以将该jar包放在一个yarn可以访问到的目录中,具体做法如下:
        vi spark-default.conf  
             spark.yarn.jars  hdfs://Linux001:8020/somepath/spark-assembly*.jar
        然后将jar包上传至hdfs://Linux001/somepath/即可。

    这是一个调优点哦

5、spark on yarn的个性化启动
    /spark-shell --master yarn --jars mysql驱动包绝对路径
    简化1:省去--jars
        vi spark-defaults.conf  
            spark.executor.extraClassPath  mysql驱动包绝对路径
            spark.driver.extraClassPath  mysql驱动包绝对路径
        当某个jar包或类找不到的时候,可以参考这一点
    简化2:省去--master
        vi spark-defaults.conf
            #spark.master local[3]  取消注释 local[3]  改为yarn


注意:
    这种对于spark-defaults.conf的修改,会作用于其他spark模式,容易产生问题,怎么办?

解决:
    拷贝spark-defaults.conf.template,制作自己的个性化配置文件
    启动时添加:
        --properties-file ${配置文件}  即可


6、重要的属性
spark.port.maxRetries
    同时运行的最大作业数目,默认16,肯定不够,建议调大

spark.yarn.maxAppAttempts 
    作业最大重试次数,它不应该大于yarn配置中设置的全局最大重试数。默认是等于的。

 

展开阅读全文

没有更多推荐了,返回首页