Spark笔记05 - 部署

  • Understanding Cluster
  • Deploying to a Cluster
  • Spark Submit Job

Understanding Cluster

在运行Spark时,有两种模式,一种是Local,一种是Cluster。顾名思义,前者是单点的,后者是集群的。对于不同的模式,在写代码的时候还是有区别的。

  1. Print RDD

如果调用如下方法,那么是在各个的executor上打印出结果,而不是在driver上打印出所有的结果:

rdd.foreach(println) 

rdd.map(println)

如果想要显示所有结果,需要用collect()

rdd.collect().foreach(println)

上述方法有个缺陷是太耗时了,所以如果只是为了看下数据的话可以使用采样方法take()只看一部分:

rdd.take(100).foreach(println)
  1. Accumulator

再举一例,想要统计data的总和,运用如下代码实现。但需要注意的一点是,这里的counter是“局部”变量,而不是“全局”变量,每个executor上都有一个counter,最终需要再reduce求和。

var counter = 0
var rdd = sc.parallelize(data)

// Wrong: Don't do this!!
rdd.foreach(x => counter += x)

println("Counter value: " + counter)

如果不reduce可以吗?也可以,这里就需要用到Spark自带的Accumulator,相当于是全局变量。

总结:在写代码的时候,一定要时刻想着,如果跑在Cluster上行不行?因为有些时候Local能跑,Cluater不一定能跑。而Cluster能跑,Local一定能跑。

Deploying to a Cluster

首先,需要打好包上传到服务器上。如果是Scala/Java,就是jar;如果是Python,那就是zip或者egg。

然后,需要在服务器上运行对应命令启动。举例如下:

# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://207.184.161.138:7077 \
  --executor-memory 20G \
  --total-executor-cores 100 \
  /path/to/examples.jar \
  1000

其中,很两个很重要的参数

  • --master <master-url>: The master URL for the cluster
  • --deploy-mode <deploy-mode>: Whether to deploy your driver on the worker nodes (cluster) or locally as an external client (client) (default: client)

为了方便理解,需要重新缕一缕Spark中master、worker、executor和driver的关系。

master和worker节点

  • master节点常驻master守护进程,负责调度和worker节点通信。
  • worker节点常驻worker守护进程,负责管理executor进程。

一台机器可以同时作为master和worker节点。比如三台机器,A是master+worker,BC是worker。

driver和executor进程

  • driver进程
    • 负责启动main()函数并且构建sparkContext对象。
    • 并向集群管理者(master)申请spark应用所需的资源,也就是executor。
    • 然后将应用拆分为多个stage,并创建对应tasks。
    • 然后将各个任务分配到executor中执行。
    • 最后再将结果汇总起来。
  • executor进程
    • 负责执行task,并返回结果给driver。

Driver可以起在master节点上,也可以起在worker节点上,由deploy-mode决定,如下:

client_mode中,Driver起在提交request的worker上

spark_client_mode

cluster_mode中,Driver起在master上

spark_cluster_mode

由此,也带来一个区别

  • cluster mode,适用于生产环境,因为便于横向扩展,当需要时,可以多起几个worker,然后快速提交计算需求,如果中途断开也不要紧。但是有一个坏处是看log不方便。
  • client mode适用于开发环境,因为driver,executor一体,便于看log。不过需要注意的是提交了request不能中途断开,否则就无法得到计算结果。

至于YARN,MESOS,其实是把driver和executor包装起来放在一个框架中,自身扮演了master的角色,负责居中调度。

下面是各种deploy模式的参数介绍:

Spark Standalone

spark_cluster_standalone

Mesos (Apache)

spark_cluster_masos

Yarn (Hadoop)

spark_cluster_yarn

Spark Submit Job

Spark submit 在 Server 端的提交任务示例:

./bin/spark-submit 
    --class org.apache.spark.examples.SparkPi \ #  应用程序的主类
    --master yarn \                             # master 的地址,提交任务到哪里执行,如:spark://host:port,  yarn,  local
    --deploy-mode cluster \                     # 在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client
    --driver-memory 4g \                        # Driver内存,默认 1G
    --executor-memory 2g \                      # 每个 executor 的内存,默认是1G
    --executor-cores 1 \                        # Executor的cpu core的数量
    --queue my_queue \                          # 运行在YARN的哪个队列上
    --num-executors 3 \                         # Executor的数量 
    examples/jars/spark-examples*.jar \         # 需要依赖的包
    10

Reference

posted @ 2020-08-18 13:43  MaxStack  阅读(44)  评论(0编辑  收藏  举报