在 Spark 执行器节点上安装 Python 依赖项的最简单方法?

2024-04-22

据我所知,您可以将单个文件作为 Python Spark 程序的依赖项发送。但是成熟的库(例如 numpy)呢?

Spark 是否有办法使用提供的包管理器(例如 pip)来安装库依赖项?或者这必须在 Spark 程序执行之前手动完成?

如果答案是手动,那么在大量分布式节点上同步库(安装路径、版本等)的“最佳实践”方法是什么?


实际上,在实际尝试过之后,我认为我作为评论发布的链接并不能完全满足您对依赖项的要求。您相当合理地要求的是一种让 Spark 在安装依赖项方面与 setuptools 和 pip 很好地配合的方法。令我震惊的是,Spark 并没有更好地支持这一点。第三方依赖问题在通用 Python 中很大程度上得到了解决,但在 Spark 下,似乎假设您将回到手动依赖管理或其他方式。

我一直在使用一个不完美但功能齐全的管道虚拟环境 https://pypi.python.org/pypi/virtualenv。基本思想是

  1. 纯粹为您的 Spark 节点创建 virtualenv
  2. 每次运行 Spark 作业时,运行一个新的pip install您自己的所有内部 Python 库。如果您已设置这些setuptools,这将安装它们的依赖项
  3. 压缩 virtualenv 的 site-packages 目录。这将包括工作节点需要的库及其依赖项,但不包括它们已经拥有的标准 Python 库
  4. 通过单.zip文件,包含您的库及其依赖项作为参数--py-files

当然,您可能需要编写一些帮助程序脚本来管理此过程。这是一个根据我一直在使用的脚本改编的帮助程序脚本,无疑可以进行很大的改进:

#!/usr/bin/env bash
# helper script to fulfil Spark's python packaging requirements.
# Installs everything in a designated virtualenv, then zips up the virtualenv for using as an the value of
# supplied to --py-files argument of `pyspark` or `spark-submit`
# First argument should be the top-level virtualenv
# Second argument is the zipfile which will be created, and
#   which you can subsequently supply as the --py-files argument to 
#   spark-submit
# Subsequent arguments are all the private packages you wish to install
# If these are set up with setuptools, their dependencies will be installed

VENV=$1; shift
ZIPFILE=$1; shift
PACKAGES=$*

. $VENV/bin/activate
for pkg in $PACKAGES; do
  pip install --upgrade $pkg
done
TMPZIP="$TMPDIR/$RANDOM.zip" # abs path. Use random number to avoid clashes with other processes
( cd "$VENV/lib/python2.7/site-packages" && zip -q -r $TMPZIP . )
mv $TMPZIP $ZIPFILE

我有一组其他简单的包装脚本,用于提交我的 Spark 作业。我只是首先调用此脚本作为该过程的一部分,并确保在运行时将第二个参数(zip 文件的名称)作为 --py-files 参数传递spark-submit(如评论中所述)。我总是运行这些脚本,所以我永远不会意外地运行旧代码。与 Spark 开销相比,对于我的小型项目来说,打包开销是最小的。

可以进行大量改进 - 例如,明智地选择何时创建新的 zip 文件,将其分成两个 zip 文件,一个包含经常更改的私有包,另一个包含很少更改的依赖项,这些依赖项不需要经常被重建。在重建 zip 之前,您可以更聪明地检查文件更改。检查论点的有效性也是一个好主意。但目前这足以满足我的目的。

我提出的解决方案并不是专为像 NumPy 这样的大规模依赖项而设计的(尽管它可能适用于它们)。此外,如果您正在构建基于 C 的扩展,并且您的驱动程序节点与集群节点具有不同的体系结构,则它将无法工作。

我在其他地方看到过建议只运行 Python 发行版,例如Anaconda https://www.continuum.io/why-anaconda在所有节点上,因为它已经包含 NumPy (并且许多其他包 http://docs.continuum.io/anaconda/pkg-docs),这可能是让 NumPy 以及其他基于 C 的扩展运行的更好方法。无论如何,我们不能总是期望 Anaconda 在正确的版本中拥有我们想要的 PyPI 包,此外你可能无法控制你的 Spark 环境能够将 Anaconda 放在上面,所以我认为这个基于 virtualenv 的方法还是有帮助的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spark 执行器节点上安装 Python 依赖项的最简单方法? 的相关文章

  • Emacs 强制组织模式捕获缓冲区在新窗口中打开

    如何强制组织模式的捕获缓冲区在新窗口中打开 我试过 setq special display regexps Capture 但它不起作用 我立即看到一个新窗口 然后 org mode 进行两个垂直分割 我使用 3 个垂直分割 并将捕获缓冲
  • ruby 调试和黄瓜

    我在 Cucumber 中遇到了失败的情况 我想使用 ruby debug 来调试我的 Rails 控制器 但是 如果我将 调试器 添加到我想要中断的位置 它就不会停止 我尝试将 ruby debug 和 ruby gems 的 requi
  • f# 运行总计序列

    好吧 这看起来应该很容易 但我就是不明白 如果我有一个数字序列 如何生成由运行总计组成的新序列 例如 对于序列 1 2 3 4 我想将其映射到 1 3 6 10 以适当的功能方式 Use List scan https msdn micro
  • Lua中按字符分割字符串

    我有像这样的字符串 ABC DEF 我需要将它们分开 字符并将两个部分分别分配给一个变量 在 Ruby 中 我会这样做 a b ABC DEF split 显然Lua没有这么简单的方法 经过一番挖掘后 我找不到一种简短的方法来实现我所追求的
  • 增加浏览器缩放时 mediaelement.js 音量控制混乱

    媒体元素2 12 0 这种情况仅发生在 FF 和 Chrome 中 而不会发生在 IE 或 Opera 中 导航到具有媒体元素播放器的网站内容后 甚至导航到媒体元素首页http mediaelementjs com http mediael
  • 我可以在方法体内使用注释吗?

    允许 Java 注释的语义将它们放置在某处在函数体内 例如注释特定的函数调用 语句或表达式 例如 class MyClass void theFunc Thing thing String s null Catching NullPoint
  • Mink 不适用于 behat 3.0.12

    我安装了 Behat Mink 和其他一些相关的软件包 这是我的composer json 文件 require behat behat 3 0 6 behat symfony2 extension dev master behat min
  • 当按多列分组时,如何命名 dplyr 中的 group_split 列表

    我在 dplyr 中使用 group split 在分割了多个列后 我很难命名列表 当我们按一列分组时 我知道该怎么做here https stackoverflow com questions 57107721 how to name t
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec
  • 如何绕过警告意外的任何。指定不同的类型 @typescript-eslint/no-explicit-any

    我们有严格的零棉绒问题政策 这意味着所有错误和警告都需要修复 在我们的 React typescript 项目中面临这个 lint 错误 warning Unexpected any Specify a different type typ
  • Bootstrap 轮播中的 Href

    我一直在Interwebz上搜索 但似乎找不到答案 如何在轮播链接中添加 href 我尝试将 a 标签放在 h1 标签之外 但它破坏了滑块本身的功能 这是我的代码 div class col sm 12 div class carousel
  • 如何在sql中查询xml列

    我在 SQL Server 2008 上有一个表 T1 其中包含一个 XML 列 EventXML 我想查询某个节点包含特定值的所有行 更好的是 我想检索不同节点中的值 表T1 T1 EventID int EventTime dateti
  • 将背景图像放入菱形容器中会导致容器失去形状

    标题总结得很好 我可以很容易地绘制菱形 但是当我将图像添加到背景时 它会为形状添加更多边 我似乎无法弄清楚为什么添加背景图像时会发生这种情况 任何意见 将不胜感激 这是我的代码 请原谅内联 css 我只是这样做 直到我有一个可行的解决方案
  • 使用node.js/Express从HTTP重定向到HTTPS

    有什么方法可以更改我的 Web 应用程序以侦听 HTTPS 而不是 HTTP 我正在使用node js express 我需要它来侦听 HTTPS 因为我正在使用地理定位 而 Chrome 不再支持地理定位 除非从 HTTPS 等安全上下文
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功
  • vcproj/vsprops 的可选环境变量

    有没有办法在项目文件 有或没有 vsprops 中进行环境变量替换 如果找不到该变量 则用默认值替换 我还没有找到任何方法来做到这一点 因为一切似乎都会覆盖环境变量 编辑 我需要它为属性工作 而不是为环境变量工作 具体来说 可以使用指定目标
  • Carrierwave 在文件上传时抛出“堆栈级别太深”错误

    我有一个奇怪的问题 不知道如何进一步调试 如果我用 html 表单上传文件 我会得到 SystemStackError stack level too deep 痕迹是 Started POST global accounts 82 for
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 为什么在嵌套类上调用方法时不调用父类的静态构造函数?

    给出以下代码 为什么在 Main 的第一行之后没有调用 Outer 的静态构造函数 namespace StaticTester class Program static void Main string args Outer Inner
  • firefox 不支持 mediastreamtrack.getsources,如何执行等效操作

    有没有等效的方法来获取连接到 PC 的视频设备列表 除了内置网络摄像头连接之外 我还有一个外部网络摄像头连接 mediastreamtrack getsources 在 Chrome 中工作 但 Firefox 报告 TypeError M

随机推荐

  • R:循环数据框,根据日期提取数据子集

    我有一个大型数据框 其中包含如下所示的数据 date w x y z region 1 2012 01 21 43 12 3 NORTH 2 2012 02 32 54 21 16 NORTH 3 2012 03 14 32 65 32 N
  • Java中的构造函数和new运算符

    从类创建新对象Student在Java中我们通常使用以下语句 Student std new Student 我读过 new 运算符通过在堆中分配内存空间来创建新对象 但是我还读到调用构造函数Student 创建它 所以 这有点令人困惑 哪
  • 如何在 Hamcrest 中使用(原始)自动装箱/加宽?

    我碰到https code google com p hamcrest issues detail id 130 https code google com p hamcrest issues detail id 130为 Hamcrest
  • 为什么 where 子句中不允许使用聚合函数

    我正在寻求对此的澄清 我在下面写了两个查询 我们有一个员工姓名表 其中包含 ID 姓名 薪水列 1 Select name from employee where sum salary gt 1000 2 Select name from
  • 将开发团队从 FTP 转换为版本控制系统

    我在一家小型 LAMP 开发工作室工作 那里的想法是完成代码并继续处理列表中的下一项 该团队在 Zend Studio 5 5 中工作 通过 FTP 或 SFTP 连接到 Live 服务器 他们喜欢的是代码部署的速度 因为它只是修改实时代码
  • Maven:根据配置文件选择父项目

    我有一个 Maven 项目 它是 jenkins 的插件 它的父级应该是
  • 缩减规模时 EC2 Spot 实例终止通知

    每次安排终止我的现货实例时 我都需要运行清理脚本 我有两个终止的理由 现货实例的价格超出了我的出价 由于自动伸缩组的伸缩策略导致的缩容 基于5分钟集群平均CPU使用率 随机实例终止 我确实喜欢下面的简单脚本this http blog fu
  • 如何停止在从 Google 云端硬盘下载时记住和应用文件扩展名

    我上传了混合负载的文件 图像 文档 pdf 所有文件扩展名为 dc 文件是否根据基础类型进行转换 作为迁移过程的一部分 我使用 Google Apps 脚本重命名这些文件并应用适当的文件扩展名 例如 pdf 选择其中任何文件并将结果下载到扩
  • 遍历数组并以项目符号显示

    我想遍历这个数组并显示 评论 作为要点 Array 1 gt Array id gt 1 comment gt a parent id gt 0 children gt Array 3 gt Array id gt 3 comment gt
  • 在尝试删除文件之前检查文件是否已打开[重复]

    这个问题在这里已经有答案了 在尝试删除文件之前如何检查文件是否已打开 以编程方式 像这样的东西 if file is open close it first delete file 由于某些原因 我认为这不会起作用 没有标准的 Java 机
  • 如何在c#中访问面板中的控件

    我在 c winforms 中使用面板 并使用循环用图片框的编号填充面板 例如面板名称为panal foreach string s in fileNames PictureBox pbox new new PictureBox pBox
  • boto3 copy 与 copy_object 有关 s3 中文件权限 ACL 的比较

    当我使用不同的键和前缀将对象复制到同一存储桶后 我相信这类似于重命名 其公共读取权限被删除 import boto3 s3 boto3 resource s3 copy source Bucket mybucket Key mykey s3
  • 如何使 volatile count++ 操作成为线程安全的

    我一直在经历 JCIP 作者说 线程限制的一个特殊情况适用于易失性变量 只要确保 volatable 变量仅从单个线程写入 对共享 volatile 变量执行读取 修改 写入操作是安全的 例如 count 被认为是一个复合操作 读取值 加一
  • 将 certifi 模块与 urllib2 一起使用?

    我有使用 urllib2 模块下载 https 页面时遇到问题 https stackoverflow com questions 33264502 windowserror error 5 access is denied using u
  • Laravel 外键下拉列表

    我有 2 张桌子 客户 id 全名 公司 ID 公司 id 公司名称 我已经创建了两个表之间的关系 并且工作正常 因为我可以在客户视图中显示公司名称 如下所示 customer gt company gt company name 我现在与
  • 无法在 IntelliJ IDEA 中打开调试器端口

    我有一个问题 无法使用 IntelliJ IDE 在调试模式下设置应用程序 但运行模式可以 我的操作系统是Windows 7 IDE是IntelliJ IDEA Web容器是Tomcat 6 我尝试了很长时间 更改了HTTP端口和JMX端口
  • 如何将数据库备份到 .bak 文件?

    我有一个在 Visual Studio 2008 中创建的网站 我需要将其上线 如何将数据库文件备份到 bak 以便将其交给托管公司放置在服务器上 从 SQL 提示符处 BACKUP DATABASE MyDatabase TO DISK
  • SSRS 2008 R2 到 SSRS 2016 迁移

    我必须将 770 个 SSRS 报告 包括本机模式和 Sharepoint 模式报告 从 2008 R2 版本迁移到 SSRS 2016 版本 哪个是 SSRS 迁移的最佳工具 我见过很少的工具 如 Microsoft Reporting
  • 如何将日期列表转换为字符串列表

    我正在尝试在谷歌电子表格中打印出日期列表 到目前为止我有以下脚本 它可以很好地获取日期列表 但我需要知道如何将此日期列表转换为日期列表字符串 def daterange startdate enddate r enddate datetim
  • 在 Spark 执行器节点上安装 Python 依赖项的最简单方法?

    据我所知 您可以将单个文件作为 Python Spark 程序的依赖项发送 但是成熟的库 例如 numpy 呢 Spark 是否有办法使用提供的包管理器 例如 pip 来安装库依赖项 或者这必须在 Spark 程序执行之前手动完成 如果答案