页面树结构

2017-11-09 ApacheCN 开源组织,第二期邀请成员活动,一起走的更远 : http://www.apachecn.org/member/209.html


MachineLearning 优酷地址 : http://i.youku.com/apachecn

转至元数据结尾
转至元数据起始

YARN 上运行 Spark 应用

当 Spark 运行在一个 YARN 群集管理器上时,资源管理,调度,和 安全 都由 YARN 控制。

继续阅读 : 

部署模式

在 YARN 中,每个应用实例有一个 ApplicationMaster 进程,这是用于启动应用的第一个 Container。该应用负责从 ResourceManager  请求资源,并且分配它们,指示 NodeManager 代表它去启动 Container。ApplicationMaster 消除了需要一个 active 客户端 - 启动应用的进程可以被终止,并且继续从一个运行在群集中被 YARN 管理的进程进行协调。

指定部署模式的选项,请看 spark-submit 选项

Cluster 部署模式

在 Cluster 模式中,Spark Driver 运行在群集主机上的 ApplicationMaster 中。在一个 YARN Container 中一个单独的进程负责驱动应用,兵从 YARN 上请求资源。启动应用程序的客户端并不需要为应用程序的生命周期运行。

Cluster 模式不适合用于 Spark 交互。需要输入的 Spark 应用,像 spark-shell 和 pyspark,需要 Spark driver 运行在启动 Spark 应用的 client 进程的内部。

Client 部署模式

在 Client 模式中,Spark Driver 运行在提交 Job 的主机上。ApplicationMaster 只负责从 YARN 中请求 executor container。在 container 启动后,该客户端与 container 进行通信以调度运转。

部署模式总结

 

模式YARN Client 模式YARN Cluster 模式
Driver runs inClientApplicationMaster
Requests resourcesApplicationMasterApplicationMaster
Starts executor processesYARN NodeManagerYARN NodeManager
Persistent servicesYARN ResourceManager 和 NodeManagersYARN ResourceManager 和 NodeManagers
Supports Spark ShellYesNo

配置环境

Spark 需要 HADOOP_CONF_DIR 和 YARN_CONF_DIR 环境变量指向群集中包含客户端的配置文件的目录。这些配置用于写入 HDFS 和连接 YARN ResourceManager。如果您使用 Cloudera Manager 部署,这些变量已经被自动配置了。如果您使用非托管的部署,确保您设置了在 运行 Spark On YARN 中描述的变量。

YARN 上运行一个 Spark Shell

为了在 YARN 上运行 spark-shell 或者 pyspark,在您启动应用时使用 --master yarn --deploy-mode client 标记。

如果您使用 Cloudera Manager 部署,这些属性已经被自动配置了。

提交 Spark 应用到 YARN

为了提交一个应用到 YARN 上,使用 spark-submit 脚本并且制定 --master yarn 标记。其它的 spark-submit 选项,请看 spark-submit 参数

监控以及调试 Spark 应用

为了获得关于 Spark 应用行为的信息,您可以查阅 YARN 日志和 Spark Web 应用 UI。这两个方法提供了补充的信息。如何去查看 Spark 应用创建的日志和 Spark Web 应用 UI,请看 监控 Spark 应用

例子 : YARN 上运行 SparkPi

这些例子演示了如何去使用 spark-submit 来提交各种选项的 SparkPi Spark 示例应用。在该例子中,JAR 后传递的参数控制了如何去关闭 pi 的近似值应该是。

在一个 CDH 部署中,在 package 安装中 SPARK_HOME 默认是 /usr/lib/spark,在 parcel 安装中 SPARK_HOME 默认是 /opt/cloudera/parcels/CDH/lib/spark。在一个 Cloudera Manager 的部署中,shell 命令可以从 /usr/bin 中获得。

在 YARN Cluster 模式中运行 SparkPi 

为了在 Cluster 模式中运行 SparkPi : 

  • CDH 5.2 以及更低版本 : 

    spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
    --deploy-mode cluster SPARK_HOME/examples/lib/spark-examples.jar 10
  • CDH 5.3 以及更高版本 : 

    spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
    --deploy-mode cluster SPARK_HOME/lib/spark-examples.jar 10

    直到 Job 的完成或者您按下 contrl-C 键,该命令会打印任务的状态。终止 Cluster 模式中的 spark-submit 进程不会像在 Client 模式中会终止 Spark 应用程序。为了监控正在运行的应用,运行 yarn application -list。

在 YARN Client 模式中运行 SparkPi 

为了在 Client 模式中运行 SparkPi : 

  • CDH 5.2 以及更低版本 : 

    spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
    --deploy-mode client SPARK_HOME/examples/lib/spark-examples.jar 10
  • CDH 5.3 以及更高版本 : 

    spark-submit --class org.apache.spark.examples.SparkPi --master yarn \
    --deploy-mode client SPARK_HOME/lib/spark-examples.jar 10

在 YARN Cluster 模式中运行 Python SparkPi 

  1. 解压 Python 例子档案文件 : 

    sudo su gunzip SPARK_HOME/lib/python.tar.gz
    sudo su tar xvf SPARK_HOME/lib/python.tar
  2. 运行 pi.py 文件 : 

    spark-submit --master yarn --deploy-mode cluster SPARK_HOME/lib/pi.py 10

配置 Spark On YARN 的应用

除了 spark-submit 选项 之外,用于在 YARN 上运行 Spark 应用的选项在 spark-submit On Yarn 选项 中列了出来。

spark-submit On YARN 选项

 

选项描述
archives

逗号分隔的档案列表用来抽取到每个 executor 的工作目录。该路径在您群集内部必须是全局可见的,请看 高级依赖管理

executor-cores

分配给每个 executor 的 core 的数量。或者,您可以使用 spark.executor.cores 属性。

executor-memory

分配给每个 executor 的最大堆大小。或者,您可以使用 spark.executor.memory 属性。

num-executors

分配给这个应用的总共的 YARN container 数量。或者,您可以使用 spark.executor.instances 属性。

queue用来提交的 YARN 队列。更多信息请参考  Assigning Applications and Queries to Resource Pools

默认 : default。

在初始化安装时,Cloudera Manager 根据您群集的环境优化了一些属性。除了命令行的选项之外,下列的属性也是可用的 : 

属性描述
spark.yarn.driver.memoryOverhead

额外的非堆内存数量,它能够从 YARN 的每个 driver 请求。与 saprk.driver.memory 相结合,这是 YARN 可以用来为 driver 进程创建一个 JVM 的总的内存。

spark.yarn.executor.memoryOverhead

额外的非堆内存数量,它能够从 YARN 中的每个 executor 进程请求。与 saprk.executor.memory 相结合。这是 YARN 可以用来为 executor 进程创建一个 JVM 的总的内存。

动态分配

动态分配允许 Spark 基于工作量来动态的扩展分配到您的应用的群集资源。当启用动态分配并且 Spark 应用有积压的挂起的任,它能够请求 executor。当应用变得空闲时,它的 executor 会释放资源并且能够被其它的应用获得。

从 CDH 5.5 开始,动态分配默认是启用的。动态分配属性 描述了如何去控制动态分配。

在运行一个 Spark 应用时如果您设置 spark.dynamicAllocation.enabled 为 false 或者使用 --num-executors 命令行参数或者设置 spark.executor.instances 属性,动态分配将被禁用。更多关于动态分配工作的信息,请看 资源分配策略

当启用 Spark 动态资源分配时,所有资源分配给第一个提交的可用的 Job,这会造成后续的应用排队。为了允许应用并行的获取资源,分配资源到 Pool 并且在这些 Pool 中运行应用以及使得应用可以优先运行在 Pool 中,请看 动态资源池

如果您使用 Spark Streaming,请看 Spark Streaming 与 动态分配 中的推荐部分。

动态分配属性

 

PropertyDescription
spark.dynamicAllocation.executorIdleTimeout

executor 在它被删除之前闲置的时间。

默认 : 60 s。

spark.dynamicAllocation.enabled是否启用动态分配。

默认 : true。

spark.dynamicAllocation.initialExecutors

在启用动态分配时为 Spark 应用初始化 executor 的数量。

Default: 1.

spark.dynamicAllocation.minExecutors

executor 的最小值。

默认 : 0。

spark.dynamicAllocation.maxExecutorsexecutor 的最大值。

默认 : Integer.MAX_VALUE。

spark.dynamicAllocation.schedulerBacklogTimeout

在新的 executor 被请求之前等待的任务必须被积压的时间。

默认 : 1 s。

 

 

在非托管的 CDH 部署中优化 YARN 模式

在 CDH 部署中不是由 Cloudera Manager 托管的,您每次运行 spark-submit 时 Spark 复制 Spark assembly JAR 文件到 HDFS。通过以下步骤您可以避免这个复制 : 

  • 设置 spark.yarn-jar 为本地的 assembly JAR :local:/usr/lib/spark/lib/spark-assembly.jar 路径。
  • 上传 JAR 并配置 JAR 位置 : 
    1. 手动上传 Spark assembly JAR 文件到 HDFS : 

      $ hdfs dfs -mkdir -p /user/spark/share/lib
      $ hdfs dfs -put SPARK_HOME/assembly/lib/spark-assembly_*.jar /user/spark/share/lib/spark-assembly.jar
    2. 设置 spark.yarn.jar 为 HDFS 路径 : 

      spark.yarn.jar=hdfs://namenode:8020/user/spark/share/lib/spark-assembly.jar