2016-10-28 33 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

但图像没有调整大小 - 这是不一样的应用程序故障。提交应用程序时,它使用应用程序特定的工作目录不会有任何文件在那里处理,并且它不存在任何工作。

相关问题