Apache spark 使用mapPartitions时,二进制文件何时加载到内存中?

Apache spark 使用mapPartitions时,二进制文件何时加载到内存中?,apache-spark,pyspark,azure-data-lake,Apache Spark,Pyspark,Azure Data Lake,我正在使用PySpark将经过培训的深度学习模型应用于图像,并关注内存使用情况如何与我当前的方法相适应。由于加载经过训练的模型需要一段时间,因此我在每个worker上处理了大量图像,代码如下所示: def运行评估(文件生成器): 训练模型=负荷模型() 结果=[] 对于文件生成器中的文件: #“file”是元组:[0]是其文件名,[1]是字节数据 results.append(trained_model.eval(文件[1])) 返回(结果) my_rdd=sc.binaryFiles('adl

我正在使用PySpark将经过培训的深度学习模型应用于图像,并关注内存使用情况如何与我当前的方法相适应。由于加载经过训练的模型需要一段时间,因此我在每个worker上处理了大量图像,代码如下所示:

def运行评估(文件生成器):
训练模型=负荷模型()
结果=[]
对于文件生成器中的文件:
#“file”是元组:[0]是其文件名,[1]是字节数据
results.append(trained_model.eval(文件[1]))
返回(结果)
my_rdd=sc.binaryFiles('adl://my_file_path/*.png')。重新分区(工人数量)
结果=my_rdd.mapPartitions(运行评估)
结果:收集()
如上所述,这些文件存储在关联的HDFS文件系统(特别是Azure Data Lake存储)上,可以通过SparkContext访问该文件系统

我的主要问题是:

  • 图像数据何时加载到内存中?
    • 当生成器递增(“即时”)时,是否加载了每个图像的数据
    • 在辅助进程启动之前,是否加载了整个分区的所有映像数据
  • 头节点负责从该关联文件系统加载数据(可能会造成瓶颈),还是工作人员从中加载自己的数据
同时也感谢您对在哪里可以找到这些深入讨论的主题的建议

图像数据何时加载到内存中

  • 当生成器递增(“即时”)时,是否加载了每个图像的数据
实际上,给定您的代码,必须多次加载它。首先,JVM访问它,然后将其转换为Python类型。在此之后,将发生洗牌,并再次加载数据。每个进程都是惰性的,因此加载不是问题

所以你要问自己的第一个问题是,你是否真的要洗牌
binaryFiles
具有
minPartitions
参数,可用于控制分区数

另一个问题是非惰性
结果
列表
。使用生成器表达式更有意义:

def运行评估(文件生成器):
训练模型=负荷模型()
对于文件生成器中的文件:
收益率模型.eval(文件[1])
头节点负责从该关联文件系统加载数据(可能会造成瓶颈),还是工作人员从中加载自己的数据

不涉及中央处理。每个执行器进程(Python)/线程(JVM)将加载自己的数据集部分