映射后,我想检索存储在RDD系统中的图像。
我在main.py
文件上创建了一个简单的Spark会话,它调用函数preprocess_spark返回一个名为samples
的元组数组。这些元组为(slide_num, image)
格式。图像是np.array
,将在save_jpeg_help
函数中转换为图像。
打开Apache Spark WEB UI时,我看到它具有与以下行相对应的作业:
rdd.foreach(lambda sample_element: save_nonlabelled_sample_2_jpeg(sample_element, save_dir))
,但是完成后,什么都不会保存在我的save_dir
目录中。
知道我在做什么错吗?
亲切的问候
main.py
spark = (SparkSession.builder
.appName("Oncofinder -- Preprocessing")
.getOrCreate())
samples = preprocess_spark(spark, [1])
if save_jpegs: #SET TO TRUE
save_rdd_2_jpeg(samples, './data/images')
def save_rdd_2_jpeg(rdd, save_dir):
rdd.foreach(lambda sample_element: save_nonlabelled_sample_2_jpeg(sample_element, save_dir))
def save_nonlabelled_sample_2_jpeg(sample, save_dir):
slide_num, img_value = sample
filename = '{slide_num}_{hash}.jpeg'.format(
slide_num=slide_num, hash=np.random.randint(1e4))
filepath = os.path.join(save_dir, filename)
save_jpeg_help(img_value, filepath)
def save_jpeg_help(img_value, filepath):
dir = os.path.dirname(filepath)
os.makedirs(dir, exist_ok=True)
img = Image.fromarray(img_value.astype(np.uint8), 'RGB')
img.save(filepath)
def preprocess_spark(spark, slide_nums, folder="data", training=False, tile_size=1024, overlap=0,
tissue_threshold=0.9, sample_size=256, grayscale=False, normalize_stains=True,
num_partitions=20000):
slides = (spark.sparkContext
.parallelize(slide_nums)
.filter(lambda slide: open_slide(slide, folder, training) is not None))
tile_indices = (slides.flatMap(
lambda slide: process_slide(slide, folder, training, tile_size, overlap)))
tile_indices = tile_indices.repartition(num_partitions)
tile_indices.cache()
tiles = tile_indices.map(lambda tile_index: process_tile_index(tile_index, folder, training))
filtered_tiles = tiles.filter(lambda tile: keep_tile(tile, tile_size, tissue_threshold))
samples = filtered_tiles.flatMap(lambda tile: process_tile(tile, sample_size, grayscale))
if normalize_stains:
samples = samples.map(lambda sample: normalize_staining(sample))
return samples
编辑:我正在使用
PYSPARK_PYTHON=python3 spark-submit --master spark://127.0.1.1:7077 spark_preprocessing.py
运行该应用程序。似乎在foreach
动作之后,什么也没有发生。有什么理由吗?
答案 0 :(得分:1)
如果将所有示例collect
放在驱动程序节点上,然后再尝试保存它们,则可以解决您遇到的问题。如果您将save_rdd_2_jpeg
重新定义为:
def save_rdd_2_jpeg(rdd, save_dir):
for sample in rdd.collect():
save_nonlabelled_sample_2_jpeg(sample, save_dir)
然后一切正常。