Spark:正在使用错误的网络接口
Spark: is using wrong network interface
我正在 docker 容器中使用 hadoop 集群(我正在使用覆盖网络)
我在同一个主机上有 2 个容器(master 和 slave2)
另一个在不同的主机(slave1)
容器可以访问仅由它们使用的本地网络 10.0.0.0
master 和 slave2 容器还可以访问与主机共享的另一个网络 172.18.0.0
Slave1 可以访问与其主机
共享的不同网络 172.18.0.0
两台主机中的网络172.18.0.0
是独立的
所以恢复每个容器都有两个ip地址
- 大师:
10.0.0.2
和 172.18.0.2
- 药膏 2:
10.0.0.3
和 172.18.0.3
- 药膏3;
10.0.0.4
和 172.18.0.2
树容器必须通过 10.0.0.0 网络进行通信。但是有一些奇怪的事情发生了。
当我在 pyspark 中 运行 这个脚本
def getIP(iter):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
return [s.getsockname()[0]]
rdd = sc.parallelize(range(3),3)
hosts = rdd.mapPartitions(getIP).collect()
for h in hosts:
print(h)
这道题的输出是
172.18.0.2
172.18.0.3
172.18.0.3
这是错误的,因为容器只能通过 10.0.0.0 网络接口进行通信。
这是我的 yarn-site.xml
文件
<configuration>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>
yarn.nodemanager.aux-services.mapreduce_shuffle.class
</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
</configuration>
hadoop-master 是地址 10.0.0.2
的主机名
如何告诉 spark 使用 10.0.0.2 接口。
谢谢。
我不认为你的spark使用了错误的网络,否则你甚至不能运行这个程序。
您的 getIP
方法 returns ip 用于连接 8.8.8.8
的主机。如您所述,所有主机都有两个网络,而 10.0.0.*
仅由这 3 个节点共享。所以主机使用 172.18.0.*
连接 8.8.8.8
.
你可以试试看s.connect(("8.8.8.8", 80))
、s.connect(("10.0.0.2", 80))
和s.connect(("localhost", 80))
的区别。
我正在 docker 容器中使用 hadoop 集群(我正在使用覆盖网络)
我在同一个主机上有 2 个容器(master 和 slave2) 另一个在不同的主机(slave1)
容器可以访问仅由它们使用的本地网络 10.0.0.0
master 和 slave2 容器还可以访问与主机共享的另一个网络 172.18.0.0
Slave1 可以访问与其主机
共享的不同网络172.18.0.0
两台主机中的网络172.18.0.0
是独立的
所以恢复每个容器都有两个ip地址
- 大师:
10.0.0.2
和172.18.0.2
- 药膏 2:
10.0.0.3
和172.18.0.3
- 药膏3;
10.0.0.4
和172.18.0.2
树容器必须通过 10.0.0.0 网络进行通信。但是有一些奇怪的事情发生了。
当我在 pyspark 中 运行 这个脚本
def getIP(iter):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
return [s.getsockname()[0]]
rdd = sc.parallelize(range(3),3)
hosts = rdd.mapPartitions(getIP).collect()
for h in hosts:
print(h)
这道题的输出是
172.18.0.2
172.18.0.3
172.18.0.3
这是错误的,因为容器只能通过 10.0.0.0 网络接口进行通信。
这是我的 yarn-site.xml
文件
<configuration>
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>
yarn.nodemanager.aux-services.mapreduce_shuffle.class
</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>hadoop-master</value>
</property>
</configuration>
hadoop-master 是地址 10.0.0.2
如何告诉 spark 使用 10.0.0.2 接口。
谢谢。
我不认为你的spark使用了错误的网络,否则你甚至不能运行这个程序。
您的 getIP
方法 returns ip 用于连接 8.8.8.8
的主机。如您所述,所有主机都有两个网络,而 10.0.0.*
仅由这 3 个节点共享。所以主机使用 172.18.0.*
连接 8.8.8.8
.
你可以试试看s.connect(("8.8.8.8", 80))
、s.connect(("10.0.0.2", 80))
和s.connect(("localhost", 80))
的区别。