架构分析
- Spark自带的一种集群模式
- 是完整的Spark运行环境:
- Master角色以Master进程存在,Worker角色以Worker进程存在
- Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
StandAlone集群在进程上主要有3类进程:
- 主节点Master进程
- Master角色,管理整个集群资源,并托管运行各个任务的Driver
- 从节点Workers进程
- Worker角色,管理每个机器的资源,分配对应的资源来运行Executor(Task)
- 每个从节点分配资源信息给Worker管理,资源信息包含内存Memory和CPU Cores核数
- 历史服务器HistoryServer(可选)
- Spark Application运行完成以后,保存事件日志数据至HDFS
- 启动HistoryServer可以查看应用运行相关信息
安装配置
############################# 在所有节点上安装anaconda #############################
# 将安装脚本发送到各个节点
cd /hadoop/file && scp Anaconda3-2021.05-Linux-x86_64.sh node-212:`pwd`/
# 在各个节点 执行安装
sh ./Anaconda3-2021.05-Linux-x86_64.sh
# 创建虚拟环境
/hadoop/software/anaconda3/bin/conda create -n pyspark python=3.8
############################## 在各个节点配置环境变量 ###############################
# 修改profile
vi /etc/profile
# java
export JAVA_HOME=/hadoop/software/jdk1.8.0_241
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# hadoop
export HADOOP_HOME=/hadoop/software/hadoop-3.3.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
# spark
export SPARK_HOME=/hadoop/software/spark
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export PYSPARK_PYTHON=/hadoop/software/anaconda3/envs/pyspark/bin/python3.8 # 虚拟环境中的Python路径
# 修改bashrc
vi ~/.bashrc
# 追加环境变量
export JAVA_HOME=/hadoop/software/jdk1.8.0_241
export PYSPARK_PYTHON=/hadoop/software/anaconda3/envs/pyspark/bin/python3.8
############################## 修改Spark配置文件 ###############################
# 修改文件名,并编辑
mv workers.template workers && vi workers
# 将里面的localhost删除, 追加
node-211
node-212
node-213
# 功能: 这个文件就是指示了 当前SparkStandAlone环境下, 有哪些worker
############################## 修改Spark配置文件 ###############################
# 修改文件名,在底部追加如下内容
mv spark-env.sh.template spark-env.sh & vi spark-env.sh
# 设置JAVA安装目录
JAVA_HOME=/hadoop/software/jdk1.8.0_241
# HADOOP软件配置文件目录,读取HDFS上文件和运行YARN集群
HADOOP_CONF_DIR=/hadoop/software/hadoop-3.3.0/etc/hadoop
YARN_CONF_DIR=/hadoop/software/hadoop-3.3.0/etc/hadoop
# 指定spark老大Master的IP和提交任务的通信端口
# 告知Spark的master运行在哪个机器上
export SPARK_MASTER_HOST=node-211
# 告知sparkmaster的通讯端口
export SPARK_MASTER_PORT=7077
# 告知spark master的 webui端口
SPARK_MASTER_WEBUI_PORT=8080
# worker cpu可用核数
SPARK_WORKER_CORES=1
# worker可用内存
SPARK_WORKER_MEMORY=1g
# worker的工作通讯地址
SPARK_WORKER_PORT=7078
# worker的 webui地址
SPARK_WORKER_WEBUI_PORT=8081
# 设置历史服务器
# 配置的意思是 将spark程序运行的历史日志 存到hdfs的/sparklog文件夹中
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://node-211:8020/sparklog/ -Dspark.history.fs.cleaner.enabled=true"
############################## 准备HDFS文件系统 ##################################
# 创建文件夹
hadoop fs -mkdir /sparklog
# 指定权限
hadoop fs -chmod 777 /sparklog
######################## 配置spark-defaults.conf文件 #############################
# 修改文件名,追加配置
mv spark-defaults.conf.template spark-defaults.conf && vi spark-defaults.conf
# 开启spark的日期记录功能
spark.eventLog.enabled true
# 设置spark日志记录的路径
spark.eventLog.dir hdfs://node-211:8020/sparklog/
# 设置spark日志是否启动压缩
spark.eventLog.compress true
######################## 配置log4j.properties 文件 ################################
# 修改spark日志级别
vi log4j.properties.template
# 只需要吧INFO改成WARN
log4j.rootCategory=INFO, console ==>> log4j.rootCategory=WARN, console
# 查看
cat /hadoop/software/spark/conf/log4j.properties.template | grep rootCategory
############################ 将Spark分发到其他节点 ##################################
# 进入到spark的文件夹中
cd /hadoop/software/
scp -r spark node-212:`pwd`/
scp -r spark node-213:`pwd`/
######################################################################################
启动Spark
# 启动历史服务器
sbin/start-history-server.sh
######################################################################################
# 启动全部master和worker
sbin/start-all.sh
# 或者可以一个个启动:
# 启动当前机器的master
sbin/start-master.sh
# 启动当前机器的worker
sbin/start-worker.sh
# 停止全部
sbin/stop-all.sh
# 停止当前机器的master
sbin/stop-master.sh
# 停止当前机器的worker
sbin/stop-worker.sh
######################################################################################
连接集群
pyspark
bin/pyspark --master spark://node-211:7077
> sc.parallelize([1,2,3,4,5]).map(lambda x:x+1).collect()
# 通过--master选项来连接到 StandAlone集群
# 如果不写--master选项, 默认是local模式运行
spark-shell
bin/spark-shell --master spark://node-211:7077
# 同样适用--master来连接到集群使用
// 测试代码
sc.parallelize(Array(1,2,3,4,5)).map(x=> x + 1).collect()
spark-submit (PI)
bin/spark-submit --master spark://node-211:7077 /hadoop/software/spark/examples/src/main/python/pi.py 100
# 同样使用--master来指定将任务提交到集群运行
层次结构
- 程序,不同的spark程序
- Job,并行计算任务
- Stage,每个任务中的一步操作
- Task,每个Executor的工作内容,Spark中最小执行单位
总结
- StandAlone的原理?
- Master和Worker角色以独立进程的形式存在,并组成Spark运行时环境(集群)
- Spark角色在StandAlone中的分布?
- Master角色:Master进程
- Worker角色:Worker进程
- Driver角色和Executor角色:以线程运行在Worker中
- Standalone如何提交Spark应用?
- bin/spark-submit --master spark://server:7077
- 4040\8080\18080分别是什么?
- 4040是单个程序运行的时候绑定的端口可供查看本任务运行情况
- Job\State\Task的关系?
- 一个Spark程序会被分成多个子任务(Job)运行
- 每一个Job会分成多个State(阶段)来运行
- 每一个State内会分出来多个Task(线程)来执行具体任务
评论区