课程介绍
Spark入门、环境搭建、WordCount
Spark 概述
1- spark 历史
- 2009年诞生于美国加州大学伯克利分校AMP 实验室,
- 2014年2月,Spark 成为 Apache 的顶级项目
HADOOP复习回顾
HDFS:分布式存储系统
文件分区、分片:把大文件按 128M 切分成若干个小文件保存起来,一:便于存储,二:便于分布式计算
Yarn:资源调度系统
调度的方式:
FIFO \ Fair \Capacity
spark 与 hadoop 的区别
Hadoop | Spark | |
---|---|---|
类型 | 基础平台, 包含计算, 存储, 调度 | 分布式计算工具 |
场景 | 大规模数据集上的批处理 | 迭代计算, 交互式计算, 流计算 |
价格 | 对机器要求低, 便宜 | 对内存有要求, 相对较贵 |
编程范式 | Map+Reduce, API 较为底层, 算法适应性差 | RDD组成DAG有向无环图, API 较为顶层, 方便使用 |
数据存储结构 | MapReduce中间计算结果存在HDFS磁盘上, 延迟大 | RDD中间运算结果存在内存中 , 延迟小 |
运行方式 | Task以进程方式维护, 任务启动慢 | Task以线程方式维护, 任务启动快 |
Spark 运行模式
Spark运行模式
1.local 本地模式(单机)–开发测试使用
分为local单线程和local-cluster多线程
2.standalone 独立集群模式–开发测试使用
典型的Mater/slave模式
3.standalone-HA高可用模式–生产环境使用
基于standalone模式,使用zk搭建高可用,避免Master是有单点故障的
4.on yarn集群模式–生产环境使用
运行在 yarn 集群之上,由 yarn 负责资源管理,Spark 负责任务调度和计算,
好处:计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。
FIFO
Fair
Capacity
5.on mesos集群模式–国内使用较少
运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算
6.on cloud 集群模式–中小公司未来会更多的使用云服务
比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon的 S3
Spark 运行环境
#本地模式
1- 下载,解压、改名(可选)
2- 开箱即用
直接启动bin目录下的spark-shell:
./spark-shell
3- 退出
:quit
4- spark-shell 命令介绍
1.直接使用./spark-shell
表示使用local 模式启动,在本机启动一个SparkSubmit进程
2.还可指定参数 --master,如:
spark-shell --master local[N] 表示在本地模拟N个线程来运行当前任务
spark-shell --master local[*] 表示使用当前机器上所有可用的资源
3.不携带参数默认就是
spark-shell --master local[*]
4.后续还可以使用--master指定集群地址,表示把任务提交到集群上运行,如
./spark-shell --master spark://node01:7077,node02:7077
5.退出spark-shell
使用 :quit
读取本地文件
val textFile = sc.textFile("本地文件的路径名")
val counts = textFile.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
counts.collect//收集结果
// Array[(String, Int)] = Array((you,2), (hello,4), (me,1), (her,3))
读取 hdfs 文件
// 读取 hdfs 中的文件
val textFile = sc.textFile("hdfs的文件输入路径名")
// 对文件中的数据进行处理
val counts = textFile.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
// 将结果保存至文件
counts.saveAsTextFile("hdfs的文件输出路径名")
Standalone 集群模式
一:配置
修改Spark配置文件
1- 修改 spark-env.sh 文件
cd /export/servers/spark/conf
mv spark-env.sh.template spark-env.sh
vim spark-env.sh
#配置java环境变量 ( 注意修改为 你自己的 java 地址)
export JAVA_HOME=/export/servers/jdk1.8.0_141
#指定spark老大Master的IP
export SPARK_MASTER_HOST=node01
#指定spark老大Master的端口
export SPARK_MASTER_PORT=7077
2- 修改 slaves 文件
mv slaves.template slaves
vim slaves
node02
node03
3- 分发文件
●通过scp 命令将配置文件分发到其他机器上
scp -r /export/servers/spark node02:/export/servers
scp -r /export/servers/spark node03:/export/servers
二:启动 集群
●集群启动和停止
在主节点上启动spark集群
/export/servers/spark/sbin/start-all.sh
在主节点上停止spark集群
/export/servers/spark/sbin/stop-all.sh
三: 查看web界面
正常启动spark集群后,查看spark的web界面,查看相关信息。
四:测试
启动 Spark-shell
/export/servers/spark/bin/spark-shell --master spark://node01:7077
输入代码并执行
sc.textFile("hdfs://node01:8020/wordcount/input/words.txt")
.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.saveAsTextFile("hdfs://node01:8020/wordcount/output222")
五:查看面板
Saprk 程序运行状态查看: web UI
- 注意,只有当 spark 程序 运行时,该页面才能看到结果,结束以后,该页面就打不开了
- 集群模式下程序是在集群上运行的,不要直接读取本地文件,应该读取hdfs上的
Standalone-HA 集群模式
zookeeper 回顾:
/spark/standalone-ha/master001
订阅节点、发布节点
临时节点:主机A 创建临时节点 B ,如果A 宕机了,节点B 自动会被删除
其他节点 订阅 节点 B 的状态,当节点B 删除时,就知道 主机A 宕机
zookeeper 一键启动脚本:
Standalone-HA 配置
1- 修改 spark-env. sh 文件
●注释掉Master配置
#export SPARK_MASTER_HOST=node01
●在spark-env.sh添加SPARK_DAEMON_JAVA_OPTS,内容如下(注意 以下代码是一行 ):
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181 -Dspark.deploy.zookeeper.dir=/spark"
2- scp到其他节点
scp /export/servers/spark/conf/spark-env.sh node02:/export/servers/spark/conf/
scp /export/servers/spark/conf/spark-env.sh node03:/export/servers/spark/conf/
启动zk集群
分别启动三台zookeeper 主机
zkServer.sh start // 启动
zkServer.sh status // 查看状态
zkServer.sh stop // 停止
启动Spark_HA集群
node01上启动Spark集群执行
/export/servers/spark/sbin/start-all.sh
在node02 上单独启动 master 进程
/export/servers/spark/sbin/start-master.sh
-
在启动的时候注意观察 node01:8080 和 node02:8080 中的信息
-
启动成功后,node01 中显示 ALIVE 状态,node02 中显示 STANDBY 状态
●注意:
在普通模式下启动spark集群
只需要在主节点上执行start-all.sh 就可以了
在高可用模式下启动spark集群
先需要在任意一台主节点上执行start-all.sh
然后在另外一台主节点上单独执行start-master.sh
测试程序
一: 启动 spark-shell
/export/servers/spark/bin/spark-shell --master spark://node01:7077,node02:7077
二:执行程序
sc.textFile("hdfs://node01:8020/wordcount/input/words.txt")
.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.saveAsTextFile("hdfs://node01:8020/wordcount/output3")
Spark 程序运行在 Yarn 集群中
Yarn集群运行模式要求:
- 只需要有一台机器安装好spark即可
- yarn 集群安装置完成
1- 修改配置文件 spark-env.sh
vim /export/servers/spark/conf/spark-env.sh
# 注意,路径要改为 你的 hadoop 配置文件所在路径
export HADOOP_CONF_DIR=/export/servers/hadoop-2.7.5/etc/hadoop
2- cluster 模式
在生产环境中用的最多的模式
执行命令:
/export/servers/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
--queue default \
/export/servers/spark/examples/jars/spark-examples_2.11-2.2.0.jar \
10
查看程序运行状态的界面:
3- client 模式[了解]
执行命令:
/export/servers/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
--queue default \
/export/servers/spark/examples/jars/spark-examples_2.11-2.2.0.jar \
10
4- cluster 模式与 client 模式的区别
Cluster 和 Client 模式最最本质的区别是:Driver程序运行在哪里!
运行在YARN集群中就是Cluster模式,
运行在客户端就是Client模式
配置历史日志
1- 当 spark 程序 运行时,通过 node01:4040 可以查看运行状态,程序结束后就看不到了。
使用 spark-submit 提交的方式 ,把任务 提交给 spark 集群
/export/servers/spark/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://node01:7077,node02:7077 \
--executor-memory 1g \
--total-executor-cores 8 \
/export/servers/spark/examples/jars/spark-examples_2.11-2.2.0.jar \
10
Spark 历史服务器
1- 修改配置文件
●修改文件名
cd /export/servers/spark/conf
cp spark-defaults.conf.template spark-defaults.conf
●修改配置
vim spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://node01:8020/sparklog
* 要手工创建 sparklog 目录
hdfs dfs -mkdir -p /sparklog
修改 spark-env.sh
vim spark-env.sh
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=4000 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://node01:8020/sparklog"
2- 同步配置文件
scp -r /export/servers/spark/conf/ node02:/export/servers/spark/conf/
scp -r /export/servers/spark/conf/ node03:/export/servers/spark/conf/
3- 启动历史服务器程序
/export/servers/spark/sbin/stop-all.sh
/export/servers/spark/sbin/start-all.sh
在master上启动日志服务器
/export/servers/spark/sbin/start-history-server.sh
4- 查看页面:
http://node01:4000/