如何在Spark中分发xgboost模块?

8
我想在PySpark中使用预训练的XGBoost分类器,但是集群上的节点没有安装XGBoost模块。我可以将已经训练好的分类器进行pickle并广播,但这不够,因为我仍然需要加载模块到每个集群节点。
由于我没有root权限,并且没有共享文件系统,因此无法在集群节点上安装它。
如何分发XGBoost分类器以在Spark中使用?
我对xgboost有一些了解。类似http://apache-spark-user-list.1001560.n3.nabble.com/Loading-Python-libraries-into-Spark-td7059.htmlhttps://dev59.com/uGAf5IYBdhLWcg3wZSBI#24686708这样的方法能行吗?

你是否有个别机器的SSH访问权限?你使用哪种集群管理器? - zero323
1
@zero323 我们使用YARN,但可惜我没有ssh访问机器的权限。我认为我需要找到一种涉及广播“egg”的解决方案。 - Simd
我的真诚建议是找到负责人并强制他们提供所需的库,或者提供可配置的环境(如Anaconda安装)。正确构建和配置本地依赖项不仅关乎您的舒适度,还关乎基本性能。而且差异可能相当大。 - zero323
@zero323 我们在每个集群节点上都安装了Anaconda。这可能有帮助吗? - Simd
@zero323 哦,我只是指Python包 https://docs.continuum.io/anaconda/。 - Simd
显示剩余3条评论
1个回答

2

有一篇来自Cloudera的非常好的博客文章解释了这个问题。所有的功劳都归给他们。

但是简单回答你的问题 - 不可能。任何复杂的第三方依赖关系都需要安装在集群的每个节点上并正确配置。对于简单的模块/依赖项,可以创建*.egg*.zip*.py文件,并使用--py-files标志在spark-submit中将它们提供给集群。

然而,xgboost是一个数值包,不仅严重依赖其他Python包,还依赖特定的C++库/编译器 - 这是底层的。如果你要向集群提供已编译的代码,可能会遇到因硬件架构不同而引起的错误。加上集群通常在硬件方面是异构的,这样做是非常糟糕的。


谢谢这个。你能提供更多细节吗?比如硬件是同质的,并且你有xgboost的安装包吗? - Simd
1
很遗憾,我从未以这种方式使用过它。完全诚实地说,由于库的复杂性,它可能不起作用。使用egg的方法可能仅适用于简单的软件包。此外,如果您希望将其投入生产,则需要找到另一种方法。如果不是,那么您可能可以访问一个集群并自己安装Python。我建议避免使用egg方法。 - bear911

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接