我正在从一个网关启动一个带有--master yarn --deploy-mode cluster选项的spark应用程序(2.1.0),它采用yarn集群模式。然而,我看到spark-submit在网关上启动的进程仍然在本地创建了数百个线程。我希望线程是在工作节点上创建的,而不是在网关中创建的,因为集群模式是激活的。集群模式由日志确认。为什么会有数百个线程在网关中被启动?
PS:我使用的是运行Hadoop 2.6.0的加密集群。
发布于 2017-08-30 21:57:29
您可能会遇到此处报告的问题https://issues.apache.org/jira/browse/HDFS-7718。这个问题似乎影响了我的公司,在启用了kerberos的Cloudera集群上,使用cluster部署模式来减少启动spark-submit的节点上的资源消耗。我们将看到,从我们的网关节点启动一些Spark作业将导致如下错误:
java.lang.OutOfMemoryError: Unable to create new native thread要调查这是否确实是影响您的问题,请尝试在Yarn Application 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将在每次分析要在HDFS中缓存的新jar时使用的线程数量增加1。每个新线程都会有上面描述的堆栈跟踪。在我们的例子中,我们让hdfs.DFSClient实例创建一个新的KMSClientProvider,创建一个新的ReloadingX509TrustManager,它创建新的线程,每个缓存的jar一个线程。对我们有效的一个简单的解决办法是避免使用spark.yarn.jars。
为了完整起见,你可能也想看看这个问题https://issues.apache.org/jira/browse/HADOOP-11368。
https://stackoverflow.com/questions/45945842
复制相似问题