spark(4)spark-shell使用
spark-shell使用
运行spark-shell --master local[N] 读取本地文件
选项说明:
- local 表示程序在本地进行计算,跟spark集群目前没有任何关系
- N 它是一个正整数,表示使用N个线程参与任务计算
- local[N] 表示本地采用N个线程计算任务
spark-shell --master local[2]
- 默认会产生一个SparkSubmit进程
示例: 读取本地文件进行单词统计
第一步:创建文件
[hadoop@node01 ~]$ cd /tmp
[hadoop@node01 tmp]$ vi words.txt
hadoop spark spark
flume flink hadoop hadoop
第二步:开启spark-shell
[hadoop@node01 ~]$ spark-shell --master local[2]
2020-04-14 18:15:00 WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://node01:4040
Spark context available as 'sc' (master = local[2], app id = local-1586859312537).
Spark session available as 'spark'.
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.3.3
/_/
Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_141)
Type in expressions to have them evaluated.
Type :help for more information.
scala>
说明:
- Spark context available as 'sc',启动spark shell的时候,Spark context被初始化为了'sc'
第三步:编写scala程序
scala> sc.textFile("file:///tmp/words.txt").flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>x+y).collect
res0: Array[(String, Int)] = Array((flink,1), (spark,2), (hadoop,3), (flume,1))
//可以简写成下面:
sc.textFile("file:///tmp/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
说明:
- sc.textFile()——加载数据 大致格式:hadoop spark spark
- flatMap(x=>x.split(" "))——扁平化: 大致格式:List(hadoop,spark,spark)
- map(x=>(x,1))——映射 大致格式:List((hadoop,1),(spark,1),(spark,1))
- reduceByKey((x,y)=>x+y)——按Key聚合 大致格式:(hadoop,List(1,1))----->(hadoop,2)
- collect——收集打印
- 结果是被装在Array里面的
运行spark-shell --master local[N] 读取HDFS上文件
spark整合HDFS
在node01上修改配置文件
vi /kkb/install/spark/conf/spark-env.sh
export HADOOP_CONF_DIR=/kkb/install/hadoop-2.6.0-cdh5.14.2/etc/hadoop
分发到其他节点
sudo scp spark-env.sh node02:/kkb/install/spark/conf
sudo scp spark-env.sh node03:/kkb/install/spark/conf
示例:读取HDFS文件进行单词统计
第一步:将文件上传到hdfs
开启hadoop
hadoop.sh start
hdfs dfs -put /tmp/words.txt /
第二步:开启spark shell
spark-shell --master local[2]
第三步:编写spark程序
scala> sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
res5: Array[(String, Int)] = Array((flink,1), (spark,2), (hadoop,3), (flume,1))
//简写:
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
运行spark-shell 指定集群中活着master
上面的--local方式是本地运行的,没有使用到spark集群,当使用--master指定alive状态的master时就是使用spark集群来运行了。
开启spark shell
spark-shell --master spark://node01:7077 --executor-memory 1g --total-executor-cores 2
--master spark://node01:7077 #指定活着的master地址
--executor-memory 1g #指定每一个executor进程的内存大小
--total-executor-cores 4 #指定总的executor进程cpu核数
开启spark shell,访问web端,会显示(local方式运行spark shell时是不会显示的):
示例1:读取HDFS上文件进行单词统计
sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
//实现读取hdfs上文件之后,需要把计算的结果保存到hdfs上
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/out")
示例2:读取HDFS上文件进行单词统计并将结果保存到HDFS
sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("hdfs://node01:8020/spark_out")
查看保存到HDFS的结果,结果被存放到两个文件中:
[hadoop@node01 tmp]$ hdfs dfs -ls /spark_out
Found 3 items
-rw-r--r-- 3 hadoop supergroup 0 2020-04-14 19:46 /spark_out/_SUCCESS
-rw-r--r-- 3 hadoop supergroup 10 2020-04-14 19:46 /spark_out/part-00000
-rw-r--r-- 3 hadoop supergroup 31 2020-04-14 19:46 /spark_out/part-00001
[hadoop@node01 tmp]$ hdfs dfs -cat /spark_out/part-00000
(flink,1)
[hadoop@node01 tmp]$ hdfs dfs -cat /spark_out/part-00001
(spark,2)
(hadoop,3)
(flume,1)
#为什么结果会保存到两个文件中?后面会讲