![Spark大数据编程实用教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/942/36922942/b_36922942.jpg)
2.5 Spark程序在spark-shell上运行
前面介绍了Spark程序运行的两种方式:Local 运行和分布式运行。但不管是哪种方式,它们都是通过spark-submit来提交和运行的。
本节介绍另一种Spark程序的执行方式,即使用spark-shell来执行Spark程序。
spark-shell可以通过交互的方式来解释执行Spark代码。Spark-shell既可以Local方式执行Spark代码,也可以连接到集群管理器,如Standalone、Yarn和Mesos等以分布式方式运行,具体由spark-shell后面的参数决定。
1.确定运行方式和运行模式
spark-shell是以Local运行还是在Yarn或Standalone上运行,由--master后面的参数决定,具体参数如表2-2所示,如果不指定,默认是local。
表2-2 spark-shell运行方式和运行模式配置表
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_51_07.jpg?sign=1738934814-frRbz9HbAEum9dUKShuuZ4kRSK4geSfT-0-452239baf6cfa64859d838e55c6ce531)
执行下面的命令,spark-shell会连接到Master,以Standalone模式执行程序。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_01.jpg?sign=1738934814-N18bUSoMBUFqzB1pM3sO4fszNeqTwPWr-0-8b55c6bdc8a3a41ba151c96dd77e3c21)
本节后续的示例都将基于Standalone模式。
2.设置日志级别
spark-shell启动后,系统部分界面如下所示。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_03.jpg?sign=1738934814-146Kt5oMHxFmuyVImKxTCgIorhYhBxqG-0-affa90403fc1092779021e09800c6cd2)
spark-shell 启动后,会自动创建 SparkContext 对象,并将该对象引用赋值给 sc,因此,在spark-shell中可直接使用sc。
一个SparkContext对象表示一个Spark Application。Spark程序目前不支持多个SparkContext对象同时存在,因此,一个Spark程序运行时,任何时候只能有一个Spark Application;
SparkContext对象是Spark功能入口:它提供了创建RDD的接口,也提供了对此次Application配置的接口。每个Spark程序都要创建一个SparkContext对象。
scala>后面可以输入Spark代码,回车后,便执行此行代码。
spark-shell默认的日志级别为WARN,可以使用代码来设置日志级别为INFO。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_06.jpg?sign=1738934814-6wiGqNLIOzW1BUeaVTsKB1zkpusp6U3c-0-2de5ee12eda0160861dd0ece7e917a92)
Spark 的日志级别有 ALL、DEBUG、ERROR、FATAL、TRACE、WARN、INFO 和 OFF,可以根据需要设置。
3.执行代码
在spark-shell中,输入下面的代码(创建一个List)。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_08.jpg?sign=1738934814-gMYRdS6uUCwt9G0Xhw4yloUuBvbwCQWO-0-31eb3eb798b04deb4f41330563293d23)
代码执行结果如下。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_09.jpg?sign=1738934814-rYBTMTn7ZjawW8ScbZXjZQKFLmPtL5Is-0-198a39bfd2154876e935cbda5112ec34)
将该List转换为RDD,并划分为5个Partition。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_10.jpg?sign=1738934814-LVWFHxFwsrGgMyPCGOFH1JnX0TItida3-0-4721e0853c09e33cf2b52d8978f5b747)
对每个Partition进行map操作,map中的匿名函数体决定具体操作。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_11.jpg?sign=1738934814-hTxyoYbr7bQnIZ41aUtPttgH1orTBytx-0-b971ef3bebb04b83c32ac3fef4513cfe)
按〈Enter〉键后,numRdd.map 并不会立即将 numRdd 中的每个元素送入 map 的匿名函数(n=>{println("num"+n+"hello spark!");Thread.sleep(n*2000);(n,n*100)})进行处理,这是因为RDD的map操作属于Transformation(所谓Transformation就是将一个数据集(本地数据集、Hadoop所支持的文件、RDD)转换为另一个RDD的操作),Transformation是延迟执行的,只有等遇到RDD或者子RDD的Action操作时,才会触发其真正执行,这个后面还会详细解释。
调用collect收集rs结果,collect是Action操作,回车后,将会触发前面的map真正执行。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_01.jpg?sign=1738934814-YShevLjYznpxyBJiLTPggsQIjLbWXlzm-0-9bcbd599bec04d6158d5b630aa1738fd)
可以看到执行进度,最后看到Driver端收集的结果如下,则说明执行成功。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_02.jpg?sign=1738934814-jqwY7fjyFnnnCojH3OMHRSZ4detihh3K-0-d40120b433602184c2cc5a951dd07c14)
关于RDD、Partition、map操作等概念在后续章节会有详细介绍,此处仅执行相应操作即可。
4.保存
输入下面的命令,可以将之前输入的代码保存到文件 HelloSpark.session 中,HelloSpark.session名字可以改,根据需要自定义,如果前面不加路径,则保存在启动spark-shell的当前目录下,也可以自己加路径。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_04.jpg?sign=1738934814-AgG3JyZidrOsaW4qYlKjlVDcYzCE0RXx-0-9b9c7252566ecd42b58c2319a9ba3d39)
后续,如果重新启动了 spark-shell,可以使用下面的命令加载 HelloSpark.session,执行之前的所有代码。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_05.jpg?sign=1738934814-XaUpxCnL2NZZ0wv4aRucd5UDTm1LRIMb-0-2c2118061d5c1f81ea4aedc8388bf5e3)
5.Web UI查看
执行后,可以通过Web UI方式登录http://scaladev:4040查看代码执行情况。
6.快捷键
spark-shell常用的快捷键包括〈Tab〉键补全,上下光标键遍历历史命令等。
7.内建命令
spark-shell 支持多个内建命令,可以使用:help 查看所有的内建命令。以下是两个内建命令举例。
1)查看内建命令及帮助;
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_06.jpg?sign=1738934814-gMGW21KkA3CNObqMHdXY9QT4RM6pRXOa-0-cd2d1c26d96a1cbf4ad197288274e754)
2)退出spark-shell;
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_07.jpg?sign=1738934814-EKZZMzOMtQiFlrk5v9s8s1rVQrB4gjFe-0-6cd3286f2185502915926e524f41dcf3)