![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=1739354625-WQkMNmOg4ZYSoWcfGydcRkOWCbvbHFGL-0-e98effd583dafd1bd1cb5e2020ab9d0e)
执行下面的命令,spark-shell会连接到Master,以Standalone模式执行程序。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_01.jpg?sign=1739354625-IbjNkuZbSu8T41U3OARiKPJZK6C1ANuc-0-e867f374550ebbc4d84cb934e1790115)
本节后续的示例都将基于Standalone模式。
2.设置日志级别
spark-shell启动后,系统部分界面如下所示。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_03.jpg?sign=1739354625-lx6IuxLKshFvBTxcv4CUI8w6KejDV6et-0-1f3028f960e8ac61d9b00355fb222fa2)
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=1739354625-l4nvdOTz49TCg46aHNWcU0Radxa6EPPZ-0-e53e1ec4dea9f6bd3053d6f1a65b3757)
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=1739354625-VGISrB32eZBCyiisRJH2QdTt00adsOUB-0-d1393ebfdb2dcbfaf38eca91ddf5239d)
代码执行结果如下。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_09.jpg?sign=1739354625-gE7cmRWIjEpFvcbdM34K9oSS6G9SbNHX-0-bece18347b8bd7c63fb0718ef7835435)
将该List转换为RDD,并划分为5个Partition。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_10.jpg?sign=1739354625-mKLxfrjY3vJ1yXZQPS6MF30vFnIVDVUR-0-59d0725c2ba173f1093453c81dc3cd2d)
对每个Partition进行map操作,map中的匿名函数体决定具体操作。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_52_11.jpg?sign=1739354625-pQIGBRBP6O8AvE9PibceNWr5oFhJkxOO-0-797c9c99caf3331fd249ee42396fa740)
按〈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=1739354625-XrgR7YYDbMli8l6sVEBPUnuJtSm09IBP-0-780afaf6f9da0f985b0c47de6081ff54)
可以看到执行进度,最后看到Driver端收集的结果如下,则说明执行成功。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_02.jpg?sign=1739354625-uFeaV1v6lre9O8QyMFr9kehziHwrJRd8-0-26cbf35bccb7e69e2eae44f40886e0e4)
关于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=1739354625-5LqcwuktHpvWPpJ4zEFIjksMVqb2ftc4-0-c9d12994679c4cc1e86b8e6c1b6cc381)
后续,如果重新启动了 spark-shell,可以使用下面的命令加载 HelloSpark.session,执行之前的所有代码。
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_05.jpg?sign=1739354625-FJOUD1oZ8UPmhFpzBH77SlnfOg8WPw5Y-0-904620b4ee0ea73253d3db3fe6241874)
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=1739354625-ULDu5tspt75VO6N19L5SikJ5fKTxf3Pt-0-d996d295ab33432a098c7fda400c219a)
2)退出spark-shell;
![](https://epubservercos.yuewen.com/16501E/19573973308593806/epubprivate/OEBPS/Images/978-7-111-65100-0_53_07.jpg?sign=1739354625-VYfcSlrrXAYe5bNPxhk5axjRNbzgQIZy-0-e75bbd81603a09466b1e6fd1577d6745)