Spark / Python - 获取IP地址。

时间:2017-05-27 00:02:52

标签: apache-spark pyspark

我是Spark的新手。我在本地拥有master(192.168.33.10)和slave(192.168.33.12)集群设置,并且我写了以下脚本来演示master和slave都在自己的机器上运行get_ip_wrap()。

但是,当我使用命令./bin/spark-submit ip.py运行时,我只在输出中看到192.168.33.10,我在输出中也期待192.168.33.12

['192.168.33.10', '192.168.33.10', '192.168.33.10', '192.168.33.10', '192.168.33.10']

我在这里遗漏了什么吗?

import socket
import fcntl
import struct
from pyspark import SparkContext, SparkConf

def get_ip_address(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(
        s.fileno(),
        0x8915,  # SIOCGIFADDR                                                                                                               
        struct.pack('256s', ifname[:15])
    )[20:24])

def get_ip_wrap(num):
    return get_ip_address('eth1')

conf = SparkConf().setAppName('appName').setMaster('local')
sc = SparkContext(conf=conf)

data = [1, 2, 3, 4, 5]
distData = sc.parallelize(data)

result = distData.map(get_ip_wrap)
print result.collect()

1 个答案:

答案 0 :(得分:2)

当您说conf = SparkConf().setAppName('appName').setMaster('local')时,您明确告诉spark以本地模式运行。这意味着应用程序在主节点上运行单线程。

要解决此问题,请取消.setMaster('local')调用,并执行类似.setMaster('yarn')的操作(如果yarn是您的集群管理器)。请参阅此处了解您的选项:https://spark.apache.org/docs/latest/submitting-applications.html#master-urls

或者,您可以使用spark-submit选项启动--master bin。这就是文档似乎暗示你做的事情,但如果我没记错的话,我认为你可以在应用程序中设置主人(但也许不是,我现在不能测试它)。