python - Apache Spark 将哪些数据传送到执行节点

标签 python hadoop apache-spark scapy pyspark

我使用 Apache Spark 来查找以太网通信中的模式/攻击。我担心 Spark 发送到 YARN/Hadoop 执行节点的数据量。

我在我的 map 函数中使用了 Scapy(见下面的代码)。如果它没有安装在执行节点上,Spark 会把整个模块发送给它们吗?或者在这种情况下任务不会被执行?还是以失败告终?有什么办法可以控制这种行为吗?

如果我的 map 函数访问任何全局对象会发生什么?元素是否运送给 worker ?或者有某种错误/意外行为?

这是一个示例代码:

#!/usr/bin/python
from pyspark import SparkContext, SparkConf

def ExtractIP(rawEther):
    from scapy.layers.inet import Ether, IP

    eth = Ether(rawEther)
    # May not be IP (for example ARP)
    try:
        return eth[IP].fields['src']
    except:
        return '0.0.0.0'

def main():
    # Init Spark
    conf = SparkConf().setAppName("MyApp").setMaster("local")
    sc = SparkContext(conf=conf)

    # Load data
    cap = sc.sequenceFile("hdfs://master/user/art/Data.seq")

    # Get raw Ethernet message
    raw_msgs = cap.values()

    # Get the source IP address using Scapy
    msg_ip = raw_msgs.map(ExtractIP)

    # Print the number of target IP messages
    print msg_ip.filter(lambda srcIp: srcIp == '10.1.1.100').count()


if __name__ == "__main__":
    main()

最佳答案

闭包中引用的所有变量都会自动传送到工作节点,但您需要处理依赖关系。

有多种方法可以解决这个问题:

  1. 在每个工作节点上的 PYTHONPATH 上安装依赖项/放置
  2. 在创建 SparkContext 时使用 pyFiles 参数或 addPyFile现有的方法
  3. 使用 --py-files 参数 spark-submit

如果依赖项很大或需要一些外部库,第一种方法可能是最佳方法。如果构建您自己的模块,您可能更喜欢使用 pyFiles 解决方案之一。

关于python - Apache Spark 将哪些数据传送到执行节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31661357/

相关文章:

python - 有效地计算组合和排列

python - Excel Sheet 上的两个 if 测试条件,使用 xlrd

python - Django 外键过滤

mysql - Oozie 未在 AWS EC2 实例中启动 Mysql

apache-spark - 如何配置 Yarn 以使用所有 vcores?

python - 如何让我的Regex函数识别更多子字符串

hadoop - map 减少字数示例

python - 在 Apache Hadoop 上扩展 python mrjob 程序

scala - 如何在 Hue/Notebook/Scala/Spark 中漂亮地打印数据框?

apache-spark - 通过可能增加分区或任务的数量来提高 Spark DataFrame 到 RDD 转换的速度