2016-10-28 2 views
3

Я начинающий для PySpark, недавно я попытался отправить простое приложение python (пакетное изменение размера) в мой искровой кластер. Я могу запустить приложение через pycharm успешно, и когда я подаю заявку на иск, изображения также будут изменены.Как правильно преобразовать обычное приложение Python в версию PySpark

это мой исходный код Python:

import os 
from PIL import Image 
size_64 = (64,64) 

for f in os.listdir('.') 
    if f.endswith('.jpg'): 
     i = Image.open(f) 
     fn, fext = os.path.splitext(f) 
     i.thumbnail(size_64) 
     i.save('resize/{}_64'.format(fn, fext)) 

Тогда я превратил его так, что я думал, что я могу представить мой питон приложение правильно:

import os 
from PIL import Image 
from pyspark import SparkContext, SparkConf 

APP_NAME = "ImageResizer" 

def main(sc): 
    size_64 = (64,64) 
    for f in os.listdir('.') 
     if f.endswith('.jpg'): 
      i = Image.open(f) 
      fn, fext = os.path.splitext(f) 
      i.thumbnail(size_64) 
      i.save('resize/{}_64'.format(fn, fext)) 
print 'done' 

if __name__ == "__main__": 
    conf = SparkConf().setAppName(APP_NAME) 
    conf = conf.setMaster("spark://10.233.70.48:7077") 
    sc = SparkContext(conf=conf) 
    main(sc) 

Однако, мне сказали, что я фактически не использовал искру (я так думаю, но я просто не знаю, как). Мне интересно, как я могу правильно преобразовать исходный код в путь Pyspark.

Может ли кто-нибудь, кто знаком с pyspark, помочь мне? И любые предложения о том, где я могу правильно и систематически научиться писать приложения PySpark? Спасибо

+0

Является ли это опечатка ?: я - Image.open (е) –

+0

@nfreze да, извините. –

ответ

2

Прямо сейчас вы не используете искру вообще. Вы просто используете SparkContext в качестве переменной, которую вы передаете своей основной функции (а затем ничего не делаете). Чтобы использовать PySpark, вам нужно переосмыслить свое приложение. Такие команды, как os.listdir('.'), работают нормально на одной машине, но если вы запустите ее на кластере компьютеров, в котором каталог ссылается на .? Машина, на которой была отправлена ​​работа? Локальный каталог на каждой машине? Общий сетевой диск? Если вы просто работаете на одной машине (для тестов достаточно много). Вы можете начать использовать Spark, просто распараллеливая список (превратите его в RDD). Затем можно применить операции на РДУ, как map, filter и reduce

s_list = sc.parallelize(os.listdir('.')) 
s_jpg_list = s_list.filter(lambda f: f.endswith('.jpg')) 
def resize_image(f): 
    i = Image.open(f) 
    size_64 = (64,64) 
    fn, fext = os.path.splitext(f) 
    i.thumbnail(size_64) 
    out_path = 'resize/{}_64'.format(fn, fext) 
    i.save(out_path) 
    return out_path 
s_jpg_files = s_jpg_list.map(resize_image) 
print('Converted Images:', s_jpg_files.collect()) 
+0

очень впечатляет !!!! Большое вам спасибо за помощь! Теперь я пытаюсь применить изменения, упомянутые выше, и «переосмыслить» мое приложение. Надеюсь, я скоро это исправлю. Знаете ли вы, как я могу систематически учиться писать правильное приложение pySpark (я не изучал карту, фильтр и уменьшал до [как чистый новичок])? Кстати, в выходные дни я действительно внес некоторые изменения в свой исходный код, и я могу правильно изменить размеры своих изображений, но я думаю, что я не использовал искру все еще –

+0

вы правы, когда я работаю только на своем pycharm, ваша измененная версия изменит размер изображения. но когда я подал иск, это не так. Поскольку я запускаю кластер, я хочу изменить os.listdir ('.') На определенный путь на моем основном узле, но я не знаю, как это сделать. Не могли бы вы рассказать мне, как правильно указать путь для ситуаций, о которых вы упомянули, например, о машине, на которой было отправлено задание/Локальный каталог на каждом компьютере/общем сетевом диске? –

0

но изображения не изменяются - это не то же самое, что и сбой приложения. Когда приложение отправлено, он использует рабочий каталог приложения. Там не будет никаких файлов для обработки, и он существует без каких-либо работ.

Смежные вопросы