使用 mapPartitions 时,binaryFiles 何时加载到内存中?

When do binaryFiles load into memory when mapPartitions is used?

我正在使用 PySpark 将经过训练的深度学习模型应用于图像,并且关心内存使用量将如何根据我当前的方法进行扩展。因为经过训练的模型需要一段时间才能加载,所以我使用类似于以下的代码在每个 worker 上处理大批量图像:

def run_eval(file_generator):
    trained_model = load_model()
    results = []
    for file in file_generator:
        # "file" is a tuple: [0] is its filename, [1] is the byte data
        results.append(trained_model.eval(file[1]))
    return(results)

my_rdd = sc.binaryFiles('adl://my_file_path/*.png').repartition(num_workers)
results = my_rdd.mapPartitions(run_eval)
results.collect()

如上所述,文件存储在关联的 HDFS 文件系统(特别是 Azure Data Lake Store)中,可以通过 SparkContext 访问该文件系统。

我的主要问题是:

也感谢您就在哪里可以找到这些深入讨论的主题提出的建议。

When is the image data being loaded into memory?

  • Is each image's data loaded when the generator increments ("just in time")?

实际上,鉴于您的代码,它必须加载不止一次。它首先被 JVM 访问,然后转换为 Python 类型。之后发生随机播放并再次加载数据。每个进程都是惰性的,所以加载不是问题。

所以你要问自己的第一个问题是你是否真的需要洗牌。 binaryFilesminPartitions 参数,可用于控制分区数。

另一个问题是non-lazyresultslist。使用生成器表达式会更有意义:

def run_eval(file_generator):
    trained_model = load_model()
    for file in file_generator:
        yield trained_model.eval(file[1])

Is the head node responsible for loading the data from this associated file system (potentially creating a bottleneck), or do workers load their own data from it?

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