2016-10-28 6 views
3

私はPySparkの初心者です。最近、単純なpythonアプリケーション(バッチサイズ変更ピクチャ)を自分のsparkクラスタに送信しようとしました。私は正常に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)) 

それから私は私がきちんと自分の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

は、このタイプミスです?:I - Image.open(F) –

+0

@nfrezeはい、申し訳ありません。 –

答えて

2

今、あなたはまったくスパークを使用していません。メイン関数に渡す変数としてSparkContextを使用するだけです(何もしないでください)。 PySparkを使用するには、アプリケーションを再考する必要があります。 os.listdir('.')のようなコマンドは1台のマシンで正常に動作しますが、どのディレクトリにあるコンピュータのクラスタで実行する場合は、.を参照してください。仕事が提出されたマシン?すべてのマシンのローカルディレクトリ?共有ネットワークドライブ? 1台のマシンで実行しているだけの場合(十分なテストの場合)リストを並列化(RDDに変換)するだけで、Sparkの使用を開始できます。その後、mapfilterようRDDの操作を適用することができ、かつ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

イメージはサイズ変更されません - これはアプリケーションの失敗と同じではありません。 appが送信されると、アプリケーション固有の作業ディレクトリが使用されます。そこでは処理するファイルはなく、何もせずに存在します。

関連する問題