Spark 2.x管理与开发-执行Spark Demo程序(二)使用Spark Shell

spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。

操作过程概述:

(1)启动Spark Shell:spark-shell :quit)

也可以使用以下参数:

参数说明:

--master spark://spark81:7077 指定Master的地址

--executor-memory 2g 指定每个worker可用内存为2G

--total-executor-cores 2 指定整个集群使用的cup核数为2个

例如:

spark-shell --master spark://spark81:7077 --executor-memory 2g --total-executor-cores 2

[root@bigdata111 spark-2.1.0-bin-hadoop2.7]# ./bin/spark-shell --master spark://bigdata111:7077

(2)注意:

如果启动spark shell时没有指定master地址,但是也可以正常启动spark shell和执行spark shell中的程序,其实是启动了spark的local模式,该模式仅在本机启动一个进程,没有与集群建立联系

请注意local模式和集群模式的日志区别:

spark shell 命令 spark shell 参数_spark

(3)在Spark Shell中编写WordCount程序

程序如下:

sc.textFile("hdfs://192.168.88.111:9000/data/data.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://192.168.88.111:9000/output/spark/wc")

说明:

  1. sc是SparkContext对象,该对象时提交spark程序的入口
  2. textFile("hdfs://192.168.88.111:9000/data/data.txt")是hdfs中读取数据
  3. flatMap(_.split(" "))先split再压平
  4. map((_,1))将单词和1构成元组
  5. reduceByKey(_+_)按照key进行reduce,并将value累加
  6. saveAsTextFile("hdfs://192.168.88.111:9000/output/spark/wc")将结果写入到hdfs中

**************自己操练************

Spark Shell相当于REPL命令行工具,作为一个独立的Application运行。

启动Spark Shell

[root@bigdata111 bin]# ./spark-shell --master spark://bigdata111:7077

 

spark shell 命令 spark shell 参数_hadoop_02

1.两种模式:

1)本地模式:

不需要连接到spark集群上,在本地直接运行,用于开发和测试。

现在关闭Spark集群:

 

spark shell 命令 spark shell 参数_spark_03

本地模式执行Spark shell (后面不指定master时为本地模式)

[root@bigdata111 spark-2.1.0-bin-hadoop2.7]# ./bin/spark-shell

 

spark shell 命令 spark shell 参数_spark_04

2)集群模式(常用)

(1)先将Spark集群启动起来

[root@bigdata111 spark-2.1.0-bin-hadoop2.7]# ./sbin/start-all.sh

(2)Spark shell后面需要指定master

[root@bigdata111 spark-2.1.0-bin-hadoop2.7]# ./bin/spark-shell --master spark://bigdata111:7077

 

spark shell 命令 spark shell 参数_spark_05

2.具体操作

1)上传测试数据文件

新建一个tmp_files目录:/usr/local/tmp_files

上传测试文件到此目录下(以后也是)

 

spark shell 命令 spark shell 参数_spark shell 命令_06

2)在spark shell中开发WordCount程序

  • 处理本地文件,将结果打印到屏幕上:

         

spark shell 命令 spark shell 参数_hadoop_07

 

 

  •  处理HDFS上的文件

        (1)启动Hadoop(全分布式)

 [root@bigdata111 tmp_files]# start-dfs.sh

                   [root@bigdata112 ~]# start-yarn.sh

       (2)启动Zookeeper(三台可同步启动)、查看状态

  [root@bigdata111 tmp_files]# zkServer.sh start

                  

spark shell 命令 spark shell 参数_Shell_08

       (3)jps查看状态

                  

spark shell 命令 spark shell 参数_Shell_09

                查看Hadoop可视化界面:

                  

spark shell 命令 spark shell 参数_hadoop_10

   (4)往HDFS上上传数据文件

       首先,新建两个目录tmp_files、tmp_outputFiles:

[root@bigdata111 tmp_files]# hadoop fs -mkdir -p /tmp_files

              [root@bigdata111 tmp_files]# hadoop fs -mkdir -p /tmp_outputFiles

       接下来,将测试的数据文件上传到此目录下(以后也是)

 [root@bigdata111 tmp_files]# hadoop fs -put /usr/local/tmp_files/A.txt /tmp_files

              tmp_outputFiles目录下存放的就是测试后的结果文件(以后都是)

  (5)在Spark shell上写命令行

          

spark shell 命令 spark shell 参数_spark_11

注-1:

这里的9000是自己安装部署Hadoop时,core-site.xml文件内设置的HDFS-NameNode所在的端口号,

注-2:saveAsTextFile()可以将结果文件存入本地,但是分情况。

如果Spark是伪分布式(Master和Slave在一个节点上),是没问题的;

但是如果有多个slave,那在写数据的时候就会往本地的多个路径上写数据(因为本地有多台主机),就有可能出现问题。

 (6)查看HDFS上的结果文件

         

spark shell 命令 spark shell 参数_hadoop_12

   (7)单步运行WordCount

           

spark shell 命令 spark shell 参数_spark shell 命令_13

          rdd1-rdd4都是RDD:

             

spark shell 命令 spark shell 参数_hadoop_14

 

         对rdd1-rdd4进行.collect操作:

          

spark shell 命令 spark shell 参数_spark shell 命令_15

 

         这样就都能打印出他们的值了,因为数据都由RDD转变成了Array

         

spark shell 命令 spark shell 参数_spark_16

        所以由此看看来,RDD的确是Spark的核心,因为所有的操作都是由RDD来做的。