为什么在YARN上两次执行spark-shell会导致第二次执行未决?

时间:2018-09-02 11:45:02

标签: apache-spark hadoop yarn hadoop2

我正在设置Hadoop集群以进行测试,并将所有内容放入3个Docker容器中。

我在master上的spark-defaults.conf是:

spark.master                     yarn
spark.eventLog.enabled           true
spark.eventLog.dir               hdfs://spark-master:9000/spark/logs
spark.serializer             org.apache.spark.serializer.KryoSerializer
spark.history.provider          org.apache.spark.deploy.history.FsHistoryProvider
spark.history.fs.logDirectory    hdfs://spark-master:9000/spark-logs
spark.history.fs.update.interval 10s
spark.history.ui.port            18080
spark.driver.memory              512m
spark.executor.memory            512m
spark.yarn.am.memory             512m
spark.yarn.historyServer.address spark-master:18080
spark.executor.instances         1

core-site.xml

[root@spark-master hadoop]# cat core-site.xml 
<configuration>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://spark-master:9000</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131072</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/tmp/hadoop</value>
    </property>
</configuration>

yarn-site.xml

[root@spark-master hadoop]# cat yarn-site.xml 
<configuration>
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>spark-master</value>
    </property>
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.scheduler.maximum-allocation-mb</name>
        <value>4096</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>128</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>
</configuration>

hdfs-site.xml

[root@spark-master hadoop]# cat hdfs-site.xml 
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>/hdfs/namenode</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>/hdfs/datanode</value>
    </property>
    <property>
        <name>dfs.namenode.handler.count</name>
        <value>100</value>
    </property>
</configuration>

纱线节点-list

[root@spark-master /]# yarn node -list
Total Nodes:2
     Node-Id         Node-State Node-Http-Address   Number-of-Running-Containers
cassandra-node-1:39414          RUNNING cassandra-node-1:8042                              1
cassandra-node-2:42546          RUNNING cassandra-node-2:8042                              1

大师

[root@spark-master /]# jps
1952 SparkSubmit
597 NameNode
458 ResourceManager
1066 SecondaryNameNode
2906 Jps
75 ZeppelinServer
1292 HistoryServer
2702 SparkSubmit

node-1

[root@cassandra-node-1 /]# jps
96 NodeManager
1606 CoarseGrainedExecutorBackend
3094 Jps
231 DataNode

node-2

[root@cassandra-node-2 /]# jps
229 DataNode
3110 Jps
1565 ExecutorLauncher
94 NodeManager

这里一切似乎都很好。我看到一个容器中有应用程序管理器,而另一个容器中有spark shell执行器。

现在问题很简单了。我要做的就是两次执行spark-shell-我想做 “在纱线上有一个火花壳和一个齐柏林飞艇解释器”方案,但是由于它是无限期待决的,所以Zeppelin解释器无法正常工作,因此为了简单起见,我只想运行两个火花箱。

但是当我要执行第二个Shell时,它被卡住了,但是这里有足够的资源可以使用,对吗?有3.13 GB的可用内存,在8个内存中仅使用了1个vcore(7个免费vcore),它们似乎都非常空闲,所以为什么没有启动另一个spark-shell并使其挂起呢?

对于未决的应用尝试,它报告:

Total Outstanding Resource Requests: <memory:896, vCores:1>

但是我有足够的内存,CPU似乎也没有问题。

我有4个核心处理器-Intel(R)CoreTM i5-2540M CPU @ 2.60GHz(cat / proc / cpuinfo提供4个处理器),但是我不明白为什么它报告它像我有8个(也许是因为2 Docker容器,因此它认为我有2x4,但我总共只有4个)。

也许问题在于一个Spark Shell占用2个内核,因为它使用2个容器(一个用于应用程序主容器,另一个用于Spark执行器),另一个Spark-Shell也使用2个容器,因此将其4个一起使用,但是以某种方式可以只分配三个,一个出色,但是为什么当我总共有四个呢?

第一个shell毫无问题地启动,但是第二个shell被“接受”,但是它正在等待资源,并且只有在我杀死第一个spark-shell的情况下,它才会继续。

编辑

1)纱线节点-在任何应用程序之前列出

Total Nodes:2
         Node-Id         Node-State Node-Http-Address   Number-of-Running-Containers
cassandra-node-2:43961 RUNNING  cassandra-node-2:8042 0
cassandra-node-1:36905 RUNNING  cassandra-node-1:8042 0

2)纱线节点-list-在第一个spark-shell启动之后-我进入了spark-shell控制台


Total Nodes:2
         Node-Id         Node-State Node-Http-Address   Number-of-Running-Containers
cassandra-node-2:43961 RUNNING  cassandra-node-2:8042 2
cassandra-node-1:36905 RUNNING  cassandra-node-1:8042 0

3)启动第二个spark-shell之后,输出与2)中的输出相同,第二个shell给了我:

[root@spark-master /]# spark-shell
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
2018-09-04 10:56:14 WARN  Utils:66 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041.

并且没有其他输出卡住了。

应用尝试在hadoop后端的第二个spark-shell中说:

Total Outstanding Resource Requests: memory:896, vCores:1

0 个答案:

没有答案