通过pyspark方式使用xgboost
背景
我们想利用python-spark 从hive中读取特征数据, 调用xgboost算法,进行模型计算。
因为spark会经过yarn调度在hadoop的每个节点进行分布式计算, 而 sklearn是单机版, 因此无法使用sklearn包中的算法集。 我们选用pyspark包, 其中pyspark.ml子包有丰富的算法集,且支持分布式计算,比如有kbeans, 逻辑回归等, 但没有我们这里所说的xgboost算法。
pyspark中引入xgboost
java中有成熟的xgboost包, 并且可以运行在spark中, 所以可以考虑python代码调用java包中的xgboost方法, 也算是曲线救国。
因此我们需要以下包:
- xgboost4j.jar : java的xgboost4j.jar包 下载地址:https://repo1.maven.org/maven2/ml/dmlc/
- xgboost4j-spark: java的spark上使用的xgboost4j-spark ,下载地址: https://repo1.maven.org/maven2/ml/dmlc/,
- sparkxgb.zip: python打包的代码,封装java调用
因为无法直接调用java包, 所以我们用python包装一层适配代码。 调用链路: 业务代码—>sparkxgb—> java包
sparkxgb包并没有发布到pip仓库中, 代码仓库为: https://github.com/sllynn/spark-xgboost
我们可以下载sparkxgb最新release代码: https://github.com/sllynn/spark-xgboost/archive/refs/tags/v0.9.zip
1 |
|
我们的启动脚本如下:
1 |
|
即然需要使用上面三个离线的jar包,和python包, 我们则需要在spark-submit阶段,将包加入到系统环境中
所以需要–jars 引入jar包, —py-files引入sparkxgb包。我们的开发目录如下:
1 |
|
我们执行代码,发现报错,和我们预期不符
bash run.sh 2020-12-21
目前报错:
1 |
|
其他的报错:
1 |
|
在这里阻塞了很长时间,也查询了很多资料, 但网上讲的不够透彻, 核心问题是: spark的版本和内在依赖scala版本 需要和 xgboost4j.jar 和xgboost4j-spark.jar包依赖的版本保持一致!!!! 查看spark版本:
1 |
|
我们再进入到xgboot4j下载页面(https://repo1.maven.org/maven2/ml/dmlc/)
1 |
|
发现下载目录的后缀,即为Scala版本号, 所以这里需要下载和Spark-Scala版本下载一致的即可, 不一致的话,会有各种诡异的兼容问题。
参考文章
- pyspark 数据分析-xgboost : https://zhuanlan.zhihu.com/p/101997567
- sparkxgb包源码: https://github.com/sllynn/spark-xgboost
- xgboot包下载地址: https://repo1.maven.org/maven2/ml/dmlc/
- 主要参考: xgboost的分布式版本(pyspark)使用测试: https://zhuanlan.zhihu.com/p/139722007
- 老版本的实现方式: https://towardsdatascience.com/pyspark-and-xgboost-integration-tested-on-the-kaggle-titanic-dataset-4e75a568bdb
- 源码方式: https://github.com/BogdanCojocar/medium-articles/tree/master/titanic_xgboost
- 另一个实现方式: https://zhuanlan.zhihu.com/p/273756067
- spark版本问题: https://blog.csdn.net/zc_stats/article/details/106974862
- 官方讨论: https://github.com/dmlc/xgboost/issues/1698
- spark-submit提交参数说明 https://blog.csdn.net/xc_zhou/article/details/118617600
- spark模型评估 https://blog.csdn.net/yawei_liu1688/article/details/111881592