我正在以YARN-CLUSTER模式从网关启动Spark应用程序(2.1.0),并带有选项--master yarn --deploy-mode cluster
。但是,我看到spark-submit
在网关上启动的过程仍在本地创建数百个线程。我希望由于群集模式被激活,因此不会在工作节点上而不是在网关上创建线程。集群模式通过日志确认。为什么在网关中启动数百个线程?
ps:我正在使用一个加密的群集运行Hadoop 2.6.0。
您可能会在此处遇到https://issues.apache.org/jira/browse/hdfs-7718。这个问题似乎对我们公司的Cloudera
群集启用了kerberos
启用了cluster
部署模式,以减少启动spark-submit
的节点上的资源消耗。我们会看到,从我们的网关节点上启动一些火花作业将导致错误:
java.lang.OutOfMemoryError: Unable to create new native thread
要调查这是否确实是影响您的问题,请尝试在YARN应用程序Master JVM上启动jstack
,并查看线程的外观。如果您看到以下堆栈跟踪的许多线程:
"Truststore reloader thread" daemon prio=10 tid=0x00007fd1a5fa4000 nid=0x46f5 waiting on condition [0x00007fd086eed000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at org.apache.hadoop.security.ssl.ReloadingX509TrustManager.run(ReloadingX509TrustManager.java:189)
at java.lang.Thread.run(Thread.java:745)
您很有资格。
在我们的情况下,当在我们的安全群集中使用spark.yarn.jars
时,我们的ApplicationMaster
将增加1时每次分析新JAR时使用的线程的量。每个新线程都会具有上述描述的堆栈跟踪。在我们的情况下,我们有hdfs.DFSClient
实例创建一个新的KMSClientProvider
,创建一个新的ReloadingX509TrustManager
,该新线程创建新线程,每个缓存JAR。对我们有用的简单解决方法是避免使用spark.yarn.jars
。
为了完整性,您可能还需要查看此问题https://issues.apache.org/jira/browse/browse/hadoop-11368。