调用MLlib库实现Kmeans聚类

来源:互联网 发布:短信群发软件价格 编辑:程序博客网 时间:2024/06/05 16:11

MLlib Kmeans Algorithm

使用工具
- IDE:IntelliJ IDEA
- scala解释器:scala-2.12.3
- Java jdk:jdk1.8.0_66
- spark lib:spark-assembly-1.4.1-hadoop2.6.0

Steps

  • 获取数据集
    wget http://labfile.oss.aliyuncs.com/courses/736/taxi.csv
    注:
    windows系统:要预先安装wget,然后启动DOS界面直接输入该命令即可。
    Linux系统:直接输入该命令即可,Linux系统自带。

  • 在IDEA中创建工程
    具体步骤可参考博客:
    http://www.cnblogs.com/ppgeneve/p/5158069.html

  • 添加扩展库
    File->Project Structure ->Libraries -> 点击+号 ->java ->选择spark-assembly-1.4.1-hadoop2.6.0 ->完成

  • MLlib 官网:
    https://spark.apache.org/docs/latest/api/scala/index.html#package
    在官网即可查看Kmeans定义的方法和参数

导入Spark MLlib

import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.feature.Normalizer
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.{SparkContext}

Vectors和Normailzer都包含在MLlib库中,所以也可以在上面的官网查看用法

代码块

  • 获取SparkContext,读取数据集并转化为RDD
val data = sc.textFile("data/clustering/taxi.txt")

注意:在project目录下新建data目录,并将下载的数据后缀名改为.txt并放在data目录下作为输入文件。

  • 切分数据将其从标称型转化为Double类型,并转化为向量
val parsedData = data.map(s => Vectors.dense(s.split(',').map(_.toDouble)))
  • 数据预处理,将原始数据正则化,并装入缓存
val nor = new Normalizer() //正则化val nordata = nor.transform(parsedData).cache()
  • 导入Kmeans算法,设置参数并训练模型
val algorithm = new KMeans()algorithm.setK(6) //类簇个数为6个algorithm.setMaxIterations(100) //迭代次数为100次val clusters=algorithm.run(nordata) //训练模型
  • 将类标签和原始数据进行拉链操作,并合并相同项
// 拉链操作val Kdata = clusters.predict(nordata).zip(parsedData) // 合并相同项val Kdata_res = Kdata.map(num =>(num,1)).reduceByKey(_ + _)
  • 将计算结果保存至该工程的outPut目录下,方便查看结果
Kdata_res.saveAsTextFile("outPut/outputOne")Kdata.saveAsTextFile("outPut/outputTwo")

注意:每次运行时要确保outPut目录不存在,否则程序无法执行

  • 计算各个类簇中心向量,并保存
val Kpoint =sc.parallelize(clusters.clusterCenters)Kpoint.saveAsTextFile("dataOut/taxi/Kpoint")
  • 完整代码请见github

提示

在使用IDEA过程中,尤其是编写spark程序时可能会遇到大量问题,既有编译器方面也有代码方面。我遇到过很多编译器方面的问题,下面我就分享一个关于编译器的问题解决方案。

  • Question
17/09/05 21:24:29 ERROR Shell: Failed to locate the winutils binary in the hadoop binary pathjava.io.IOException: Could not locate executable E:\SoftwareForLinux\local\hadoop\bin\winutils.exe in the Hadoop binaries.    at org.apache.hadoop.util.Shell.getQualifiedBinPath(Shell.java:355)    at org.apache.hadoop.util.Shell.getWinUtilsPath(Shell.java:370)    at org.apache.hadoop.util.Shell.<clinit>(Shell.java:363)    at org.apache.hadoop.util.StringUtils.<clinit>(StringUtils.java:79)    at org.apache.hadoop.security.Groups.parseStaticMapping(Groups.java:104)    at org.apache.hadoop.security.Groups.<init>(Groups.java:86)    at org.apache.hadoop.security.Groups.<init>(Groups.java:66)    at org.apache.hadoop.security.Groups.getUserToGroupsMappingService(Groups.java:280)    at org.apache.hadoop.security.UserGroupInformation.initialize(UserGroupInformation.java:271)    at org.apache.hadoop.security.UserGroupInformation.ensureInitialized(UserGroupInformation.java:248)    at org.apache.hadoop.security.UserGroupInformation.loginUserFromSubject(UserGroupInformation.java:763)    at org.apache.hadoop.security.UserGroupInformation.getLoginUser(UserGroupInformation.java:748)    at org.apache.hadoop.security.UserGroupInformation.getCurrentUser(UserGroupInformation.java:621)    at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)at org.apache.spark.util.Utils$$anonfun$getCurrentUserName$1.apply(Utils.scala:2162)    at scala.Option.getOrElse(Option.scala:120)    at org.apache.spark.util.Utils$.getCurrentUserName(Utils.scala:2162)    at org.apache.spark.SparkContext.<init>(SparkContext.scala:301)    at org.apache.spark.SparkContext.<init>(SparkContext.scala:155)    at com.roger.taxi.taxiCase$.main(taxiCase.scala:13)    at com.roger.taxi.taxiCase.main(taxiCase.scala)

通过错误提醒还是勉强能看懂问题出在哪,错误提示缺少hadoop相关组件,尤其是winutils.exe。由于我电脑是32位的,在网上下了很多版本的winutils.exe结果都是64位的与系统不兼容。下面跟大家分享一个32位的hadoop下载地址,由于原始下载链接找不到了就是用百度云盘,提取密码:rmvg。hadoop下载后要添加hadoop的环境变量,这里我不介绍了,可以去网上搜索一下添加环境变量的方法。

  • Q:如何在大数据平台提交程序
    A:spark官方文档
    A:博客分享

  • Q:spark-assembly-1.4.1-hadoop2.6.0从何而来?
    A:在apache spark官网下载spark-1.4.1,该包就在其lib目录下

最后如果文中有不当之处还请指正修改,感谢阅读本人第一篇博客,大家有疑问也可以通过评论区交流
原创粉丝点击