上一节 走进Spark生态圈:环境的安装与配置 我们在虚拟机上简单的搭建了运行于StandAlone的上的伪分布集群和全分布集群,并通过Spark的可视化查看集群的运行状态. 集群已经存在,这一节我们将会在集群上运行我们的第一个程序:统计文本中的单词数(简称:WordCount)
示例代码将使用Scala语言编写,运行在伪分布集群Spark81上
SparkConf:spark程序的配置对象,可以通该对象设置spark程序的要运行的master环境,app的名称等信息。
SparkContext:这个很重要,是Spark核心的上下文对象,使程序可以和Spark进行交互
RDD:分布式弹性数据集,任何数据在Spark上面都可以是RDD,RDD将数据并行的运行在不同的Worker上不同的Executer上
spark shell
可以把它看成是一个壳,可以直接运行在集群上,而壳中的内容就是我们用scala语言编写的程序。
让我们先来启动 spark shell,运行 spark-shell
命令
这里面有几个很重要的信息:
1.spark context available as ‘sc’ (master=lcoal[*],app id=lcoal-…..
:在该交互式命令行中我们可以直接使用sparkcontext对象,名为“sc”
:现在的spark-shell运行在本地,并且id为lcoal-……
2.spark version 2.2.0 Using Scala version 2.11.8
:spark的运行版本为2.2.0
:使用的scala版本为2.11.8
:说这两个显而易见的信息是因为我们在开发程序的时候,最好使用scala的版本为2.11.8,否则会报错,请看本节最后
现在spark-shell运行在本地,显然不是我们所要求的,那么要想spark-shell运行在集群上,我们该怎么做呢?现退出本地spark-shell,然后请使用如下命令
spark-shell --master spark://spark81:7077
现在我们的spark程序则是运行在伪分布式的集群上,通过图中标注的信息即可看到,若感觉不明显,可以在浏览器中运行 spark81:8080 查看
从图中可以看到当前Spark Master的地址,Spark的运行状态,集群中的Worker信息,和运行在Worker上应用程序的信息(可以看到当前有一个名字为spark shell的程序运行在集群上)
在命令行中输入运行以下代码
val result = sc.textFile("application/files/greeting.txt")
.flatMap(_.split(" "))
.map((_,1))
.reduceByKey(_+_)
.saveAsTextFile("applications/files/out/wordcount")
简单的解释(我把代码分开来运行),后续的文章会详细说
文件内容:
1.从文件中创建一个RRD,使用sc.textFile()
2.按照空格分割,将数据集压平
3.把数据转化为元组
4.对结果进行按照Key相同的组的值进行累加
5.将结果保存到指定的文件
文件part-00000,part-00001为不同的分区文件(具体内容后续介绍)
点击“Configuration” > plugins
之后搜索Scala 在右侧的点击“Install”即可,安装完成之后创建项目”WordCount”
点击“next”(这里一定要选择Spark要求的Scala版本)
完整结构如下:
关键的过程详细说明一下
1.创建lib文件夹,导入需要的Jar包(Jar包的来源,上一节说到spark安装后的目录结构里面就有一个jars文件夹,那么这里就是需要依赖jars,添加到lib即可),导入之后,执行如下操作
此时我们就可以在文件中导入所依赖的jar包了
2.打包
这里选择Empty,防止打包出来的包含引用jars,导致过大
起包名,并向包中添加清单文件(Manifest),默认点击Open即可
将程序编译的输出打包到包中
添加Jar的Main入口
完整结构如下
编译Artifacts
在项目的out目录下,可以看到编译的Jar包
3.提交jar到Spark上执行
将jar包发送到虚拟机spark81的applications目录下
scp -r CalculateWordCount.jar root@spark81:applications
在spark81下运行如下命令
spark-submit --master spark://sprk81:7077 --class example.WordCount CalcalateWordCount.jar files/greeting.txt files/out/wordcount
运行结果如spark shell的运行结果
1.Exception: spark master 没有链接上
解决办法:运行 start-all.sh
启动spark集群
2.Exception:输出文件已存在
解决办法:删除已经存在的文件或者是文件夹
3.Exception:对应的版本不一致,类似的异常信息
scala/runtime/java8/JFunction1$mcII$sp
解决办法:使用对应版本的scala编写程序,并运行在Spark集群