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

为了证实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.txt
10,80,469
8,0,366
8,200,371
5,200,208
7,300,246
8,230,297
7,40,363
9,0,436
6,330,198
9,180,364

三、代码:

1、mapper、reducer代码

$ cat test_sklearn.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import sys
#import pandas  //使用pandas会报错
from sklearn.linear_model import LinearRegression
x = []
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 += 1

def 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.sh
hdfs_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
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值