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 "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中安装了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文件
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,准备运行我们的程序。
使用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 }
推荐阅读
-
ubuntu中Hadoop和Spark平台的安装
-
ubuntu中Spark MLLib的安装与使用
-
Ubuntu7.10中mysql安装不上与不能登录的对策
-
Ubuntu下安装和使用OpenNMT翻译以及其中系统中遇到的问题
-
Ubuntu11.04停Memcached和php5-memcache的安装与基本使用
-
Python中Numpy包的安装与使用方法简明教程
-
Sublime text 二/3 中 Package Control 的安装与使用方法
-
Sublime text 2/3 中 Package Control 的安装与使用方法,sublimepackage
-
Ubuntu中Nginx的安装与配置详细说明
-
详解PHP的Yii框架中扩展的安装与使用_PHP