zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js常用框架原理
    移动端input解决键盘问题 方案1
    jq大体架构。先记录再慢慢剖析
    把图片存储 canvas原生API转成base64
    清除浮动的6中方法
    window.location.hash属性介绍
    前端性能优化之js,css调用优化
    数组中的对象,判断是否有重复值、
    [Python] Pitfalls: Be Careful with os.chdir
    Changing the Color of Linux ls Command 改变Linux的ls命令显示的颜色
  • 原文地址:https://www.cnblogs.com/maxstack/p/14944138.html
Copyright © 2011-2022 走看看