0.前言
XGBoost4J-Spark能够让我们在Spark上玩XGBoost,对于海量数据来说应该是很有用的。这篇文章主要介绍了将其官网提供的Demo部署在Linux上运行的全过程。通过此Demo在Spark上用XGBoost完成iris数据集的多分类任务。
此次选用的是最新的稳定版XGBoost4J-Spark 1.0.0,之前0.81版本的Windows部署可以参考这里。不过其实都是互通的,两边都看看也无妨。我这里会将我选择、填坑时的思路全部记录下来,需要注意的地方我会用这样进行标注,以供你参考,(●´З`●)。
1.确认版本
作为最基础的demo,要考虑的版本包括:
- XGBoost4J-Spark
- Scala
- Spark
- Python
- Hadoop
- Java
在安装之前一定要根据自己的配置选择合适的版本,确保两两之间版本契合,否则后面会报一堆错。我选择的版本如下:
模块 | 版本号 |
---|---|
XGBoost4J-Spark | 1.0.0 |
Scala | 2.11.8 |
Spark | 2.4.5 |
Python | 3.5.2 |
Hadoop | 2.6 |
Java | 1.8.0 |
具体考量如下:首先是选择了当前的最新稳定版——1.0.0的XGBoost4J-Spark,然后在它的官网文档里发现0.9之后的版本仅支持Spark2.4+了,具体原因摘抄在下面:
XGBoost4J-Spark now requires Apache Spark 2.4+. Latest versions of XGBoost4J-Spark uses facilities of org.apache.spark.ml.param.shared extensively to provide for a tight integration with Spark MLLIB framework, and these facilities are not fully available on earlier versions of Spark.
但我Spark是卑微的2.2.0,只能重新装一个高版本了。然后选择了Spark 2.4.5 Prebuild for Apache Hadoop 2.6。这里Hadoop的版本2.6.0就确定好了,好在Hadoop和Spark互通这块网上排坑指南比较多,在实际操作时这块也没出问题,甚至我用的是hadoop-2.6.0-cdh5.7.0也没啥问题,好评。然后这里有个点请注意一下,在Spark下载界面有这么一段话:
Note that, Spark is pre-built with Scala 2.11 except version 2.4.2, which is pre-built with Scala 2.12.
所以对于Spark 2.4.5来说,给咱们的jars是基于Scala 2.11的(当然你也可以选择 Pre-built with Scala 2.12 and user-provided Apache Hadoop这个版本,然而我试了一下发现在spark-submit这个版本的时候坑太多了,比起填这个坑还是转Scala2.11简单点,遂弃之)。
于是Scala的大版本也确定好了,在选择Scala的时候小心每个小版本里也有很多更迭,导致一些方法找不到,最后在尝试过很多小版本后敲定了Scala 2.11.8,至少在这个Demo里没有表现出特别的问题。
另外提一嘴Python,版本需要2.7+,尽量就Python 3+就完事了,不然会在训练的时候报错ImportError: No module named argparse
,从而导致出现XGBoostError: XGBoostModel training failed
这种诡异的错误。
JDK就是1.8.0,没啥好说的,也没出问题,就写在这以防有老哥要看。
2.Maven配置
要注意各个版本的一一对应,要查包的对应版本的话请在MvnRepository里查找关键字。
这里直接放整体的pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.taipark.xgboost</groupId>
<artifactId>sonarAnalysis</artifactId>
<version>1.0</version>
<inceptionYear>2008</inceptionYear>
<properties>
<scala.version>2.11.8</scala.version>
</properties>
<repositories>
<repository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>scala-tools.org</id>
<name>Scala-Tools Maven2 Repository</name>
<url>http://scala-tools.org/repo-releases</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>${scala.version}</version>
</dependency>
<dependency>
<