Spark记录-实例和运行在Yarn

#运行实例

#./bin/run-example SparkPi 10  

#./bin/spark-shell --master local[2]

#./bin/pyspark --master local[2]

#./bin/spark-submit examples/src/main/python/pi.py 10

#./bin/sparkR --master local[2]

#./bin/spark-submit examples/src/main/r/dataframe.R

#./bin/spark-shell ---scala

#./bin/pyspark   ---python

#参考http://spark.apache.org/docs/latest/running-on-yarn.html

#$ ./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 \ lib/spark-examples*.jar \ 10

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

#$ ./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运行时JAR,你可以指定spark.yarn.archivespark.yarn.jars。有关详细信息,请参阅Spark属性。如果两者都spark.yarn.archive没有spark.yarn.jars指定,Spark将创建一个包含所有jar文件的zip文件,$SPARK_HOME/jars并将其上传到分布式缓存。

调试您的应用程序

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

yarn logs -applicationId <app ID>

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

当日志聚合未打开时,日志将保留在每台计算机上的本地YARN_APP_LOGS_DIR,通常配置为/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配置,这可能会导致在同一节点上运行时(例如尝试写入同一个日志文件)出现问题。

如果您需要正确的位置的参考,把纱线日志文件,使纱线可正确显示和汇总它们,使用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 用于客户端模式下的YARN Application Master的内存量,格式与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被初始化的时间。client模式中,YARN Application Master等待驱动程序连接的时间。
spark.yarn.submit.file.replication 默认的HDFS复制(通常3 HDFS上传到应用程序的文件的HDFS复制级别。这些包括Spark jar,应用程序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地址不应该包含scheme(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.executor.instances 2 静态分配的执行者数量。与此同时spark.dynamicAllocation.enabled,最初的执行者将至少是这个大。
spark.yarn.executor.memoryOverhead executorMemory * 0.10,至少384 每个执行程序分配的堆内存量(以兆字节为单位)。这是内存,占VM的开销,interned字符串,其他本地开销等东西。这往往随着执行器的大小(通常6-10%)增长。
spark.yarn.driver.memoryOverhead 驱动器内存* 0.10,最低384 群集模式下每个驱动程序分配的堆外存储器数量(以兆字节为单位)。这是内存,占VM的开销,interned字符串,其他本地开销等东西。这往往随着容器的大小(通常6-10%)。
spark.yarn.am.memoryOverhead AM存储器* 0.10,最小值为384 spark.yarn.driver.memoryOverhead客户端模式下的YARN Application Master 相同
spark.yarn.am.port (随机) YARN应用程序掌握端口。在YARN客户端模式下,用于在网关上运行的Spark驱动程序与在YARN上运行的YARN Application Master之间进行通信。在YARN集群模式下,它用于动态执行程序功能,在此处理来自调度程序后端的终止操作。
spark.yarn.queue default 提交应用程序的YARN队列的名称。
spark.yarn.jars (没有) 包含要分发到YARN容器的Spark代码的库的列表。默认情况下,YARN上的Spark将使用本地安装的Spark Jars,但Spark Jars也可以位于HDFS上全球可读的位置。这允许YARN将其缓存在节点上,以便每次应用程序运行时不需要分发它。例如,要指向HDFS上的jar,将此配置设置为hdfs:///some/pathGlobs是允许的。
spark.yarn.archive (没有) 包含需要分发到YARN缓存的所需Spark jar的存档。如果设置,则此配置将替换,spark.yarn.jars并且该存档将用于所有应用程序的容器中。归档文件应该在其根目录中包含jar文件。和前面的选项一样,存档也可以托管在HDFS上以加速文件分发。
spark.yarn.access.hadoopFileSystems (没有) Spark应用程序要访问的安全Hadoop文件系统的逗号分隔列表。例如spark.yarn.access.hadoopFileSystems=hdfs://nn1.com:8032,hdfs://nn2.com:8032, webhdfs://nn3.com:50070Spark应用程序必须能够访问列出的文件系统,并且必须正确配置Kerberos以便能够访问它们(在相同领域或在可信领域)。Spark为每个文件系统获取安全令牌,以便Spark应用程序可以访问这些远程Hadoop文件系统。spark.yarn.access.namenodes 已弃用,请使用此代替。
spark.yarn.appMasterEnv.[EnvironmentVariableName] (没有) 将指定的环境变量添加EnvironmentVariableName到在YARN上启动的应用程序主进程。用户可以指定其中的多个并设置多个环境变量。cluster模式中,它控制着Spark驱动程序的环境,在client模式中它只控制执行程序启动器的环境。
spark.yarn.containerLauncherMaxThreads 25 YARN Application Master中用于启动执行程序容器的最大线程数。
spark.yarn.am.extraJavaOptions (没有) 一系列额外的JVM选项,以客户端模式传递给YARN Application Master。在集群模式下,spark.driver.extraJavaOptions改为使用请注意,使用此选项设置最大堆大小(-Xmx)设置是非法的。最大堆大小设置可以使用spark.yarn.am.memory
spark.yarn.am.extraLibraryPath (没有) 在客户端模式下启动YARN Application Master时,设置一个特殊的库路径。
spark.yarn.maxAppAttempts yarn.resourcemanager.am.max-attempts 在YARN 提交申请的最大次数。它应该不大于YARN配置中的全局最大尝试次数。
spark.yarn.am.attemptFailuresValidityInterval (没有) 定义AM故障跟踪的有效时间间隔。如果AM至少在定义的时间间隔内运行,则AM故障计数将被重置。如果未配置,则此功能未启用。
spark.yarn.executor.failuresValidityInterval (没有) 定义执行器故障跟踪的有效时间间隔。超过有效期间的执行程序故障将被忽略。
spark.yarn.submit.waitAppCompletion true 在YARN群集模式下,控制客户端是否等待退出,直到应用程序完成。如果设置为true,则客户端进程将保持活动状态,报告应用程序的状态。否则,客户端进程将在提交后退出。
spark.yarn.am.nodeLabelExpression (没有) 一个YARN节点标签表达式将限制节点AM的设置。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,该属性将被忽略。
spark.yarn.executor.nodeLabelExpression (没有) 一个YARN节点标签表达式将限制节点执行者集合的安排。只有大于或等于2.6的YARN版本才支持节点标签表达式,因此在针对早期版本运行时,该属性将被忽略。
spark.yarn.tags (没有) 以逗号分隔的字符串列表作为YARN ApplicationReports中出现的YARN应用程序标签传递,可用于在查询YARN应用程序时进行过滤。
spark.yarn.keytab (没有) 包含上面指定的主体的keytab文件的完整路径。此密钥表将通过安全分布式缓存复制到运行YARN应用程序主控的节点,以定期更新登录票据和委托令牌。(也与“当地”大师合作)
spark.yarn.principal (没有) 在安全的HDFS上运行时使用Principal来登录到KDC。(也与“当地”大师合作)
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.security.credentials.${service}.enabled true 控制在启用安全性时是否获取服务凭据。默认情况下,在配置这些服务时检索所有受支持服务的凭证,但如果与正在运行的应用程序有冲突,则可以禁用该行为。有关更多详细信息,请参阅[在安全群集中运行](运行在yarn.html#运行在安全群集中)
spark.yarn.rolledLog.includePattern (没有) Java正则表达式筛选与定义的包含模式和这些日志文件相匹配的日志文件将以滚动方式聚合。这将与YARN的滚动日志聚合一起使用,为了使YARN端的这个特性yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds能够在yarn-site.xml中配置。此功能只能用于Hadoop 2.6.4+。Spark log4j appender需要更改为使用FileAppender或另一个可以处理正在运行的文件的appender。根据在log4j配置中配置的文件名(如spark.log),用户应该设置正则表达式(spark *)以包含所有需要聚合的日志文件。
spark.yarn.rolledLog.excludePattern (没有) Java正则表达式来过滤与定义的排除模式相匹配的日志文件,这些日志文件不会以滚动方式聚合。如果日志文件名称与包含和排除模式都匹配,则最终将排除该文件。

重要笔记

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

在安全集群中运行

正如安全性所述,Kerberos用于安全的Hadoop集群,以对与服务和客户端关联的主体进行身份验证。这允许客户提出这些认证服务的请求; 向经认证的校长授予权利的服务。

Hadoop服务发布hadoop令牌来授予对服务和数据的访问权限。客户必须首先获取他们将访问的服务的标记,并将其与在YARN集群中启动的应用程序一起传递。

对于Spark应用程序来与任何Hadoop文件系统(例如hdfs,webhdfs等),HBase和Hive进行交互,它必须使用启动应用程序的用户的Kerberos凭据来获取相关的令牌 - 也就是,将成为Spark应用程序的启动。

这通常在启动时完成:在一个安全的集群中,Spark将自动获取集群的默认Hadoop文件系统的标记,并可能为HBase和Hive获取标记。

如果HBase在类路径中,则HBase令牌将被获得,HBase配置声明应用程序是安全的(即hbase-site.xml设置hbase.security.authenticationkerberos)并且spark.yarn.security.credentials.hbase.enabled未设置为false

同样,如果Hive位于类路径中,则会获得Hive标记,其配置包含元数据存储的URI "hive.metastore.uris,并且spark.yarn.security.credentials.hive.enabled未设置为false

如果应用程序需要与其他安全的Hadoop文件系统进行交互,则在启动时必须明确请求访问这些群集所需的令牌。这是通过将它们列在spark.yarn.access.hadoopFileSystems属性中来完成的

spark.yarn.access.hadoopFileSystems hdfs://ireland.example.org:8020/,webhdfs://frankfurt.example.org:50070/

Spark通过Java服务机制支持与其他安全感知服务的集成(请参阅参考资料 java.util.ServiceLoader)。为此,org.apache.spark.deploy.yarn.security.ServiceCredentialProvider Spark的实现应该可以通过将其名称列在jar META-INF/services目录中相应的文件中来使用 这些插件可以通过设置来禁用 spark.yarn.security.credentials.{service}.enabledfalse,这里{service}是证书提供商的名称。

配置外部随机服务

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上运行shuffle服务时,可以使用以下额外的配置选项:

属性名称默认含义
spark.yarn.shuffle.stopOnFailure false 是否在Spark Shuffle Service初始化失败时停止NodeManager。这可以防止在Spark Shuffle服务未运行的NodeManager上运行容器导致应用程序失败。

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

Apache Oozie可以启动Spark应用程序作为工作流程的一部分。在安全集群中,启动的应用程序将需要相关的令牌来访问集群的服务。如果Spark是通过keytab启动的,这是自动的。但是,如果Spark没有keytab,那么建立安全的责任必须交给Oozie。

可以在Oozie网站 的特定版本文档的“身份验证”部分找到有关为安全集群配置Oozie和获取作业凭证的详细信息

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

  • YARN资源管理器。
  • 本地Hadoop文件系统。
  • 任何用作I / O源或目的地的远程Hadoop文件系统。
  • 配置单元 - 如果使用。
  • 使用HBase -if。
  • YARN时间轴服务器,如果应用程序与此交互。

为了避免Spark试图获取Hive,HBase和远程HDFS令牌,必须将Spark配置设置为禁用令牌收集。

Spark配置必须包含以下行:

spark.yarn.security.credentials.hive.enabled false spark.yarn.security.credentials.hbase.enabled false

配置选项spark.yarn.access.hadoopFileSystems必须是未设置的。

解决Kerberos问题

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

bash export HADOOP_JAAS_DEBUG=true

JDK的类可以被配置为经由系统属性来使他们的Kerberos和SPNEGO / Rest认证的额外的记录sun.security.krb5.debug 和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,则日志将包括获取的所有令牌的列表以及其到期的详细信息

使用Spark历史记录服务器来替换Spark Web UI

当应用程序UI被禁用时,可以使用Spark History Server应用程序页面作为运行应用程序的跟踪URL。这对于安全的群集可能是需要的,或者减少Spark驱动程序的内存使用量。要通过Spark历史记录服务器设置跟踪,请执行以下操作:

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

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

posted @ 2017-11-07 10:38  信方  阅读(1623)  评论(0编辑  收藏  举报