背景

pyspark作业在cluster模式提交时候除了执行的文件外,如果有其他依赖的话,需要用–py-files导入,如果是导入一个python包(带__init__.py的文件夹)的话,需要先打包成zip包。(只是一种方式,也可以打包环境上传HDFS,和本文无关不多说)
如: 想要调用的request包如果dn节点的机器上没有的话,可以把源码直接打成zip然后才可以调用

--py-files request.zip

对于一个项目来说,很少有一个文件就能写完的,都是按模块去编写的,这就需要打包后放到依赖中,如果文件有改动就需要重新打包

zip -r -0  xxx.zip  xxx  # -r: 目录  -0: 只存储不压缩

当有五六个模块的时候每次都调用zip命令去打包很麻烦,自然而然的就想到去写一个打包脚本
比如把脚本放到项目的bin文件下, 可以写成这样

# bin/zip.sh
zip -r -0 model1.zip model1  # 打包模块1
zip -r -0 model2.zip model2  # 打包模块2
zip -r -0 model3.zip model3  # 打包模块3

这样可以在项目目录下执行 bin/zip.sh 就把所有要打包的模块都打好了

坑与改进

现在的问题是,这个shell脚本只能在项目目录下执行,想在其他地方执行就要先切过来,比较麻烦
做如下改写

# !这是一个有问题的脚本!
FILE_PATH=$(readlink -f "$0")   # 这个脚本文件的绝对路径
WORK_PATH=${FILE_PATH}/../  # 项目目录zip -r -0 ${WORK_PATH}/model1.zip ${WORK_PATH}/model1  # 打包模块1
zip -r -0 ${WORK_PATH}/model2.zip ${WORK_PATH}/model2  # 打包模块2
zip -r -0 ${WORK_PATH}/model3.zip ${WORK_PATH}/model3  # 打包模块3

打包,spark-submit, 然后会发现master报错

Traceback (most recent call last):File xxxx, line xx, in xxx
ImportError: No module named model1

看下提交日志也会发现依赖项确实提交上去了,但是没有生效
如果把日志里给出的上传路径下的包拿下来也能发现和在本地打好的包是完全相同的
重试N次无解,百度发现Stack Overflow上有一哥们有相同的问题 https://stackoverflow.com/questions/27644525/pyspark-py-files-doesnt-work 但是也无解,下边的评论给的都是sc.addFile,也试了下无效 。
决定在本地模拟加载试一下, --py-files的目的是把这个参数给出的包都放到了PYTHONPATH这个环境变量下,遂本地手动加载

export PYTHONPATH=model1.zip
mv model1 model1.back  # 改名 防止读到这

然后试一下

import model1

输出和spark作业的输出很一致

Traceback (most recent call last):File xxxx, line xx, in xxx
ImportError: No module named model1

包不行。。。 解压一下

unzip model1.zip

发现是一个 User的文件夹(mac环境试的)
查了一圈发现 zip 命令会把文件夹结构也都打包进去
所以不能用绝对路径
同时也不能用 -j 参数,因为python的zip包要求解压后是个文件夹
于是采用如下方案修改脚本

FILE_PATH=$(readlink -f "$0")   # 这个脚本文件的绝对路径
WORK_PATH=${FILE_PATH}/../  # 项目目录
cd WORK_PATH
zip -r -0 model1.zip model1  # 打包模块1
zip -r -0 model2.zip model2  # 打包模块2
zip -r -0 model3.zip model3  # 打包模块3

这样就能正常work啦~

zip命令的坑 pyspark --py-files导入zip包不生效 / python导入zip包不生效相关推荐

  1. python导入自定义模块_ubuntu下Python导入自定义模块的方法

    ubuntu下Python导入自定义模块的方法 当在python程序中导入自定义模块时,若出现"Import Error:no module named xxx"表明系统在pyth ...

  2. python导入模块失败_关于python导入模块失败的问题

    1.下载netsnmp的源码包, net-snmp-5.7.3.zip 2.解压并安装,tar xzvf net-snmp-5.7.3.zip; cd net-snmp-5.7.3; ./config ...

  3. python导包顺序_2019-03-21 python导入包以及Python程序执行顺序理解

    http://codingpy.com/article/python-import-101/ https://segmentfault.com/a/1190000009842139 (一)Python ...

  4. linux zip压缩包大小,Linux中巧用zip命令压缩和解压缩文件

    在Windows中,我们用得最多的解压缩软件就是WinRAR了,这个软件对我们实现解压缩非常方便.但是如果在Linux系统中,我们还可以尝试用命令来实现对文件的解压缩,这篇文章主要介绍在Linux中用 ...

  5. python 导入自定义模块

    python 导入自定义模块 文章目录 python 导入自定义模块 相同文件夹下 文件目录 `module1.py` 自定义模块 `demo.py` 引用文件 不同文件夹下 文件目录 `__init ...

  6. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)

    python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...

  7. python3 zip命令_Python调用zip命令正确操作方法解析

    当我们在应用Python编程语言进行程序开发的时候,我们会发现这一语言可以帮助我们轻松的完成一些特定的功能需求.在这里我们就先一起来了解一下Python调用zip命令的使用方法,以此了解这一语言的操作 ...

  8. python导入类有红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...

    python踩坑系列之导入包时下划红线及报错"No module named"问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下 ...

  9. linux 解压所有以zip结尾的文件_在 Linux 上压缩文件:zip 命令的各种变体及用法...

    除了压缩和解压缩文件外,你还可以使用 zip 命令执行许多有趣的操作.这是一些其他的 zip 选项以及它们如何提供帮助. -- Sandra Henry-stocker(作者) 为了节省一些磁盘空间并 ...

最新文章

  1. python属于哪种类型的语言_Python是什么类型的编程语言,有什么特性
  2. linux c socket选项:SO_ERROR
  3. Istio分层架构?80%的人有误解
  4. 解决Failed to load resource: net::ERR_CONNECTION_TIMED_OUT问题
  5. 使用了SAP Spartacus的一个在线网站:乐高Storefront
  6. 【MySQL原理解析】01. 一条SQL查询语句是如何执行的
  7. 漫谈 Clustering (番外篇): Dimensionality Reduction
  8. (转)CocosCreator零基础制作游戏《极限跳跃》五、制作游戏主场景背景滚动
  9. Luogu4438[HNOI/AHOI2018] 道路
  10. 搏一搏,单车变摩托!华为天才少年耗时四月将自行车强势升级为自动驾驶
  11. C语言极速学习开发——51单片机入门编程之使用KeilC51进行代码编译(点亮你心中学习的精神之灯-上)
  12. Digispark(ATTINY85) 微型开发板驱动安装与开发环境配置教程
  13. 挺有意思的文章。。。
  14. 手机邮箱怎么弄_手机邮箱设置
  15. 雅虎搜索架构_雅虎! 想要推动您的网站搜索
  16. 排列组合思维导图_Xmind 进阶教程|高级感满满的思维导图都在使用的6个技巧。...
  17. 2021011206贾天乐实验二
  18. 人体自身的神奇补肾法 ——你在外面花多少钱都学不到的转
  19. Windows 7x64 Ultimate Modified by Michael
  20. linux-文件系统管理10-关于存储介质的那些事儿

热门文章

  1. i春秋2020新春公益赛 GYCTF有关SQL注入题复现
  2. 张效祥:祝贺YOCSEF成立十周年
  3. 如何优雅判断属性值为空
  4. springboot启动错误: 找不到或无法加载主类
  5. 【论文笔记】Urban change detection for multispectral earth observation using convolution neural network
  6. 解决用steam客户端购买游戏验证登录信息失败的方法
  7. 【java逻辑运算】java逻辑运算符的使用与计算
  8. 关于数字档案馆建设实践与思考
  9. 哪些是python_什么是python?_【曾贤志】用Python处理Excel数据 - 第1季 基础篇_Excel视频-51CTO学院...
  10. 说好的团队为质量负责呢?