- 实验目的
综合运用大数据分析生态中的相关组件,完成具有移动综合性的大数据分析任务,了解大数据分析的基本流程。
- 实验平台
- 操作系统:Ubuntukylin-18.04
- Spark版本: 单机版2.4.0
- Hadoop版本: 单机版3.1.3
- JDK版本:1.8
- MySQL:5.7
- Python:3.6
三、实验内容
数据集中有test.csv和train.csv两个文件。本次实验使用Spark的机器学习库进行简单的分类操作,并将测试结果存入MySQL数据库中。如下图所示,本实验内容涉及了数据预处理、数据分析以及大数据分析系统与数据库之间的联动。
这里先列出test.csv和train.csv中字段的描述,字段定义如下:
- user_id | 买家id
- age_range | 买家年龄分段:1表示年龄小于18, 2表示年龄在[18,24],3表示年龄在[25,29],4表示年龄在[30,34],5表示年龄在[35,39],6表示年龄在[40,49],7和8表示年龄大于等于50, 0和NULL则表示未知
- gender | 性别: 0表示女性,1表示男性,2和NULL表示未知
- merchant_id | 商家id
- label | 是否是回头客,0值表示不是回头客,1值表示回头客,-1值表示该用户已经超出我们所需要考虑的预测范围。NULL值只存在测试集,在测试集中表示需要预测的值
四、实验步骤
- 环境配置
- 虚拟机 + Ubuntu
- 查看Ubuntu自带的Python版本
- Spark + Hadoop
- JDK
- MySQL
- 数据集预处理
- 去掉测试集test.csv中label是-1的数据
- 去掉测试和训练数据集中表示字段名称的行(即第一行)
- 将上述处理好的文件保存为:test_after.csv, train_after.csv
- 启动Hadoop
- 在默认用户的根目录下创建dbtaobao子目录,并将解压后的训练集和测试集上传到HDFS的/dbtaobao/dataset目录下
- 启动MySQL服务
- 创建数据库dbtaobao
- 建立表格rebuy,包含score varchar(40), label varchar(40) 两个属性
使用以下命令安装MySQL:
sudo apt-get update
sudo apt-get install mysql-server -y
然后使用mysql --version查看版本
service mysql start
mysql -u root -p
create database dbtaobao;
use dbtaobao;
create table rebuy (score varchar(40),label varchar(40));
select * from rebuy
quit;
- 启动pyspark
- 需提前安装numpy(请注意numpy版本与python版本的匹配)
- 提前配置好spark与MySQL的JDBC驱动
- 启动pyspark
- 使用支持向量机SVM分类器预测回头客
- 导入需要的包,包括pyspark.mllib中相关的包,pyspark.sql中相关的包等
- 从HDFS读取训练数据
- 构建模型
- 评估模型
- 把结果添加到mysql数据库中
- 代码如下
from pyspark.ml.classification import LinearSVC
from pyspark.ml.linalg import Vectors
from pyspark.sql import SparkSession,Row
from pyspark.ml.evaluation import MulticlassClassificationEvaluator
def splitDF(x):
rel={}
rel['features']=Vectors.dense(int(x[0]),int(x[1]),int(x[2]),int(x[3]))
rel['label']=int(x[4])
return rel
spark=SparkSession.builder.master("local").appName("double11").getOrCreate()
training = spark.sparkContext.textFile("hdfs://localhost:9000dbtaobao/dataset/train_after.csv").map(lambda line:line.split(',')).map(lambda p:Row(**splitDF(p))).toDF()
testing = spark.sparkContext.textFile("hdfs://localhost:9000dbtaobao/dataset/test_after.csv").map(lambda line:line.split(',')).map(lambda p:Row(**splitDF(p))).toDF()
dsvc = LinearSVC(maxIter=10, regParam=0.1).setFeaturesCol("label").setFeaturesCol('features')
dsvcModel = dsvc.fit(training)
dsvcPredictions=dsvcModel.transform(testing)
preRel=dsvcPredictions.select("prediction","label","features").collect()
for item in preRel:
print(str(item['label'])+','+str(item['features'])+',prediction'+str(item['prediction']))
#准确率
evaluator=MulticlassClassificationEvaluator().setLabelCol("label").setPredictionCol("prediction")
dAccuracy=evaluator.evaluate(dsvcPredictions)
print(dAccuracy)
四、实验可能会出现的问题
1.python版本选取问题:
python2和python3.10以上的版本不推荐选择,目前最合适的Python版本推荐3.6,性能比较稳定。
2.numpy安装问题:
在安装numpy中遇到了无法安装的问题,可以考虑5G网络或者提前下载镜像源解压。
3.在启动pyspark时,遇到了问题:
./bin/pyspark: line 45: python: command not found
env: ‘python’: No such file or directory
在命令行输入Python不存在,输入Python3进入Python,因此需要配置Spark python的环境变量,在~/.bashrc文件中添加:
export PYTHONPATH = $SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.10-src.zip:$PYTHONPATH export PYSPARK_PYTHON=python3 |
然后source ~/.bashrc,再次启动pyspark就可以进入pyspark。
4.最后一行代码报错:
rebuyDF.write.jdbc("jdbc:mysql://localhost:3306/dbtaobao",'dbtaobao.rebuy','append', prop) java.lang.ClassNotFoundException: com.mysql.jdbc.Driver |
说明缺少mysql-connector-java-5.1.40-bin.jar包,但是之前明明已经解压到/usr/local/spark/jars中,这时才发现解压后是一个mysql-connector-java-5.1.40目录,mysql-connector-java-5.1.40-bin.jar在这个目录里面,将这个jar包复制到/usr/local/spark/jars中即可。
5.部分用户可能会出现内存硬盘容量不够扩容后的问题,例如
dpkg was interrupted, you must manually run 'sudo dpkg --configure -a' to correct the problem. |
针对该类问题,需要重新进行系统初始化。
update source list, sudo gedit /etc/apt/sources.list sudo apt-get update |