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运行方式和运行模式配置表
执行下面的命令,spark-shell会连接到Master,以Standalone模式执行程序。
本节后续的示例都将基于Standalone模式。
2.设置日志级别
spark-shell启动后,系统部分界面如下所示。
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。
Spark 的日志级别有 ALL、DEBUG、ERROR、FATAL、TRACE、WARN、INFO 和 OFF,可以根据需要设置。
3.执行代码
在spark-shell中,输入下面的代码(创建一个List)。
代码执行结果如下。
将该List转换为RDD,并划分为5个Partition。
对每个Partition进行map操作,map中的匿名函数体决定具体操作。
按〈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真正执行。
可以看到执行进度,最后看到Driver端收集的结果如下,则说明执行成功。
关于RDD、Partition、map操作等概念在后续章节会有详细介绍,此处仅执行相应操作即可。
4.保存
输入下面的命令,可以将之前输入的代码保存到文件 HelloSpark.session 中,HelloSpark.session名字可以改,根据需要自定义,如果前面不加路径,则保存在启动spark-shell的当前目录下,也可以自己加路径。
后续,如果重新启动了 spark-shell,可以使用下面的命令加载 HelloSpark.session,执行之前的所有代码。
5.Web UI查看
执行后,可以通过Web UI方式登录http://scaladev:4040查看代码执行情况。
6.快捷键
spark-shell常用的快捷键包括〈Tab〉键补全,上下光标键遍历历史命令等。
7.内建命令
spark-shell 支持多个内建命令,可以使用:help 查看所有的内建命令。以下是两个内建命令举例。
1)查看内建命令及帮助;
2)退出spark-shell;