Blog of Samperson

零起点Centos+Hadoop+xgboost部署 (伪分布式)

2018-05-16

在这里要对薛老师表示感谢。

安装Hadoop

[1] 下载地址:https://archive.apache.org/dist/hadoop/common/hadoop-2.8.5/
下载hadoop-2.8.5.tar.gz
[2] 解压到/usr/local/hadoop,并重命名为hadoop(方便后续)

修改配置文件

所有配置文件都在/hadoop/etc/hadoop下。
[1] core-site.xml:该配置文件用于指明namenode的主机名和端口,hadoop临时目录。

1
2
3
4
5
6
7
8
9
10
11
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://0.0.0.0:9000</value>
</property>
<!-- 指定hadoop运行时产生文件的存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/hadoop/temp</value>
</property>
</configuration>

[2] hdfs-site.xml:默认副本数3,修改为1,dfs.namenode.name.dir指明fsimage存放目录,多个目录用逗号隔开。dfs.datanode.data.dir指定块文件存放目录,多个目录逗号隔开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
   <property>
<name>dfs.namenode.name.dir</name>
<value>/usr/local/hadoop/tmp/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>/usr/local/hadoop/tmp/hdfs/data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.http.address</name>
<value>0.0.0.0:50070</value>
</property>
</configuration>

[3] mapred-site.xml

1
2
3
4
5
6
7
<configuration>

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

[4] yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<configuration>
<!-- Site specific YARN configuration properties -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>localhost</value>
</property>
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>20480</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.nodemanager.vmem-pmem-ratio</name>
<value>2.1</value>
</property>
<property>
<name>yarn.resourcemanager.address</name>
<value>0.0.0.0:8032</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>0.0.0.0:8030</value>
</property>
<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>0.0.0.0:8031</value>
</property>
</configuration>

运行Hadoop

[1] 进入Hadoop安装目录:cd /usr/local/hadoop
[2] 初始化namenode:hdfs namenode -format
[3] 启动hdfs (注意在root权限下,否则会报错,下同):sbin/start-dfs.sh
[4] 验证hdfs是否启动:访问http://localhost:50070 ,看是否进入正常界面
[5] 启动yarn:sbin/start-yarn.sh
[6] 验证yarn是否启动:访问http://localhost:8088 ,看是否进入正常界面

常见错误:Error: JAVA_HOME is not set and could not be found
/usr/local/hadoop中修改语句export JAVA_HOME=$JAVA_HOME
保存后退出
查看JAVA_HOME可以使用:

1
2
3
4
whereis java
which java # java执行路径
echo $JAVA_HOME
echo $PATH

测试:运行Hadoop示例

[1] 进入Hadoop安装目录:cd /usr/local/hadoop
[2] 在hdfs上创建自己的用户目录:hdfs dfs -mkdir -p /user/root/input
[3] 验证是否创建成功:hadoop dfs -ls /user/root/input,此时无文件,因此不显示任何内容
[4] 然后将需要统计的文件上传到hdfs上。其中/etc/hadoop/*.xml是要上传的文件的路径:
hdfs dfs -put /usr/local/etc/hadoop/*.xml /user/root/input
[5] 验证是否上传成功:hadoop dfs -ls /user/root/input,此时有文件
[6] 运行测试jar:
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.0.jar grep input output 'dfs[a-z.]+'
[7] 查看运行之后的产生的output文件夹下的信息:hdfs dfs -cat output/part-r-00000


以上是安装和运行Hadoop的过程。

xgboost分布式部署

下载xgboost

[1] clone最新版xgboost:git clone --recursive https://github.com/dmlc/xgboost
[2] 在${HOME}创建xgboost-package目录,将xgboost拷贝到其下:

1
2
mkdir xgboost-package
cp -r xgboost xgboost-package

安装编译依赖的包

[1] 安装gcc:sudo yum install gcc
[2] 由于yum是最小安装,因此还需要安装编译C++的包:yum install gcc-c++
[3] 安装cmake:sudo yum install cmake
[4] 安装jdk:sudo yum install java-1.7.0-openjdk-devel

注意一定要安装openjdk,安装oracle的jdk可能会导致后面找不到包;
另外要安装devel版本,这个版本包括jre和jvm。

[5] 安装python:centos自带python2.x相关包。

下载编译libhdfs

[1] 下载hadoop-common-cdh5-2.6.0_5.5.0:https://github.com/cloudera/hadoop-common/tree/cdh5-2.6.0_5.5.0/
[2] 解压:unzip hadoop-common-cdh5-2.6.0_5.5.0.zip
[3] 到src目录下:cd hadoop-common-cdh5-2.6.0_5.5.0/hadoop-hdfs-project/hadoop-hdfs/src
[4] cmake:cmake -DGENERATED_JAVAH=/opt/jdk1.8.0_60 -DJAVA_HOME=/opt/jdk1.8.0_60
[5] make:make
[6] 拷贝编译好的目标文件到xgboost-package中,两个位置都需要:

1
2
cp -r target/usr/local/lib ${HOME}/xgboost-package/libhdfs
cp -r target/usr/local/lib ${HOME}/xgboost-package/xgboost/libhdfs

编译xgboost

[1] 进入xgboost目录,拷贝配置文件:cp make/config.mk config.mk
[2] 更改config.mk使用HDFS配置,可以修改一下$(HOME)

1
2
3
USE_HDFS = 1
HADOOP_HOME = /usr/local/hadoop
HDFS_LIB_PATH = $(HOME)/xgboost-package/libhdfs

[3] 编译:make -j4,可能需要消耗一段时间

测试

[1] 修改错误文件

当前版本xgboost代码中存在错误,修改 $(HOME)/xgboost-package/xgboost/dmlc-core/tracker/dmlc_tracker/submit.py,注释掉其中包含kubernetes的代码行(第11、53、54行)

[2] 创建data文件夹:hadoop dfs -mkdir -p /xgboost/data
[3] 上传文件:

1
2
3
cd $(HOME)/xgboost-package
hadoop -put ./xgboost/demo/data/agaricus.txt.test /xgboost/data
hadoop -put ./xgboost/demo/data/agaricus.txt.train /xgboost/data

[4] 进入测试目录:cd xgboost/dmlc-core/tracker
[5] 提交

1
2
3
4
5
dmlc-submit —cluster=yarn —num-workers=2 —worker-cores=2\
> ../../xgboost mushroom.aws.conf nthread=2\
> data=///xgboost/data/agaricus.txt.train\
> eval[test]=hdfs://0.0.0.0:9000/xgboost/data/agaricus.txt.test\
> model_dir=hdfs://0.0.0.0:9000/xgboost/model_new

参考资料

[1] 手把手教你安装mac版hadoop2.7.3教程 https://www.cnblogs.com/landed/p/6831758.html
[2] xgboost分布式部署教程 https://blog.csdn.net/u010306433/article/details/51403894
[3] Distributed XGBoost YARN on AWS http://xgboost.readthedocs.io/en/latest/tutorials/aws_yarn.html