走进Spark生态圈:运行程序在Spark集群

上一节 走进Spark生态圈:环境的安装与配置 我们在虚拟机上简单的搭建了运行于StandAlone的上的伪分布集群和全分布集群,并通过Spark的可视化查看集群的运行状态. 集群已经存在,这一节我们将会在集群上运行我们的第一个程序:统计文本中的单词数(简称:WordCount)
示例代码将使用Scala语言编写,运行在伪分布集群Spark81上

Spark核心对象

SparkConf:spark程序的配置对象,可以通该对象设置spark程序的要运行的master环境,app的名称等信息。
SparkContext:这个很重要,是Spark核心的上下文对象,使程序可以和Spark进行交互
RDD:分布式弹性数据集,任何数据在Spark上面都可以是RDD,RDD将数据并行的运行在不同的Worker上不同的Executer上

在集群上运行spark shell

spark shell可以把它看成是一个壳,可以直接运行在集群上,而壳中的内容就是我们用scala语言编写的程序。
让我们先来启动 spark shell,运行 spark-shell命令
走进Spark生态圈:运行程序在Spark集群_第1张图片

这里面有几个很重要的信息
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生态圈:运行程序在Spark集群_第2张图片

现在我们的spark程序则是运行在伪分布式的集群上,通过图中标注的信息即可看到,若感觉不明显,可以在浏览器中运行 spark81:8080 查看

走进Spark生态圈:运行程序在Spark集群_第3张图片

从图中可以看到当前Spark Master的地址,Spark的运行状态,集群中的Worker信息,和运行在Worker上应用程序的信息(可以看到当前有一个名字为spark shell的程序运行在集群上)

在spark shell上编写WordCount

在命令行中输入运行以下代码

val result = sc.textFile("application/files/greeting.txt")
               .flatMap(_.split(" "))
               .map((_,1))
               .reduceByKey(_+_)
               .saveAsTextFile("applications/files/out/wordcount")

简单的解释(我把代码分开来运行),后续的文章会详细说
文件内容:
走进Spark生态圈:运行程序在Spark集群_第4张图片
1.从文件中创建一个RRD,使用sc.textFile()
走进Spark生态圈:运行程序在Spark集群_第5张图片
2.按照空格分割,将数据集压平
走进Spark生态圈:运行程序在Spark集群_第6张图片
3.把数据转化为元组
走进Spark生态圈:运行程序在Spark集群_第7张图片
4.对结果进行按照Key相同的组的值进行累加
走进Spark生态圈:运行程序在Spark集群_第8张图片
5.将结果保存到指定的文件
走进Spark生态圈:运行程序在Spark集群_第9张图片

文件part-00000,part-00001为不同的分区文件(具体内容后续介绍)

走进Spark生态圈:运行程序在Spark集群_第10张图片

使用IntelliJ IDEA 开发Scala程序WordCount

物理机信息
走进Spark生态圈:运行程序在Spark集群_第11张图片
1.安装scala插件
走进Spark生态圈:运行程序在Spark集群_第12张图片

点击“Configuration” > plugins

这里写图片描述

之后搜索Scala 在右侧的点击“Install”即可,安装完成之后创建项目”WordCount”

走进Spark生态圈:运行程序在Spark集群_第13张图片

点击“next”(这里一定要选择Spark要求的Scala版本)

走进Spark生态圈:运行程序在Spark集群_第14张图片

完整结构如下

走进Spark生态圈:运行程序在Spark集群_第15张图片

关键的过程详细说明一下

1.创建lib文件夹,导入需要的Jar包(Jar包的来源,上一节说到spark安装后的目录结构里面就有一个jars文件夹,那么这里就是需要依赖jars,添加到lib即可),导入之后,执行如下操作

走进Spark生态圈:运行程序在Spark集群_第16张图片

此时我们就可以在文件中导入所依赖的jar包了

2.打包

这里选择Empty,防止打包出来的包含引用jars,导致过大

走进Spark生态圈:运行程序在Spark集群_第17张图片

起包名,并向包中添加清单文件(Manifest),默认点击Open即可

走进Spark生态圈:运行程序在Spark集群_第18张图片

将程序编译的输出打包到包中

走进Spark生态圈:运行程序在Spark集群_第19张图片
走进Spark生态圈:运行程序在Spark集群_第20张图片

添加Jar的Main入口

走进Spark生态圈:运行程序在Spark集群_第21张图片

完整结构如下

走进Spark生态圈:运行程序在Spark集群_第22张图片

编译Artifacts

走进Spark生态圈:运行程序在Spark集群_第23张图片

在项目的out目录下,可以看到编译的Jar包

走进Spark生态圈:运行程序在Spark集群_第24张图片

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集群

你可能感兴趣的:(spark,scala,Spark)