Apache Spark 将哪些数据传送到执行节点
What data Apache Spark ships to execution nodes
我使用 Apache Spark 在以太网通信中查找 patterns/attaks。我担心 Spark 发送到 YARN/Hadoop 个执行节点的数据量。
我在我的地图函数中使用了 Scapy(见下面的代码)。如果它没有安装在执行节点上,Spark 会把整个模块发送给它们吗?或者在这种情况下任务不会被执行?还是以失败告终?有什么办法可以控制这种行为吗?
如果我的地图函数访问任何全局对象会发生什么?物品是否运送给工人?或者有某种 error/unexpected 行为?
这是一个示例代码:
#!/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()
闭包中引用的所有变量都会自动传送到工作节点,但您已经处理好依赖关系。
有多种方法可以解决这个问题:
- 在每个工作节点
的 PYTHONPATH
上安装依赖项/放置
- 在现有方法上创建 SparkContext or
addPyFile
方法时使用 pyFiles
参数
- 使用
spark-submit
的 --py-files
参数
如果依赖项很大或需要一些外部库,第一种方法可能是最佳方法。如果构建您自己的模块,您可能更喜欢 pyFiles
解决方案之一。
我使用 Apache Spark 在以太网通信中查找 patterns/attaks。我担心 Spark 发送到 YARN/Hadoop 个执行节点的数据量。
我在我的地图函数中使用了 Scapy(见下面的代码)。如果它没有安装在执行节点上,Spark 会把整个模块发送给它们吗?或者在这种情况下任务不会被执行?还是以失败告终?有什么办法可以控制这种行为吗?
如果我的地图函数访问任何全局对象会发生什么?物品是否运送给工人?或者有某种 error/unexpected 行为?
这是一个示例代码:
#!/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()
闭包中引用的所有变量都会自动传送到工作节点,但您已经处理好依赖关系。
有多种方法可以解决这个问题:
- 在每个工作节点 的
- 在现有方法上创建 SparkContext or
addPyFile
方法时使用pyFiles
参数 - 使用
spark-submit
的
PYTHONPATH
上安装依赖项/放置
--py-files
参数
如果依赖项很大或需要一些外部库,第一种方法可能是最佳方法。如果构建您自己的模块,您可能更喜欢 pyFiles
解决方案之一。