如何将普通的Python应用程序正确转换为PySpark版本

时间:2016-10-28 14:40:54

标签: python apache-spark pyspark spark-dataframe

我是PySpark的初学者,最近我尝试向我的spark群集提交一个简单的python应用程序(批量调整图片大小)。我可以通过pycharm成功运行应用程序,当我将我的应用程序提交给spark时,图像也会重新调整大小。

这是我原来的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应用程序的任何建议? 谢谢

2 个答案:

答案 0 :(得分:4)

现在你根本就没有使用火花。您只是将SparkContext用作传递给主函数的变量(然后不执行任何操作)。要使用PySpark,您需要重新考虑您的应用程序。像os.listdir('.')这样的命令可以在一台机器上正常运行,但是如果你在一组计算机上运行它,那么.指的是哪个目录?提交作业的机器?每台机器上的本地目录?共享网络驱动器?如果你只是在一台机器上运行(对于充足的测试)。您可以通过简单地并行化列表(将其转换为RDD)来开始使用Spark。然后,您可以对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())

答案 1 :(得分:0)

但图像未调整大小 - 这与应用程序失败不同。提交app时,它使用特定于应用程序的工作目录。将不会有任何文件在那里处理,它存在而不做任何工作。