我是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应用程序的任何建议? 谢谢
答案 0 :(得分:4)
现在你根本就没有使用火花。您只是将SparkContext用作传递给主函数的变量(然后不执行任何操作)。要使用PySpark,您需要重新考虑您的应用程序。像os.listdir('.')
这样的命令可以在一台机器上正常运行,但是如果你在一组计算机上运行它,那么.
指的是哪个目录?提交作业的机器?每台机器上的本地目录?共享网络驱动器?如果你只是在一台机器上运行(对于充足的测试)。您可以通过简单地并行化列表(将其转换为RDD)来开始使用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())
答案 1 :(得分:0)
但图像未调整大小 - 这与应用程序失败不同。提交app时,它使用特定于应用程序的工作目录。将不会有任何文件在那里处理,它存在而不做任何工作。