H2O-3机器学习平台是一个非常适合非专业人士学习机器学习的平台,自带WebUI,效果还是蛮不错的,官方也提供了jar包,一条命令就能直接运行,非常方便,但最近有源码编译的需求,实际操作过程中,发现,想要编译它的源码,真的比登天还难!
主要是因为,github的源码可以说是日更,成百上千的分支看的人眼花缭乱,而且编译说明文档是世纪更,可当前主线的代码完全对不上。
照着它的编译说明文档操作,绝对掉坑里爬不出来。在此记录一下我的具体编译流程:
一、虚拟机部署Centos7系统
下载Centos7镜像文件,使用版本“CentOS-7-x86_64-DVD-2009”,下载地址:https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
虚拟机安装centos7过程不在叙述,可参考:
VMware ESXI centos7虚机搭建详解(避坑必看)_esxi安装iso虚机-CSDN博客
虚拟机安装Centos7系统实操教程 详尽步骤 vmware ESXi亲测通过 - 运维全实践 - 博客园 (cnblogs.com)注意安装过程中,软件选择“基础设施服务器”
二、部署H2O-3环境
官方使用了jdk-7u79版本,编译会出现“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target”错误,所以弃用。
完整环境部署代码如下:
cd /opt
sudo wget https://packages.baidu.com/app/jdk-8/jdk-8u121-linux-x64.tar.gz
sudo tar xzf jdk-8u121-linux-x64.tar.gz
cd jdk-8u121-linux-x64
sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_121/bin/java 2
sudo alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_121/bin/jar 2
sudo alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_121/bin/javac 2
sudo alternatives --set jar /opt/jdk1.8.0_121/bin/jar
sudo alternatives --set javac /opt/jdk1.8.0_121/bin/javac
cd /opt
sudo wget https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
sudo rpm -ivh epel-release-7-14.noarch.rpm
sudo echo "multilib_policy=best" >> /etc/yum.conf
sudo yum -y update
sudo yum -y install R R-devel git python-pip openssl-devel libxml2-devel libcurl-devel gcc gcc-c++ make openssl-devel kernel-devel texlive texinfo texlive-latex-fonts libX11-devel mesa-libGL-devel mesa-libGL nodejs npm python-devel numpy scipy python-pandas
yum install python3-pip
pip3 install --upgrade pip
pip3 install scikit-learn grip tabulate statsmodels wheel
mkdir ~/Rlibrary
export JAVA_HOME=/opt/jdk1.8.0_121
export JRE_HOME=/opt/jdk1.8.0_121/jre
export PATH=$PATH:/opt/jdk1.8.0_121/bin:/opt/jdk1.8.0_121/jre/bin
export R_LIBS_USER=~/Rlibrary
# install local R packages
R -e 'install.packages(c("RCurl","jsonlite","statmod","devtools","roxygen2","testthat"), dependencies=TRUE, repos="http://cran.rstudio.com/")'
cd
git clone https://github.com/h2oai/h2o-3.git
cd h2o-3
注意: h2oai的代码更新频率非常高,基于我编译时的版本拉了一个fork,如果你从官方拉的源代码编译时有问题,可以用我当前使用的代码:
git clone https://github.com/mogu1990/h2o-3.git
三、修改H2O-3代码
第一处:h2o-3/h2o-r/scripts/package_version_check_update.R
将文件末尾的代码:
dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))
repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
pkgs <- packages.dcf(dcf.file, which = "all")
# try on windows/macosx
ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to date
if (!interactive()) {
expect TRUE
status <- if (isTRUE(ans)) 0 else 1
q("no", status=0)
}
修改为:
#dcf.file <- seek.files(c("h2o-3-DESCRIPTION.template","h2o-3-DESCRIPTION"))
#repos <- c(repos.dcf(dcf.file), "http://s3.amazonaws.com/h2o-r/cran-dev")
#pkgs <- packages.dcf(dcf.file, which = "all")
# try on windows/macosx
#ans <- pkgs_check_update(pkgs, check_only=check_only, repos=repos) #, force_install="data.table") # allows to be fully up to date
if (!interactive()) {
# expect TRUE
#status <- if (isTRUE(ans)) 0 else 1
q("no", status=0)
}
目的就是关闭它的R包更新检测,因为代码里请求的“http://s3.amazonaws.com/h2o-r/cran-dev”压根就打不开!!!让人震惊。
第二处:h2o-3/h2o-bindings/build.gradle
将第13、14行代码:
pythonexe = findProperty("pythonExec") ?: "python"
pipexe = findProperty("pipExec") ?: "pip"
改为:
pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"
这是因为,它最开始用的python2.7版本,但现在python2.7已经不支持更新,很多包用不成,所以要换成python3和pip3。
第三处:h2o-3/h2o-py/build.gradle
和第二处同理,第11、12行,改成
pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"
第四处:h2o-3/h2o-py-cloud-extensions/build.gradle
和第二处同理,第9、10行,改成
pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"
第五处:h2o-3-master/h2o-py-mlflow-flavor/build.gradle
和第二处同理,第9、10行,改成
pythonexe = findProperty("pythonExec") ?: "python3"
pipexe = findProperty("pipExec") ?: "pip3"
第二处到第五处的修改实际上都是把python换成python3,pip换成pip3,有个取巧的办法,就是把python的软链接指向python3,pip的软链接指向pip3,就免的修改第2-第5处。
三、开始编译
官方文档说要执行:
./gradlew syncSmalldata
./gradlew syncRPackages --info
./gradlew build -x test --info
实际发现,./gradlew syncSmalldata不用执行,因为它是下载了一堆的csv文件用来测试的,下载的具慢,不要执行。所以我们应该这么执行:
./gradlew syncRPackages --info
先执行R包的同步更新,如果不修改第一处,这里绝对报错,执行成功后再执行:
./gradlew build -x test --info
这里千万要把-x test加上,如果不加,默认就要进行测试校验,问题一大堆,绝对编译失败。
编译成功后,bulid目录下会生成h2o.jar文件。使用命令
java -jar h2o.jar
即可启动服务,不报错的情况下,浏览器访问http://ip:54321即可打开web界面。
为啥访问不到?记着关闭centos7的防火墙!