欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ubuntu中Spark MLLib的安装与使用

程序员文章站 2024-02-03 22:26:58
...

软硬件环境

名称    版本
系统    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 "aaa@qq.com"

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

aaa@qq.com:sbt$ pwd
/usr/local/sbt
aaa@qq.com:sbt$ ls
sbt  sbt-launch.jar

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

1 aaa@qq.com:~$ 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中Spark MLLib的安装与使用

需要注意的是,因为我们之前已经在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。点击右侧的“+”号。
ubuntu中Spark MLLib的安装与使用

之后点击Library,

ubuntu中Spark MLLib的安装与使用

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

ubuntu中Spark MLLib的安装与使用

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

ubuntu中Spark MLLib的安装与使用

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

ubuntu中Spark MLLib的安装与使用

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

就可以搜索并安装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文件
 

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

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

aaa@qq.com:~$ 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。

aaa@qq.com:~$ 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文件系统中所有的文件/夹

aaa@qq.com:~$ 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,准备运行我们的程序。
ubuntu中Spark MLLib的安装与使用

使用sbt package命令打包。

ubuntu中Spark MLLib的安装与使用

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

查看打印的数据。

ubuntu中Spark MLLib的安装与使用

打印出模型结构

ubuntu中Spark MLLib的安装与使用

查看打印出的分类的精度

ubuntu中Spark MLLib的安装与使用

代码

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 }

 

相关标签: ubantu