hadoop集群使用sklearn进行模型训练

来源:互联网 发布:windows源代码谁写的 编辑:程序博客网 时间:2024/06/06 02:29
为了证实sklearn可以放到hadoop上使用,特别进行了本次试验,但试验中遇到一个疑问,就是reducer节点只能设置为1,那么跟单机训练是否一样了,这个问题目前无法解答。但是,sklearn确实可以通过hadoop方式进行模型训练。

一、安装环境
服务器默认python版本
[root@hadooptest77 ~]# python -V
Python 2.6.6
需要在所有nodemanager节点上安装这些包。
安装pip
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py
[root@hadooptest ~]# pip -V
pip 9.0.1 from /usr/lib/python2.6/site-packages (python 2.6)
yum install -y gcc gcc-c++
pip install numpy==1.6.2
pip install scipy==0.16.1
pip install scikit-learn==0.16
(Python 2.6.6只能安装0.16,安装0.17或以上的会报错)
pip install setuptools --upgrade
pip install pandas==0.10.0
(Python 2.6.6只能安装0.10.0,安装新版本会报错)

二、准备数据
训练的数据:
$ cat test.txt10,80,4698,0,3668,200,3715,200,2087,300,2468,230,2977,40,3639,0,4366,330,1989,180,364

三、代码:

1、mapper、reducer代码

$ cat test_sklearn.py#!/usr/bin/python# -*- coding: utf-8 -*-import osimport sys#import pandas  //使用pandas会报错from sklearn.linear_model import LinearRegressionx = []y = []def mapper():    c = 1    for line in sys.stdin:        item = line.rstrip('\n').split(',')        print "%s,%s,%s,%s" %(c,item[0],item[1],item[2])  #增加一个序列号,为了reducer之前排序数据        c += 1def reducer():    for line in sys.stdin:        item = line.rstrip('\n').split(',')        x.append([eval(item[1]),eval(item[2])])        y.append(eval(item[3]))    print "%s,%s"%(x,y)    lrModel = LinearRegression()    lrModel.fit(x, y)    print lrModel.score(x, y)    print lrModel.predict([10, 110])    print lrModel.predict([[10, 110],[20, 110]])    print lrModel.coef_    print lrModel.intercept_d = {'mapper': mapper, 'reducer': reducer}  if sys.argv[1] in d:      d[sys.argv[1]]() 

2、shell执行脚本:

$ cat test_sklearn.shhdfs_input_path="/user/hdfs/test_sklearn"hdfs_output_path="/user/hdfs/test_output"hadoop fs -rmr ${hdfs_output_path}hadoop jar /usr/lib/hadoop-mapreduce/hadoop-streaming.jar \-D mapreduce.job.queuename=default \-D mapred.map.tasks=3  \-D mapred.reduce.tasks=1 \-input ${hdfs_input_path} \-output ${hdfs_output_path} \-file test_sklearn.py \-mapper "python test_sklearn.py mapper" \-reducer "python test_sklearn.py reducer"

3、执行

$sh test_sklearn.sh

四、输出的结果
[[10, 80], [7, 300], [9, 0], [6, 330], [8, 0], [8, 230], [7, 40], [8, 200], [9, 180], [5, 200]],[469, 246, 436, 198, 366, 297, 363, 371, 364, 208]
0.945235852682
[ 442.96160353]
[ 442.96160353  858.09638609]
[ 41.51347826  -0.34088269]
65.3239163889

此结果和单机版本运行的结果一致。

五、注意:
1、无法使用import pandas 会报错
2、map的数量问题,设置多个map后,数据到reducer阶段需要按照之前数据顺序排列这样训练才正确,所以map阶段加入了一个序列号,这样到reducer之前会排序好。
3、预测放到reducer中进行,reducer只能设置为1


阅读全文
0 0
原创粉丝点击