Spark ON YARN 官方中文版
官网
http://spark.apache.org/docs/latest/running-on-yarn.html
在YARN上运行Spark
在Yarn(Hadoop NextGen)上运行的支持 已在0.6.0版中添加到Spark中,并在后续版本中得到改进。
在YARN上启动Spark
确保HADOOP_CONF_DIR或YARN_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客户端程序。然后SparkPi将作为Application Master的子线程运行。客户端将定期轮询应用程序主文件以获取状态更新并将其显示在控制台中。一旦你的应用程序运行完毕,客户端将退出。有关如何查看驱动程序和执行程序日志的信息,请参阅下面的“调试应用程序”部分。
要在client模式下启动Spark应用程序,请执行相同的操作,但替换cluster为client。以下显示如何spark-shell在client模式下运行:
在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,请参阅Building Spark。
为了让从YARN端访问Spark运行时jar,你可以指定spark.yarn.archive或spark.yarn.jars。有关详细信息,请参阅Spark属性。如果既没有spark.yarn.archive也没有spark.yarn.jars指定,Spark将创建一个包含所有JAR的zip文件$SPARK_HOME/jars并将其上传到分布式缓存。
配置
对于其他部署模式,YARN上的Spark大部分配置都相同。有关这些的更多信息,请参阅配置页面。这些是在YARN上特定于Spark的配置。
调试您的应用程序
在YARN术语中,执行器和应用程序在“容器”内部运行。YARN有两种处理应用程序完成后的容器日志的模式。如果打开日志聚合(使用yarn.log-aggregation-enable配置),容器日志将复制到HDFS并在本地计算机上删除。这些日志可以通过该yarn logs命令从群集中的任何位置查看。
将从给定应用程序的所有容器中打印出所有日志文件的内容。您还可以使用HDFS外壳或API直接在HDFS中查看容器日志文件。他们所在的目录可以通过查看你的YARN配置(yarn.nodemanager.remote-app-log-dir和yarn.nodemanager.remote-app-log-dir-suffix)来找到。日志也可以在执行程序选项卡下的Spark Web UI中使用。你需要有两个Spark history Server和MapReduce history Server上运行,并配置yarn.log.server.url在yarn-site.xml正确。Spark记录服务器UI上的日志URL会将您重定向到MapReduce history Server以显示聚合日志。
当日志聚合未打开时,日志将保存在每台计算机上的本地YARN_APP_LOGS_DIR,通常配置为/tmp/logs或$HADOOP_HOME/logs/userlogs取决于Hadoop版本和安装。查看容器的日志需要转到包含它们的主机并查看此目录。子目录按应用程序ID和容器ID组织日志文件。日志也可以在执行程序选项卡下的Spark Web UI上使用,并且不需要运行MapReduce history Server。
要查看每个容器的启动环境,请增加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属性
还有很多的属性。
重要笔记
· 核心请求在调度决策中是否得到遵守取决于哪个调度程序正在使用以及它如何配置。
· 在cluster模式下,Spark执行程序和Spark驱动程序使用的本地目录将是为YARN配置的本地目录(Hadoop YARN配置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-site.xml设置hbase.security.authentication为kerberos)并且spark.security.credentials.hbase.enabled未设置为HBase令牌,则会获取HBase令牌false。
同样,如果Hive位于类路径中,则会获得Hive标记,其配置包含元数据存储的URI "hive.metastore.uris,并且 spark.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.security.credentials.{service}.enabled到false,这里{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群集中所有s 的类路径中。
4. 在yarn-site.xml每个节点上,添加spark_shuffle到yarn.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服务初始化失败时是否停止NodeManager。这可以防止在Spark Shuffle服务未运行的NodeManagers上运行容器导致应用程序失败。 |
使用Apache Oozie启动您的应用程序
Apache Oozie可以将Spark应用程序作为工作流程的一部分启动。在安全集群中,启动的应用程序将需要相关的令牌来访问集群的服务。如果Spark使用**表启动,则这是自动的。但是,如果要在没有**表的情况下启动Spark,则必须将设置安全性的责任移交给Oozie。
可以在Oozie网站 的特定版本文档的“身份验证”部分找到有关为安全集群配置Oozie和获取作业凭证的详细信息。
对于Spark应用程序,必须为Oozie设置Oozie工作流程以请求应用程序需要的所有令牌,其中包括:
· YARN资源管理器。
· 本地Hadoop文件系统。
· 用作I / O的源或目标的任何远程Hadoop文件系统。
· 配置单元 - 如果使用。
· 使用HBase -if。
· YARN时间轴服务器,如果应用程序与此交互。
为了避免Spark试图获取Hive,HBase和远程HDFS令牌,然后失败,必须将Spark配置设置为禁用服务的令牌收集。
Spark配置必须包含以下行:
spark.security.credentials.hive.enabled false
spark.security.credentials.hbase.enabled false
配置选项spark.yarn.access.hadoopFileSystems必须未设置。
解决Kerberos问题
调试Hadoop / Kerberos问题可能很“困难”。一种有用的技术是通过设置HADOOP_JAAS_DEBUG 环境变量来在Hadoop中启用额外的Kerberos操作日志记录。
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 history Server来替换Spark Web UI
当应用程序UI被禁用时,可以使用Spark History Server应用程序页面作为运行应用程序的跟踪URL。这在安全集群上可能是需要的,或者减少Spark驱动程序的内存使用量。要通过Spark history Server设置跟踪,请执行以下操作:
· 在应用程序方面,设置spark.yarn.historyServer.allowTracking=trueSpark的配置。如果应用程序的UI被禁用,这将告诉Spark使用history server的URL作为跟踪URL。
· 在Spark history Server上,添加org.apache.spark.deploy.yarn.YarnProxyRedirectFilter 到spark.ui.filters配置中的过滤器列表。
请注意,history server信息可能不是应用程序状态的最新信息。