Spark程序简单使用
1、执行第一个spark程序
在spark目录下执行以下任务:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077 \
--executor-memory 1G \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.1.3.jar \
100
该算法是利用蒙特•卡罗算法求圆周率PI,最后的100为任务迭代的次数,该次数越大,结果越趋向于精确。
参数说明:
–master spark://node1:7077 指定Master的地址
–executor-memory 1G 指定每个worker可用内存为1G,该处数字应为正整数。当虚拟机内存较小是,也可以写100M,500K。但不能写成类似0.5G,会报错。
–total-executor-cores 2 指定整个集群使用的cup核数为2个
运行过程中,master界面中Running Applications显示如下:
运行结束后:
运行结果截图:
注意:以上运行程序中,指明了 --master spark://node01:7077
,这是在已知master所在主机的情况下(此时确定master是node01,且为Alive状态),否则会报错。
高可用模式下,当集群设备主机较多时,在程序执行前不能确定哪台主机master为Alive状态时(高可用模式下,master可能有多个,但只有一个是Alive状态),可以在SparkContext指向一个Master列表。
例如:如果我三台主机均启动了master,在执行命令时,我可以将master的地址设置为:--master spark://node1:7077,node2:7077,node3:7077
,这样应用程序执行时会轮询列表,找到状态为Alive的Master,将任务提交给该Master.
以上任务命令可改为:
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077,node02:7077,node03:7077 \
--executor-memory 500M \
--total-executor-cores 2 \
examples/jars/spark-examples_2.11-2.1.3.jar \
100
2、启动Spark-Shell
spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序。
2.1 运行spark-shell --master local[N] 读取本地文件
单机模式:通过本地N个线程跑任务,只运行一个SparkSubmit进程。
案例:wordcount实现
需求:读取本地文件,实现文件内的单词计数。
1、准备本地文件words.txt,这里放在/root/ 目录下:
2、启动Spark-shell:
bin/spark-shell --master local[2]
–master local[N]
- local表示本地模式,N是一个正整数,local[N]表示本地采用N个线程运行程序
- 它会产生一个SparkSubmit进程
3、编写scala代码
sc.textFile("/root/words.txt").flatMap(x=>x.split(" ")).map(x=>(x,1)).reduceByKey((x,y)=>x+y).collect
或者简写:
sc.textFile("/root/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
说明:
sc:Spark-Shell中已经默认将SparkContext类初始化为对象sc。用户代码如果需要用到,则直接应用sc即可。
textFile:读取数据文件
flatMap:对文件中的每一行数据进行切分,这里按照空格分隔。
map:对出现的每一个单词记为1(word,1)
reduceByKey:对相同的单词出现的次数进行累加
collect:触发任务执行,收集结果数据。
2.2 使用spark-shell --master local[N] 读取HDFS上数据文件,实现单词统计
1、spark整合HDFS
vim /export/servers/spark/conf/spark-env.sh
添加hadoop的配置文件目录:
export HADOOP_CONF_DIR=/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
添加之后,spark可以调用hadoop配置文件中相关内容。
2、重新启动hadoop,spark
3、上传words.txt到hdfs中,这里放在/ 目录下
3、spark-shell --master local[2]
执行命令将结果打印输出:
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
或者
sc.textFile("hdfs://node01:8020/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
执行命令,将结果保存到hdfs上:
sc.textFile("/words.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("/out")