面试题: MapReduce 和 Spark 的本质区别MR:
1. 只能在离线计算
2. 复杂计算逻辑,一个MR无法完成,需要多个MR按先 后顺序串联
3. 多个MR就要进行频繁的读写HDFS,效率低
4. 编程API不够灵活,只能在map和reduce自己实现逻辑
Spark: 1. 即可以做离线计算,又可以做实时计算
2. 提供了抽象的数据集(RDD Dataset DataFrame DStream)
3. 高度封装的API,算子丰富
4. 使用了先进的DAG有向无环图,切分Stage,优化pipeline
5. 数据可以cache复用
6. 数据可checkpoint保证安全
注意: MR和Spark在Shufile 时数据都落在本地磁盘
standalone角色及执行过程
client模式 和 Cluster模式 :
Master 负责管理 Worker,接收客户端提交的任务 以及资源调度 Worker 负责管理所在的节点,启动executor并监控executor的状态 executor 线程池, 相当于一个Java进程,负责运行Driver端生成的Task,将Task放入线程中执行
SparkSubmit 是一个Java进程,负责向Master提交任务
Driver 是很多类的统称,可以认为SparkContext就是Driver,负责将用户编写的代码转成Tasks,然后调度到 Executor中执行,并监控Task的状态和执行进度。
client模式Driver运行在SparkSubmit进程中
cluster模式单独运行在一个进程中
Task 分发到Executor上的工作任务,是Spark的最小执行单元 相当于类的实例
1. Mater启动后定时检测超时的Worker
2. Worker启动和master获取连接 , Master保存Worker的信息(内存,cpu等)后 返回注册成功的消息
3. Worker定期向Master发送心跳
4. SparkSubmit通过rpc通信提交任务给Master,并向Master申请资源, Master将符合条件的Worker筛选 出来(内存和核数等 资源符合条件),通过RPC通信,让Worker 启动 executor 并监控executor的状态
5. executor启动后向Driver 反向注册(位置信息由 Master -- Worker -- executor),
6. driver生成TaskSet 后将Task(计算逻辑)发送给对应的executor执行
Spark集群安装
1. 下载安装包,下载地址: https://spark.apache.org/downloads.html
apache所有的安装包源码,外网速度慢 http://archive.apache.org/dist/
可以去阿里或者清华大学源码站 速度快
2. 压缩包上传解压
目录: /opt/apps
解压 tar -zxvf 包名 /
3. 进入到spark包目录将conf中目录下的spark-env.sh.template重命名为spark-env.sh,再添加
export JAVA_HOME=/opt/apps/jdk.1.8.0_251
export SPARK_MASTER_HOST=linux01
4. 将conf目录下的slaves.template重命名为slaves并修改,指定Worker的所在节点
linux01
linux02
linux03
5. 将配置好的spark拷贝到其他节点
scp -r spark-3.0.1-bin-hadoop3.2 linux02:$PWD
scp -r spark-3.0.1-bin-hadoop3.2 linux03:$PWD
快速方法: for i in {2..3}; do scp -r /opt/apps/spark-3.0.1-bin-hadoop3.2/ linux0$i:$PWD; done;6. 在spark的安装目录下执行启动脚本
sbin/start-all.sh
7. 执行jps命令查看java进程
jps 在linux01上可以看见Master和Worker进程,在其他节点上可以看到Worker进程
8. 访问Master的web管理界面,端口: 如果8080被占用可用8081 8082... linux01:80809. 如果部署出错,查看日志: /opt/apps/spark-3.0.1-bin-hadoop3.2/log 使用命令查看: