2016-10-28 32 views
3

我是PySpark的初學者,最近我試圖將一個簡單的python應用程序(批量調整大小的圖片)提交給我的Spark集羣。我可以通過pycharm成功運行應用程序,並且當我提交我的應用程序以進行spark時,圖像也會被調整大小。如何正確地將普通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)) 

然後,我把它改造成我想我可以提交正確我的Python應用程序的方式:

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(F) –

+0

@nfreze是的,對不起。 –

回答

2

現在你根本沒有使用火花。你只是使用SparkContext作爲你傳遞給你的主函數的變量(然後不做任何事情)。爲了使用PySpark,您需要重新考慮您的應用程序。像os.listdir('.')這樣的命令可以在單臺機器上正常工作,但是如果您在一組計算機上運行.所指的那個目錄?提交作業的機器?每臺機器上的本地目錄?共享網絡驅動器?如果你只是在一臺機器上運行(對於很多測試)。您可以通過簡單地並行化列表來開始使用Spark(將其轉換爲RDD)。然後,您可以在RDD應用操作,如mapfilterreduce

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應用程序(我沒有像[純粹的初學者]之前學習過map,filter和reduce)?順便說一句,在週末我實際上對原始代碼做了一些修改,我可以正確調整圖像大小,但我認爲我根本沒有使用火花仍然 –

+0

你是對的,當我只運行在我的pycharm上時,你的修改版本將調整大小圖像。但是當我提交時,它並沒有。由於我在羣集上運行,我想將os.listdir('。')更改爲主節點上的特定路徑,但我不知道如何。您能否教我如何正確指定您提到的情況的路徑,如提交作業的機器/每臺計算機上的本地目錄/共享網絡驅動器? –

0

但圖像沒有調整大小 - 這是不一樣的應用程序故障。提交應用程序時,它使用應用程序特定的工作目錄不會有任何文件在那裏處理,並且它不存在任何工作。

相關問題