ubuntu中Spark MLLib的安装与使用

软硬件环境

名称    版本
系统    Ubuntu 18.04.4 LTS
内存    7.5GiB
处理器    Intel Core i7-8565U CPU @ 1.80GHz *8
图形    Intel UHD Graphics(Whiskey Lake 3*8 GT2)
GNOME    3.28.2
操作系统类型    64位
磁盘    251.0 GB
Hadoop    2.10.0
Spark    2.3.4
scala    2.11.8
IntelliJ IDEA    ULTIMATE 2020.1
Sbt    0.13.11

步骤

①安装sbt
sbt是一款Spark用来对scala编写程序进行打包的工具,可以在地址:https://repo.typesafe.com/typesafe/ivy-releases/org.scala-sbt/sbt-launch/0.13.11/sbt-launch.jar  处下载文件sbt-launch.jar。然后创建目录/usr/local/sbt,并把sbt-launch.jar文件放入到该文件夹内。然后在该文件夹内再创建一个脚本文件,命名为sbt。在该sbt脚本文件中添加如下内容:
 

#!/bin/bash
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

然后需要赋予该文件的可执行权限,即:sudo chmod u+x sbt。
上面的步骤完成之后,sbt即安装完成,如下所示:
 

acat@acat-xx:sbt$ pwd
/usr/local/sbt
acat@acat-xx:sbt$ ls
sbt  sbt-launch.jar

为了更方便使用sbt,可以把目录/usr/local/sbt添加到~/.bashrc中的PATH中,这样可以就可以直接调用sbt了。
测试sbt是否安装成功,使用命令sbt version。
 

1 acat@acat-xx:~$ sbt version
2 Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256M; support was removed in 8.0
3 [info] Set current project to acat (in build file:/home/acat/)
4 [info] 0.1-SNAPSHOT

出现上面的信息就说明安装成功了,但是可以需要一段时间,因为这期间会下载一些东西。
②在IDEA中创建项目,并导入spark和hadoop相关的jar包。
为什么使用IDEA而不使用Eclipse,因为笔者尝试在Eclipse中安装Scala插件,但是几乎处于停滞的状态,网速很慢,但是在IDEA中安装Scala插件就非常方便,后面会介绍到。有了Scala插件,我们就可以直接编辑*.scala格式的文件,而该文件中可以编写spark mllib相关的代码。
我们创建的是Java Project,命名为spark-mllib-practice。项目界面如下。

需要注意的是,因为我们之前已经在ubuntu中安装了hadoop和spark,并且已经将hadoop和spark进行了关联。所以,在使用IDEA创建工程的时候,要引入hadoop和spark安装目录中的jar包,而不是创建maven工程将jar包从pom依赖中引入。这是因为spark和spark MLLib需要使用到hdfs文件系统,而hdfs是hadoop内置提供的,我们之前已经在实验一种配置了hadoop的伪分布式架构,这里可以直接通过spark MLLib进行调用即可。所以,我们不仅要引入spark相关的jar包,还需要引入hadoop相关的jar包。由于hadoop和spark中有的jar包是冲突的,如果同时引入的话会报错。这里的解决办法是遇到冲突的时候,就保留spark中的jar包。比如在笔者的环境中hadoop中存在的jar包:jackson-annotations-2.7.8.jar、jackson-core-2.7.8.jar、jackson-databind-2.7.8.jar、netty-3.6.2.Final.jar和netty-all-4.0.23.Final.jar,这些jar包在spark中都有对应的不同的版本,这里就选择只引入spark中相关的jar包。
所以最终,笔者引入的hadoop相关的jar包为:
 

1 activation-1.1.jar
 2 apacheds-i18n-2.0.0-M15.jar
 3 apacheds-kerberos-codec-2.0.0-M15.jar
 4 api-asn1-api-1.0.0-M20.jar
 5 api-util-1.0.0-M20.jar
 6 asm-3.2.jar
 7 avro-1.7.7.jar
 8 commons-beanutils-1.9.4.jar
 9 commons-cli-1.2.jar
10 commons-codec-1.4.jar
11 commons-collections-3.2.2.jar
12 commons-compress-1.19.jar
13 commons-configuration-1.6.jar
14 commons-daemon-1.0.13.jar
15 commons-digester-1.8.jar
16 commons-io-2.4.jar
17 commons-lang3-3.4.jar
18 commons-lang-2.6.jar
19 commons-logging-1.1.3.jar
20 commons-math3-3.1.1.jar
21 commons-net-3.1.jar
22 curator-client-2.7.1.jar
23 curator-framework-2.7.1.jar
24 curator-recipes-2.7.1.jar
25 gson-2.2.4.jar
26 guava-11.0.2.jar
27 hadoop-annotations-2.10.0.jar
28 hadoop-auth-2.10.0.jar
29 hadoop-common-2.10.0.jar
30 hadoop-hdfs-2.10.0.jar
31 hadoop-hdfs-client-2.10.0.jar
32 hadoop-hdfs-nfs-2.10.0.jar
33 hadoop-nfs-2.10.0.jar
34 hamcrest-core-1.3.jar
35 htrace-core4-4.1.0-incubating.jar
36 httpclient-4.5.2.jar
37 httpcore-4.4.4.jar
38 jackson-annotations-2.7.8.jar
39 jackson-core-2.7.8.jar
40 jackson-core-asl-1.9.13.jar
41 jackson-databind-2.7.8.jar
42 jackson-jaxrs-1.9.13.jar
43 jackson-mapper-asl-1.9.13.jar
44 jackson-xc-1.9.13.jar
45 java-xmlbuilder-0.4.jar
46 jaxb-api-2.2.2.jar
47 jaxb-impl-2.2.3-1.jar
48 jcip-annotations-1.0-1.jar
49 jersey-core-1.9.jar
50 jersey-json-1.9.jar
51 jersey-server-1.9.jar
52 jets3t-0.9.0.jar
53 jettison-1.1.jar
54 jetty-6.1.26.jar
55 jetty-sslengine-6.1.26.jar
56 jetty-util-6.1.26.jar
57 jsch-0.1.54.jar
58 json-smart-1.3.1.jar
59 jsp-api-2.1.jar
60 jsr305-3.0.0.jar
61 junit-4.11.jar
62 leveldbjni-all-1.8.jar
63 log4j-1.2.17.jar
64 mockito-all-1.8.5.jar
65 netty-3.10.6.Final.jar
66 netty-all-4.0.23.Final.jar
67 nimbus-jose-jwt-4.41.1.jar
68 okhttp-2.7.5.jar
69 okio-1.6.0.jar
70 paranamer-2.3.jar
71 protobuf-java-2.5.0.jar
72 servlet-api-2.5.jar
73 slf4j-api-1.7.25.jar
74 slf4j-log4j12-1.7.25.jar
75 snappy-java-1.0.5.jar
76 stax2-api-3.1.4.jar
77 stax-api-1.0-2.jar
78 woodstox-core-5.0.3.jar
79 xercesImpl-2.12.0.jar
80 xml-apis-1.4.01.jar
81 xmlenc-0.52.jar
82 zookeeper-3.4.9.jar

引入的spark相关的jar包为:

1 aircompressor-0.8.jar
  2 antlr4-runtime-4.7.jar
  3 aopalliance-repackaged-2.4.0-b34.jar
  4 arpack_combined_all-0.1.jar
  5 arrow-format-0.8.0.jar
  6 arrow-memory-0.8.0.jar
  7 arrow-vector-0.8.0.jar
  8 automaton-1.11-8.jar
  9 avro-mapred-1.7.7-hadoop2.jar
 10 breeze-macros_2.11-0.13.2.jar
 11 breeze_2.11-0.13.2.jar
 12 chill-java-0.8.4.jar
 13 chill_2.11-0.8.4.jar
 14 commons-codec-1.10.jar
 15 commons-compiler-3.0.8.jar
 16 commons-crypto-1.0.0.jar
 17 commons-lang3-3.5.jar
 18 commons-lang-2.6.jar
 19 commons-math3-3.4.1.jar
 20 commons-net-2.2.jar
 21 compress-lzf-1.0.3.jar
 22 core-1.1.2.jar
 23 flatbuffers-1.2.0-3f79e055.jar
 24 generex-1.0.1.jar
 25 hk2-api-2.4.0-b34.jar
 26 hk2-locator-2.4.0-b34.jar
 27 hk2-utils-2.4.0-b34.jar
 28 hppc-0.7.2.jar
 29 ivy-2.4.0.jar
 30 jackson-annotations-2.6.7.jar
 31 jackson-core-2.6.7.jar
 32 jackson-databind-2.6.7.1.jar
 33 jackson-dataformat-yaml-2.6.7.jar
 34 jackson-module-jaxb-annotations-2.6.7.jar
 35 jackson-module-paranamer-2.7.9.jar
 36 jackson-module-scala_2.11-2.6.7.1.jar
 37 janino-3.0.8.jar
 38 javassist-3.18.1-GA.jar
 39 javax.annotation-api-1.2.jar
 40 javax.inject-2.4.0-b34.jar
 41 javax.servlet-api-3.1.0.jar
 42 javax.ws.rs-api-2.0.1.jar
 43 jcl-over-slf4j-1.7.16.jar
 44 jersey-client-2.22.2.jar
 45 jersey-common-2.22.2.jar
 46 jersey-container-servlet-2.22.2.jar
 47 jersey-container-servlet-core-2.22.2.jar
 48 jersey-guava-2.22.2.jar
 49 jersey-media-jaxb-2.22.2.jar
 50 jersey-server-2.22.2.jar
 51 joda-time-2.9.3.jar
 52 json4s-ast_2.11-3.2.11.jar
 53 json4s-core_2.11-3.2.11.jar
 54 json4s-jackson_2.11-3.2.11.jar
 55 jsr305-1.3.9.jar
 56 jtransforms-2.4.0.jar
 57 jul-to-slf4j-1.7.16.jar
 58 kryo-shaded-3.0.3.jar
 59 kubernetes-client-3.0.0.jar
 60 kubernetes-model-2.0.0.jar
 61 leveldbjni-all-1.8.jar
 62 logging-interceptor-3.8.1.jar
 63 lz4-java-1.4.0.jar
 64 machinist_2.11-0.6.1.jar
 65 macro-compat_2.11-1.1.1.jar
 66 mesos-1.4.0-shaded-protobuf.jar
 67 metrics-core-3.1.5.jar
 68 metrics-graphite-3.1.5.jar
 69 metrics-json-3.1.5.jar
 70 metrics-jvm-3.1.5.jar
 71 minlog-1.3.0.jar
 72 netty-3.9.9.Final.jar
 73 netty-all-4.1.17.Final.jar
 74 objenesis-2.1.jar
 75 okhttp-3.8.1.jar
 76 okio-1.13.0.jar
 77 opencsv-2.3.jar
 78 orc-core-1.4.4-nohive.jar
 79 orc-mapreduce-1.4.4-nohive.jar
 80 oro-2.0.8.jar
 81 osgi-resource-locator-1.0.1.jar
 82 paranamer-2.8.jar
 83 parquet-column-1.8.3.jar
 84 parquet-common-1.8.3.jar
 85 parquet-encoding-1.8.3.jar
 86 parquet-format-2.3.1.jar
 87 parquet-hadoop-1.8.3.jar
 88 parquet-jackson-1.8.3.jar
 89 py4j-0.10.7.jar
 90 pyrolite-4.13.jar
 91 RoaringBitmap-0.7.45.jar
 92 scala-compiler-2.11.8.jar
 93 scala-library-2.11.8.jar
 94 scala-parser-combinators_2.11-1.0.4.jar
 95 scala-reflect-2.11.8.jar
 96 scala-xml_2.11-1.0.5.jar
 97 scalap-2.11.8.jar
 98 shapeless_2.11-2.3.2.jar
 99 shims-0.7.45.jar
100 snakeyaml-1.15.jar
101 snappy-java-1.1.2.6.jar
102 spark-catalyst_2.11-2.3.4.jar
103 spark-core_2.11-2.3.4.jar
104 spark-graphx_2.11-2.3.4.jar
105 spark-kubernetes_2.11-2.3.4.jar
106 spark-kvstore_2.11-2.3.4.jar
107 spark-launcher_2.11-2.3.4.jar
108 spark-mesos_2.11-2.3.4.jar
109 spark-mllib-local_2.11-2.3.4.jar
110 spark-mllib_2.11-2.3.4.jar
111 spark-network-common_2.11-2.3.4.jar
112 spark-network-shuffle_2.11-2.3.4.jar
113 spark-repl_2.11-2.3.4.jar
114 spark-sketch_2.11-2.3.4.jar
115 spark-sql_2.11-2.3.4.jar
116 spark-streaming_2.11-2.3.4.jar
117 spark-tags_2.11-2.3.4.jar
118 spark-unsafe_2.11-2.3.4.jar
119 spark-yarn_2.11-2.3.4.jar
120 spire-macros_2.11-0.13.0.jar
121 spire_2.11-0.13.0.jar
122 stream-2.7.0.jar
123 univocity-parsers-2.5.9.jar
124 validation-api-1.1.0.Final.jar
125 xbean-asm5-shaded-4.4.jar
126 zjsonpatch-0.3.0.jar
127 zstd-jni-1.3.2-2.jar

但是,这之后我遇到了TextInput相关的异常信息,经过排查之后,发现还需要引入一个jar包。即:

hadoop-mapreduce-client-core-2.6.5.jar

在IDEA中引入jar library的步骤如下:
点击File->Project Structure,然后在界面中点击Dependencies。点击右侧的“+”号。

之后点击Library,

然后在Choose Library界面中点击New Library按钮。

然后就可以从本地文件夹中查找jar包了。

笔者在添加完jar包之后,结果如下图。

在IDEA中安装scala插件。
依次点击File->Settings->Plugin,然后会达到如下界面:

就可以搜索并安装Scala插件了,Scala插件笔者之前已经安装了。所以可以直接看到。
③编辑管理项目的sbt文件。
在项目的顶层目录创建文件simple.sbt,需要注意的是,该sbt文件的命名并没有特殊要求,比如命名为simple2.sbt也是可以的。当使用sbt package命令打包的时候,可能会自动进行匹配。这里需要注意的是,本地引入的jar包可以保证IDEA可以识别程序的代码,比如import org.apache.spark.mllib…。但是,在使用sbt package打包的时候,如果不对.sbt文件进行配置,那么它将不能识别程序。所以,笔者的.sbt文件的内容是:
 

name := "Simple Project"

version := "1.0"

scalaVersion := "2.11.8"

//libraryDependencies += "org.apache.spark" %% "spark-core" % "2.3.4"

libraryDependencies ++= Seq(
  "org.apache.spark" %% "spark-core" % "2.3.4",
  "org.apache.spark" %% "spark-mllib-local" % "2.3.4",
  "org.apache.spark" %% "spark-mllib" % "2.3.4"
)

刚开始就是因为没有添加spark-mllib-local和spark-mllib,导致sbt package命令一直打包失败。
④在hdfs文件系统中创建我们程序的数据文件iris.data。
首先需要调用start-dfs.sh命令,来启动Hadoop。
本地的家目录存在iris.data文件
 

acat@acat-xx:~$ ls -l iris.data
-rw-rw-r-- 1 acat acat 4550 5月  28 16:59 iris.data

现在我们不妨查看一下hdfs文件系统中存在哪些文件/夹

acat@acat-xx:~$ hdfs dfs -lsr /
20/05/28 18:51:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:01 /home
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:01 /home/acat
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:14 /user
drwxr-xr-x   - acat supergroup          0 2020-05-28 18:50 /user/acat
drwxr-xr-x   - acat supergroup          0 2020-05-28 10:30 /user/acat/input
-rw-r--r--   1 acat supergroup         57 2020-05-28 10:30 /user/acat/input/wordfile1.txt
-rw-r--r--   1 acat supergroup         51 2020-05-28 10:30 /user/acat/input/wordfile2.txt
drwxr-xr-x   - acat supergroup          0 2020-05-28 10:33 /user/acat/output
-rw-r--r--   1 acat supergroup          0 2020-05-28 10:33 /user/acat/output/_SUCCESS
-rw-r--r--   1 acat supergroup        112 2020-05-28 10:33 /user/acat/output/part-r-00000
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:13 /user/hadoop
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr/local
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr/local/hadoop

现在我们打算在hdfs的家目录(/user/acat)中创建文件iris.data。

acat@acat-xx:~$ hdfs dfs -put iris.data ./
20/05/28 18:53:59 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable

然后再次使用hdfs dfs –lsr /命令来查看hdfs文件系统中所有的文件/夹

acat@acat-xx:~$ hdfs dfs -lsr /
20/05/28 18:54:05 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
lsr: DEPRECATED: Please use 'ls -R' instead.
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:01 /home
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:01 /home/acat
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:14 /user
drwxr-xr-x   - acat supergroup          0 2020-05-28 18:54 /user/acat
drwxr-xr-x   - acat supergroup          0 2020-05-28 10:30 /user/acat/input
-rw-r--r--   1 acat supergroup         57 2020-05-28 10:30 /user/acat/input/wordfile1.txt
-rw-r--r--   1 acat supergroup         51 2020-05-28 10:30 /user/acat/input/wordfile2.txt
-rw-r--r--   1 acat supergroup       4550 2020-05-28 18:54 /user/acat/iris.data
drwxr-xr-x   - acat supergroup          0 2020-05-28 10:33 /user/acat/output
-rw-r--r--   1 acat supergroup          0 2020-05-28 10:33 /user/acat/output/_SUCCESS
-rw-r--r--   1 acat supergroup        112 2020-05-28 10:33 /user/acat/output/part-r-00000
drwxr-xr-x   - acat supergroup          0 2020-05-28 00:13 /user/hadoop
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr/local
drwxr-xr-x   - acat supergroup          0 2020-05-27 23:58 /usr/local/hadoop

我们不难发现在hdfs的家目录下多出了一个文件iris.data。在随后,我们的程序会使用决策树分类器来对其中的数据进行分类。
⑤使用spark mllib中提供的库,来编写决策树分类器,对hdfs文件系统中iris.data中的数据进行分类。程序的源代码见第六章的程序代码。
点击Terminal,准备运行我们的程序。

使用sbt package命令打包。

可知,在我们项目的target/scala-2.11/simple-project_2.11-1.0.jar就是sbt命令打包生成的jar包。
然后我们使用spark-submit命令运行jar包(simple-project_2.11-1.0.jar)。

查看打印的数据。

打印出模型结构

查看打印出的分类的精度

代码

1 import org.apache.spark.SparkConf
 2 import org.apache.spark.SparkContext
 3 import org.apache.spark.mllib.tree.DecisionTree
 4 import org.apache.spark.mllib.regression.LabeledPoint
 5 import org.apache.spark.mllib.linalg.{Vectors,Vector}
 6 
 7 object SimpleApp {
 8     def main(args: Array[String]): Unit = {
 9       val conf = new SparkConf().setAppName("Simple Application")
10       val sc = new SparkContext(conf)
11       /*
12       * 首先,读取文本文件;然后,通过map将每行的数据用“,”隔开,在我们的数据集中,每行被分成了5部分,前4部分是鸢尾花的4个特征,
13       * 最后一部分是鸢尾花的分类。把这里我们用LabeledPoint来存储标签列和特征列。LabeledPoint在监督学习中常用来存储标签和特征,
14       * 其中要求标签的类型是double,特征的类型是Vector。所以,我们把莺尾花的分类进行了一下改变,"Iris-setosa"对应分类0,"Iris-versicolor"对应分类1,
15       * 其余对应分类2;然后获取莺尾花的4个特征,存储在Vector中。
16       * */
17       //这里读取的是hdfs文件系统中的文件(前面没有写路径,就默认从hdfs的家目录:/user/acat/中读取iris.data文件)。
18       val data = sc.textFile("iris.data")
19       val ab = 0
20       val parsedData = data.map{
21         line =>
22           val parts = line.split(',')
23           LabeledPoint(
24             if(parts(4)=="Iris-setosa")
25               0.toDouble
26             else if (parts(4) == "Iris-versicolor")
27               1.toDouble
28             else
29               2.toDouble,Vectors.dense(parts(0).toDouble,parts(1).toDouble,parts(2).toDouble,parts(3).toDouble)
30           )
31       }
32       //然后,我们把数据打印看一下:
33       parsedData.foreach { x => println(x) }
34       // 接下来,首先进行数据集的划分,这里划分70%的训练集和30%的测试集:
35       val splits = parsedData.randomSplit(Array(0.7, 0.3))
36       val (trainingData, testData) = (splits(0), splits(1))
37       //然后,调用决策树的trainClassifier方法构建决策树模型,设置参数,比如分类数、信息增益的选择、树的最大深度等:
38       val numClasses = 3
39       val categoricalFeaturesInfo = Map[Int, Int]()
40       val impurity = "gini"
41       val maxDepth = 5
42       val maxBins = 32
43       val model = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo, impurity, maxDepth, maxBins)
44       // 接下来我们调用决策树模型的predict方法对测试数据集进行预测,并把模型结构打印出来:
45       val labelAndPreds = testData.map {
46           point =>
47           val prediction = model.predict(point.features)
48           (point.label, prediction)
49       }
50       println("Learned classification tree model:\n" + model.toDebugString)
51       //最后,我们把模型预测的准确性打印出来:
52       val testErr = labelAndPreds.filter(r => r._1 != r._2).count().toDouble / testData.count()
53       println("Precision = " + (1-testErr))
54     }
55 }

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值