我有一个Apache Spark应用程序,该应用程序在图像数据集上运行一系列转换并返回这些图像的图块。转换一切正常,但是当我将图像保存在本地时什么也没有发生。
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):
print(filepath)
dir = os.path.dirname(filepath)
os.makedirs(dir, exist_ok=True)
img = Image.fromarray(img_value.astype(np.uint8), 'RGB')
#img.show()
img.save(filepath)
我要将文件保存到的文件路径为data/train_256/1_6300.jpeg
。此路径应使用
dir = os.path.dirname(filepath)
os.makedirs(dir, exist_ok=True)
如果我取消注释#img.show()
行,则会打开图像。我真的不知道为什么它没有省钱。我的猜测是,由于应用程序在不同的路径(例如/usr/local/spark-2.4.0-bin-hadoop2.7/work/app-20181206041146-0000/0
)中运行,所以我无法保存到该本地路径。
任何想法都在发生什么,我该如何解决?
答案 0 :(得分:0)
Spark的行为符合预期, 如果要保存到本地,则必须将RDD收集到Array [Image]中,然后存储每个图像,
Collect实际上将所有数据带到驱动程序节点,在这种情况下,它将起作用,
已更新
sample_elements = rdd.collect();
for sample_element in sample_elements:
save_nonlabelled_sample_2_jpeg(sample_element, save_dir);