Spark 在YARN上运行

在YARN上运行Spark

在0.6.0版中,Spark添加了对在YARN(Hadoop NextGen)上运行的支持,并在后续发行版中进行了改进。

安全

默认情况下,Spark中的安全性处于关闭状态。这可能意味着您默认情况下容易受到攻击。在运行Spark之前,请参阅Spark安全性和本文档中的特定安全性部分。

在YARN上启动Spark

确保HADOOP_CONF_DIRYARN_CONF_DIR指向包含Hadoop集群的(客户端)配置文件的目录。这些配置用于写入HDFS并连接到YARN ResourceManager。此目录中包含的配置将分发到YARN群集,以便应用程序使用的所有容器都使用相同的配置。如果配置引用不是由YARN管理的Java系统属性或环境变量,则还应该在Spark应用程序的配置(在客户端模式下运行时的驱动程序,执行程序和AM)中进行设置。

有两种部署模式可用于在YARN上启动Spark应用程序。在cluster模式下,Spark驱动程序在由YARN在群集上管理的应用程序主进程中运行,并且客户端可以在启动应用程序后消失。在client模式下,驱动程序在客户端进程中运行,而应用程序主控仅用于从YARN请求资源。

与Spark支持的其他集群管理器(在--master 参数中指定了主服务器的地址)不同,在YARN模式下,ResourceManager的地址是从Hadoop配置中提取的。因此,--master参数为yarn

要以cluster模式启动Spark应用程序:

$ ./bin/spark-submit --class path.to.your.Class --master yarn --deploy-mode cluster [options] <app jar> [app options]

例如:

$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \

    --master yarn \

    --deploy-mode cluster \

    --driver-memory 4g \

    --executor-memory 2g \

    --executor-cores 1 \

    --queue thequeue \

    examples/jars/spark-examples*.jar \

    10

上面启动了一个YARN客户端程序,该程序启动了默认的Application Master。然后,SparkPi将作为Application Master的子线程运行。客户端将定期轮询Application Master以获取状态更新,并将其显示在控制台中。应用程序完成运行后,客户端将退出。请参阅下面的“调试应用程序”部分,以了解如何查看驱动程序和执行程序日志。

要以client模式启动Spark应用程序,请执行相同的操作,但替换clusterclient。下面显示了如何spark-shellclient模式下运行:

$ ./bin/spark-shell --master yarn --deploy-mode client

添加其他JAR

cluster模式下,驱动程序与客户端运行在不同的计算机上,因此SparkContext.addJar对于客户端本地的文件而言,开箱即用。要使客户机上的文件可用于SparkContext.addJar,请将它们包含--jars在启动命令中的选项中。

$ ./bin/spark-submit --class my.main.Class \

    --master yarn \

    --deploy-mode cluster \

    --jars my-other-jar.jar,my-other-other-jar.jar \

    my-main-jar.jar \

    app_arg1 app_arg2

准备工作

在YARN上运行Spark需要使用YARN支持构建的Spark二进制分发版。二进制发行版可以从项目网站的下载页面下载。要自己构建Spark,请参阅构建Spark

要使YARN端可以访问Spark运行时jar,可以指定spark.yarn.archivespark.yarn.jars。有关详细信息,请参阅Spark属性。如果既未指定也spark.yarn.archivespark.yarn.jars指定,Spark将创建一个包含所有jar的zip文件,$SPARK_HOME/jars并将其上传到分布式缓存。

组态

YARN上的Spark的大多数配置与其他部署模式相同。有关这些的更多信息,请参见配置页面。这些是特定于YARN上Spark的配置。

调试您的应用程序

用YARN术语来说,执行者和应用程序主管在“容器”内部运行。在应用程序完成之后,YARN有两种处理容器日志的模式。如果启用了日志聚合(使用yarn.log-aggregation-enable配置),则将容器日志复制到HDFS并在本地计算机上删除。可以使用yarn logs命令从群集的任何位置查看这些日志。

yarn logs -applicationId <app ID>

将从给定应用程序的所有容器中打印出所有日志文件的内容。您还可以使用HDFS Shell或API在HDFS中直接查看容器日志文件。通过查看您的YARN配置(yarn.nodemanager.remote-app-log-diryarn.nodemanager.remote-app-log-dir-suffix)可以找到它们所在的目录。日志也可在Spark Web UI的“执行程序”选项卡下使用。您需要同时运行Spark历史记录服务器和MapReduce历史记录服务器并yarn.log.server.url进行yarn-site.xml正确配置。Spark历史记录服务器UI上的日志URL会将您重定向到MapReduce历史记录服务器以显示聚合的日志。

如果未启用日志聚合,则日志将在本地的每台计算机上本地保留YARN_APP_LOGS_DIR,通常配置为Hadoop的版本和安装,/tmp/logs$HADOOP_HOME/logs/userlogs取决于Hadoop的版本和安装。要查看容器的日志,需要转到包含它们的主机并在此目录中查找。子目录按应用程序ID和容器ID组织日志文件。日志也可以在Spark Web UI的“执行程序”选项卡下使用,并且不需要运行MapReduce历史记录服务器。

要查看每个容器的启动环境,请增加yarn.nodemanager.delete.debug-delay-sec一个较大的值(例如36000),然后yarn.nodemanager.local-dirs 在启动容器的节点上访问应用程序缓存。该目录包含启动脚本,JAR和用于启动每个容器的所有环境变量。该过程对于调试类路径问题特别有用。(请注意,启用此功能需要对群集设置具有管理员权限,并需要重新启动所有节点管理器。因此,这不适用于托管群集)。

要将自定义log4j配置用于应用程序主服务器或执行程序,请使用以下选项:

  • 通过将自定义添加到要随应用程序上传的文件列表中,log4j.properties使用来上传自定义。spark-submit--files
  • 添加-Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (对于驱动程序)或spark.executor.extraJavaOptions(对于执行程序)。请注意,如果使用文件,file:则应明确提供协议,并且文件必须在所有节点上本地存在。
  • 更新$SPARK_CONF_DIR/log4j.properties文件,它将与其他配置一起自动上传。请注意,如果指定了多个选项,则其他2个选项的优先级高于此选项。

请注意,对于第一种选择,执行器和应用程序主控器将共享相同的log4j配置,这可能在它们在同一节点上运行时引起问题(例如,尝试写入同一日志文件)。

如果您需要引用适当的位置以将日志文件放入YARN中,以便YARN可以正确显示和聚合它们,请spark.yarn.app.container.log.dir在中使用log4j.properties。例如,log4j.appender.file_appender.File=${spark.yarn.app.container.log.dir}/spark.log。对于流应用程序,RollingFileAppender将文件位置配置和设置到YARN的日志目录将避免由大日志文件引起的磁盘溢出,并且可以使用YARN的日志实用程序访问日志。

要将自定义metrics.properties用于应用程序主服务器和执行程序,请更新$SPARK_CONF_DIR/metrics.properties文件。它会自动以其他配置上传,因此您无需使用手动指定它--files

Spark特性

物业名称

默认

含义

spark.yarn.am.memory

512m

的存储器的量在客户机模式中使用用于纱线的应用万事达,在相同的格式JVM存储器串(例如512m2g)。在群集模式下,请spark.driver.memory改用。

使用小写字母后缀,例如kmgt,和p,为kibi-,mebi-,gibi-,tebi-和pebibytes,分别。

spark.yarn.am.cores

1

客户端模式下用于YARN Application Master的核心数。在群集模式下,请spark.driver.cores改用。

spark.yarn.am.waitTime

100s

仅在cluster模式下使用。YARN Application Master等待SparkContext初始化的时间。

spark.yarn.submit.file.replication

默认的HDFS复制(通常为3

上传到应用程序的HDFS中的文件的HDFS复制级别。其中包括Spark jar,app jar和任何分布式缓存文件/归档。

spark.yarn.stagingDir

文件系统中当前用户的主目录

提交应用程序时使用的登台目录。

spark.yarn.preserve.staging.files

false

设置为true在作业结束时保留暂存的文件(Spark jar,app jar,分布式缓存文件),而不是删除它们。

spark.yarn.scheduler.heartbeat.interval-ms

3000

Spark应用程序主设备心跳到YARN ResourceManager中的时间间隔(以毫秒为单位)。该值的上限为YARN配置值的一半(即) yarn.am.liveness-monitor.expiry-interval-ms

spark.yarn.scheduler.initial-allocation.interval

200ms

当存在挂起的容器分配请求时,Spark应用程序主服务器急切地向YARN ResourceManager发出心跳的初始时间间隔。不得大于 spark.yarn.scheduler.heartbeat.interval-ms。如果仍存在挂起的容器,spark.yarn.scheduler.heartbeat.interval-ms则分配间隔将在连续的紧急心跳中加倍,直到达到为止 。

spark.yarn.max.executor.failures

numExecutors * 2,最少3个

在使应用程序失败之前,执行程序失败的最大次数。

spark.yarn.historyServer.address

(没有)

Spark历史记录服务器的地址,例如host.com:18080。该地址不应包含方案(http://)。由于历史记录服务器是一项可选服务,因此默认情况下未设置。当Spark应用程序完成将应用程序从ResourceManager UI链接到Spark历史记录服务器UI时,此地址将提供给YARN ResourceManager。对于此属性,可以将YARN属性用作变量,并且在运行时将其替换为Spark。例如,如果Spark历史记录服务器与YARN ResourceManager在同一节点上运行,则可以将其设置为${hadoopconf-yarn.resourcemanager.hostname}:18080

spark.yarn.dist.archives

(没有)

以逗号分隔的存档列表,将其提取到每个执行程序的工作目录中。

spark.yarn.dist.files

(没有)

以逗号分隔的文件列表,将其放置在每个执行程序的工作目录中。

spark.yarn.dist.jars

(没有)

以逗号分隔的jar列表,​​将其放置在每个执行程序的工作目录中。

spark.yarn.dist.forceDownloadSchemes

(none)

以逗号分隔的方案列表,其资源将在添加到YARN的分布式缓存之前先下载到本地磁盘。适用于YARN服务不支持Spark支持的方案(如http,https和ftp)或本地YARN客户端的类路径中需要的jar的情况。表示通配符“ *”以下载所有方案的资源。

spark.executor.instances

2

静态分配的执行程序数。使用spark.dynamicAllocation.enabled,初始执行器集至少会这么大。

spark.yarn.am.memoryOverhead

AM内存* 0.10,最少384

与相同spark.driver.memoryOverhead,但用于客户端模式下的YARN Application Master。

spark.yarn.queue

default

提交应用程序的YARN队列的名称。

spark.yarn.jars

(没有)

包含要分发到YARN容器的Spark代码的库列表。默认情况下,YARN上的Spark将使用本地安装的Spark jar,但是Spark jar也可以位于HDFS上的世界可读位置。这使YARN可以将其缓存在节点上,因此不需要在每次运行应用程序时将其分发。例如,要指向HDFS上的jar,请将此配置设置为hdfs:///some/path。允许使用小球。

spark.yarn.archive

(没有)

包含所需的Spark jar的归档文件,用于分发到YARN缓存。如果设置,将替换此配置,spark.yarn.jars并且在所有应用程序容器中使用存档。归档文件应在其根目录中包含jar文件。与上一个选项一样,存档文件也可以托管在HDFS上,以加快文件分发速度。

spark.yarn.appMasterEnv.[EnvironmentVariableName]

(没有)

将指定的环境变量添加EnvironmentVariableName到在YARN上启动的Application Master进程中。用户可以指定多个,并设置多个环境变量。在cluster模式下,它控制Spark驱动程序的环境,在client模式下,它仅控制执行程序启动器的环境。

spark.yarn.containerLauncherMaxThreads

25

YARN Application Master中用于启动执行程序容器的最大线程数。

spark.yarn.am.extraJavaOptions

(没有)

在客户端模式下传递给YARN Application Master的一串额外的JVM选项。在群集模式下,请spark.driver.extraJavaOptions改用。请注意,使用此选项设置最大堆大小(-Xmx)设置是非法的。最大堆大小设置可以使用spark.yarn.am.memory

spark.yarn.am.extraLibraryPath

(没有)

设置在客户端模式下启动YARN Application Master时要使用的特殊库路径。

spark.yarn.maxAppAttempts

yarn.resourcemanager.am.max-attempts 在纱

提交申请的最大尝试次数。它不应大于YARN配置中的最大最大尝试次数。

spark.yarn.am.attemptFailuresValidityInterval

(没有)

定义AM故障跟踪的有效间隔。如果AM已经运行了至少已定义的时间间隔,则AM故障计数将被重置。如果未配置,则不会启用此功能。

spark.yarn.executor.failuresValidityInterval

(没有)

定义执行程序失败跟踪的有效间隔。超过有效间隔的执行器故障将被忽略。

spark.yarn.submit.waitAppCompletion

true

在YARN群集模式下,控制客户端是否等待退出直到应用程序完成。如果设置为true,则客户端进程将保持活动状态,报告应用程序的状态。否则,客户端进程将在提交后退出。

spark.yarn.am.nodeLabelExpression

(没有)

将调度限制节点AM集合的YARN节点标签表达式。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,将忽略此属性。

spark.yarn.executor.nodeLabelExpression

(没有)

将调度限制节点执行程序集的YARN节点标签表达式。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,将忽略此属性。

spark.yarn.tags

(没有)

将以逗号分隔的字符串列表作为YARN ApplicationReports中出现的YARN应用程序标签传递,可用于查询YARN应用程序时进行过滤。

spark.yarn.config.gatewayPath

(没有)

在网关主机(启动Spark应用程序的主机)上有效的路径,但对于集群中其他节点中相同资源的路径可能会有所不同。与结合使用 spark.yarn.config.replacementPath,它用于支持具有异构配置的集群,以便Spark可以正确启动远程进程。

替换路径通常将包含对YARN导出的某些环境变量的引用(因此对Spark容器可见)。

例如,如果网关节点在上安装了Hadoop库/disk1/hadoop,并且YARN将Hadoop安装的位置作为HADOOP_HOME 环境变量导出 ,则将该值设置为/disk1/hadoop,并将替换路径设置为, $HADOOP_HOME将确保用于启动远程进程的路径正确引用本地YARN配置。

spark.yarn.config.replacementPath

(没有)

请参阅spark.yarn.config.gatewayPath

spark.yarn.rolledLog.includePattern

(没有)

Java Regex过滤与定义的包含模式匹配的日志文件,这些日志文件将以滚动方式聚合。这将与YARN的滚动日志聚合一起使用,要在YARN端启用此功能, yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds应在yarn-site.xml中进行配置。此功能只能与Hadoop 2.6.4+一起使用。需要将Spark log4j附加程序更改为使用FileAppender或另一个附加程序,该附加程序可以在运行时处理要删除的文件。基于在log4j配置中配置的文件名(例如spark.log),用户应将正则表达式(spark *)设置为包括所有需要汇总的日志文件。

spark.yarn.rolledLog.excludePattern

(没有)

Java Regex用于过滤与定义的排除模式匹配的日志文件,并且这些日志文件不会以滚动方式聚合。如果日志文件名与包含和排除模式均匹配,则该文件最终将被排除。

spark.yarn.blacklist.executor.launch.blacklisting.enabled

启用对具有YARN资源分配问题的节点的黑名单的标记。可以通过配置黑名单的错误限制 spark.blacklist.application.maxFailedExecutorsPerNode

spark.yarn.metrics.namespace

(没有)

AM指标报告的根名称空间。如果未设置,则使用YARN应用程序ID。

重要笔记

  • 在调度决策中是否遵循核心请求取决于所使用的调度程序及其配置方式。
  • cluster模式下,Spark执行程序和Spark驱动程序使用的本地目录将是为YARN(Hadoop YARN config yarn.nodemanager.local-dirs)配置的本地目录。如果用户指定spark.local.dir,它将被忽略。在client模式下,Spark执行程序将使用为YARN配置的本地目录,而Spark驱动程序将使用中定义的本地目录spark.local.dir。这是因为Spark驱动程序不在YARN群集上以client模式运行,只有Spark执行程序运行。
  • --files--archives选项支持类似于Hadoop的该#指定文件名。例如,您可以指定:--files localtest.txt#appSees.txt并且这会将您本地命名的文件上载localtest.txt到HDFS,但这将通过name链接到appSees.txt,并且您的应用程序appSees.txt在YARN上运行时应使用该名称作为引用。
  • 如果您将其与本地文件一起使用并在模式下运行,则该--jars选项可使该SparkContext.addJar功能正常工作cluster。如果将它与HDFS,HTTP,HTTPS或FTP文件一起使用,则无需使用它。

的Kerberos

“ 安全性”页面涵盖了Spark中的标准Kerberos支持。

在YARN模式下,访问Hadoop文件系统时,Spark将自动获取以下内容的委托令牌:

  • 托管Spark应用程序登台目录的文件系统(如果spark.yarn.stagingDir未设置,则为默认文件系统);
  • 如果启用了Hadoop联合身份验证,则配置中的所有联合文件系统。

如果应用程序需要与其他安全的Hadoop文件系统进行交互,则需要在启动时将其URI明确提供给Spark。通过在spark.yarn.access.hadoopFileSystems属性中列出它们来完成此操作 ,如下面的配置部分所述。

YARN集成还使用Java服务机制来支持自定义委托令牌提供者(请参阅参考资料java.util.ServiceLoader)。org.apache.spark.deploy.yarn.security.ServiceCredentialProvider通过在jar的META-INF/services目录中相应文件中列出其名称,可以使Spark的实现 可用。通过将设置spark.security.credentials.{service}.enabled为 false,可以单独禁用这些提供程序,其中{service}凭证提供程序的名称。

YARN特定的Kerberos配置

物业名称

默认

含义

spark.yarn.keytab

(没有)

包含上面指定的主体的密钥表的文件的完整路径。该密钥表将通过YARN分布式缓存复制到运行YARN Application Master的节点,并将用于定期更新登录凭单和委托令牌。等效于--keytab命令行参数。
(也可以与“本地”母版一起使用。)

spark.yarn.principal

(没有)

在安全群集上运行时用于登录KDC的主体。等效于 --principal命令行参数。
(也可以与“本地”母版一起使用。)

spark.yarn.access.hadoopFileSystems

(没有)

您的Spark应用程序将要访问的安全Hadoop文件系统的列表,以逗号分隔。例如,spark.yarn.access.hadoopFileSystems=hdfs://nn1.com:8032,hdfs://nn2.com:8032, webhdfs://nn3.com:50070。Spark应用程序必须有权访问列出的文件系统,并且必须正确配置Kerberos才能访问它们(在同一领域或在受信任领域)。Spark为每个文件系统获取安全令牌,以便Spark应用程序可以访问那些远程Hadoop文件系统。

spark.yarn.kerberos.relogin.period

1m

多久检查一次是否应更新kerberos TGT。该值应设置为短于TGT更新周期(如果未启用TGT更新,则为TGT生存期)。对于大多数部署,默认值应该足够。

Kerberos故障排除

调试Hadoop / Kerberos问题可能很“困难”。一种有用的技术是通过设置HADOOP_JAAS_DEBUG 环境变量来在Hadoop中启用Kerberos操作的额外日志记录。

export HADOOP_JAAS_DEBUG=true

可以将JDK类配置为通过系统属性sun.security.krb5.debug 和属性来启用其Kerberos和SPNEGO / REST身份验证的额外日志记录sun.security.spnego.debug=true

-Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true

所有这些选项都可以在Application Master中启用:

spark.yarn.appMasterEnv.HADOOP_JAAS_DEBUG true

spark.yarn.am.extraJavaOptions -Dsun.security.krb5.debug=true -Dsun.security.spnego.debug=true

最后,如果将的日志级别org.apache.spark.deploy.yarn.Client设置为DEBUG,则该日志将包含所有获得的令牌的列表以及它们的有效期详细信息

配置外部随机播放服务

NodeManager在YARN群集中的每个群集上启动Spark Shuffle服务,请按照以下说明进行操作:

  1. 使用YARN配置文件构建Spark 。如果您使用预打包的发行版,请跳过此步骤。
  2. 找到spark-<version>-yarn-shuffle.jar$SPARK_HOME/common/network-yarn/target/scala-<version>如果您自己构建Spark,则应位于此目录下; 如果yarn使用发行版, 则应位于该目录下。
  3. 将此jar添加到NodeManager集群中所有的类路径。
  4. yarn-site.xml每个节点上,将添加spark_shuffleyarn.nodemanager.aux-services,然后设置yarn.nodemanager.aux-services.spark_shuffle.class为 org.apache.spark.network.yarn.YarnShuffleService
  5. NodeManager's通过设置YARN_HEAPSIZE(默认etc/hadoop/yarn-env.sh 为1000)来增加堆大小,以避免在随机播放期间出现垃圾回收问题。
  6. 重新启动NodeManager集群中的所有。

在YARN上运行随机播放服务时,可以使用以下附加配置选项:

物业名称

默认

含义

spark.yarn.shuffle.stopOnFailure

false

Spark Shuffle Service的初始化失败时是否停止NodeManager。这样可以防止由于未运行Spark Shuffle服务的NodeManager上运行容器而导致应用程序故障。

使用Apache Oozie启动您的应用程序

Apache Oozie可以在工作流程中启动Spark应用程序。在安全的群集中,启动的应用程序将需要相关令牌来访问群集的服务。如果使用密钥表启动Spark,则这是自动的。但是,如果要在没有密钥表的情况下启动Spark,则必须将设置安全性的职责移交给Oozie。

在特定发行版文档的“身份验证”部分的Oozie网站上可以找到为安全群集配置Oozie以及获取作业凭据的详细信息。

对于Spark应用程序,必须为Oozie设置Oozie工作流,以请求该应用程序需要的所有令牌,包括:

  • YARN资源管理器。
  • 本地Hadoop文件系统。
  • 任何用作I / O源或目标的远程Hadoop文件系统。
  • 蜂巢-如果使用的话。
  • HBase-如果使用的话。
  • YARN时间轴服务器(如果应用程序与此交互)。

为了避免Spark尝试(然后失败)获取Hive,HBase和远程HDFS令牌,必须将Spark配置设置为禁用服务的令牌收集。

Spark配置必须包括以下几行:

spark.security.credentials.hive.enabled   false

spark.security.credentials.hbase.enabled  false

spark.yarn.access.hadoopFileSystems必须取消配置选项。

使用Spark History Server替换Spark Web UI

禁用应用程序UI时,可以将Spark History Server应用程序页面用作运行应用程序的跟踪URL。在安全群集上或减少Spark驱动程序的内存使用量可能是理想的。要通过Spark History Server设置跟踪,请执行以下操作:

  • 在应用程序端,spark.yarn.historyServer.allowTracking=true在Spark的配置中进行设置。如果禁用了应用程序的UI,这将告诉Spark使用历史服务器的URL作为跟踪URL。
  • 在Spark History Server上,添加org.apache.spark.deploy.yarn.YarnProxyRedirectFilter 到spark.ui.filters配置中的过滤器列表。

请注意,历史记录服务器信息可能不是与应用程序状态有关的最新信息。

 

发布了377 篇原创文章 · 获赞 127 · 访问量 64万+

猜你喜欢

转载自blog.csdn.net/daqiang012/article/details/104125129