参考:
http://blog.csdn.net/u010306433/article/details/51403894
注意点:
1.各个软件的版本(gcc/cmake)
2.选择相同版本hadoop源码,且libhdfs 要自己编译,参数加上 cmake -DGENERATED_JAVAH=/opt/jdk1.8.0_60 -DJAVA_HOME=/opt/jdk1.8.0_60 即可
3.xgboost编译:
config.mk文件中修改:
USE_HDFS = 1
HADOOP_HOME=/export/App/hadoop-2.7.4
HDFS_LIB_PATH=/data1/user/software/hadoop-2.7.4-src/hadoop-hdfs-project/hadoop-hdfs/src/target/usr/local/lib (新编译的libhdfs文件)
xgboost/dmlc-core/make 下面的config.mk配置也要修改:USE_HDFS = 1
4.环境变量:
export HADOOP_HOME=/export/App/hadoop-2.7.4
export LD_LIBRARY_PATH=/data1/user/software/hadoop-2.7.4-src/hadoop-hdfs-project/hadoop-hdfs/src/target/usr/local/lib:$LD_LIBRARY_PATH
export CLASSPATH=$CLASSPATH:`hadoop classpath --glob` #防止出现之类的错误(src/io/hdfs_filesys.cc:95: Failed to load HDFS-configuration xgboost读取不到hadoop本地的包)
5.运行例子:
(1).xgboost/tests/distributed目录下的bash文件可以测试是否和hdfs是通的
(2).到demo/distributed-training目录下:
../../dmlc-core/tracker/dmlc-submit --cluster=yarn --num-workers=2 ../../xgboost mushroom.hdfs.conf nthread=2\ data=hdfs://A03-R07-I25-28.JD.LOCAL:9000/data/xgboostyarn/input/agaricus.txt.train eval[test]=hdfs://A03-R07-I25-28.JD.LOCAL:9000/data/xgboostyarn/output/agaricus.txt.test model_dir=hdfs://A03-R07-I25-28.JD.LOCAL:9000/data/model3
mushroom.hdfs.conf 是xgboost有关参数的文件
注意hdfs的路径
http://dmlc.ml/2016/03/14/xgboost4j-portable-distributed-xgboost-in-spark-flink-and-dataflow.html
xgboost4j基于rabit通信
git clone --recursive https://github.com/dmlc/xgboost
checkout 到release_0.72的分支下
cd jvm-package 下
更改pom.xml文件
添加:
ml.dmlc
xgboost4j
0.72
和
GitHub Repo
GitHub Repo
https://raw.githubusercontent.com/CodingCat/xgboost/maven-repo/
并修改create_jni.py 文件修改 USE_HDFS 为ON
保持有外网环境(或者无外网,拷贝用户目录下的.m2/repository(已经编译通过)文件到无外网的服务器上)
其他依赖cmake 3.5.2、 有hadoop环境、mvn3.5.4、scala 2.11.8、jdk1.8、spark2.1.0、 g++-4.8.5
在jvm-package下执行mvn clean packages
编译成功会生成jvm-packages/xgboost4j-spark/target/xgboost4j-spark-0.72.jar 和jvm-packages/xgboost4j/target/xgboost4j-0.72.jar
拷贝以上两个文件到服务器上
spark-shell --master yarn --driver-memory 16G --executor-memory 4G --num-executors 24 --jars /home/bi_polaris/yujunjun/test/xgboost4j-spark-0.72.jar,/home/bi_polaris/yujunjun/test/xgboost4j-0.72.jar 2>log
启动 然后测试 xgboost4j-example里面的测试脚本即可
安装到mvn仓库
安装scala/java的jvm版xgboost:
$ cd jvm-packages/xgboost4j
$ mvn install:install-file -Dfile=target/xgboost4j-0.72.jar -DgroupId=ml.dmlc -DartifactId=xgboost4j -Dversion=0.72 -Dpackaging=jar
安装spark版的xgboost:
$ cd jvm-packages/xgboost4j-spark
$ mvn install:install-file -Dfile=target/xgboost4j-spark-0.72.jar -DgroupId=ml.dmlc -DartifactId=xgboost4j-spark -Dversion=0.72 -Dpackaging=jar
Maven pom.xml file:
<dependency>
<groupId>ml.dmlcgroupId>
<artifactId>xgboost4j-sparkartifactId>
<version>0.72version>
dependency>
Spark code,参考https://github.com/dmlc/xgboost/tree/master/jvm-packages/下examples,分别有RDD版本和DataFrame版本:
import ml.dmlc.xgboost4j.scala.spark.XGBoost
注意点:
参数nWorker设置的问题,而nWorker的说明如下:
the number of xgboost workers, 0 by default which means that the number of workers equals to the partition number of trainingData RDD
从train中可以看到,nWorker首先要大于0,把train数据集coalesce为nWorker的数目(前提是数据集partition数目大于nworker数目)否则后多一步repartition:
if (numWorkers != trainingData.partitions.length) {
logger.info(s"repartitioning training set to $numWorkers partitions")
trainingData.repartition(numWorkers)
} else {
trainingData
}
在设置nWorker的时候,数值要小于executors的数量。