Spark部署

Local 部署安装

下载地址: https://dlcdn.apache.org/spark/spark-3.1.3/spark-3.1.3-bin-hadoop3.2.tgz

https://www.anaconda.com/products/distribution#Downloads

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
sh Anaconda3-2022.05-Linux-x86_64.sh
source ~/.bashrc # 使环境生效

conda list # 正常

python -V #3.9
## 修改镜像源
vi ~/.condarc ## 网上自己找
echo 'channels:
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/menpo/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/simpleitk/linux-64
- defaults
show_channel_urls: true' > ~/.condarc
conda config --show channels
conda clean -i ## 保证生效

# 配置虚拟环境
conda create -n pyspark python=3.8
environment location: /opt/anaconda3/envs/pyspark

#To activate this environment, use
$ conda activate pyspark

# To deactivate an active environment, use
$ conda deactivate

################# 安装spark
tar -zxvf spark-3.1.3-bin-hadoop3.2.tgz

ln -s /opt/spark-xxx /opt/spark # 可以起别名,我这里直接用mv 替换文件夹名

# 配置spark环境变量
SPARK_HOME: Spark安装目录
PYSPARK_PYTHON: 表示python想运行Python程序,去哪里找python执行器
JAVA_HOME:告知Java在哪里
HADOOP_CONF_DIR: 告知Spark Hadoop的配置文件位置
HADOOP_HOME: 告知spark Hadoop安装在哪里

echo 'export SPARK_HOME=/opt/spark
export PYSPARK_PYTHON=/opt/anaconda3/envs/pyspark/bin/python3.8
export JAVA_HOME=/opt/java/jdk1.8.0_271
export HADOOP_CONF_DIR=/opt/hadoop/hadoop-3.2.3/etc/hadoop
export HADOOP_HOME=/opt/hadoop/hadoop-3.2.3
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH ' >> /etc/profile.d/spark-3.1.3.sh
source /etc/profile

echo 'export PYSPARK_PYTHON=/opt/anaconda3/envs/pyspark/bin/python3.8
export JAVA_HOME=/opt/java/jdk1.8.0_271'>> ~/.bashrc
source ~/.bashrc

测试

1
2
3
4
5
6
7
8
9
$ sudo su
(base) [root@master ec2-user]# conda activate pyspark
(pyspark) [root@master ec2-user]#

cd /opt/spark/bin/
### pyspark 运行python脚本
./pyspark
print("i am Spark")
sc.parallelize([1,2,3,4,5]).map(lambda x: x*10).collect()

http://ip:port 访问相应的端口ip可以看到spark job如下:
sparkjob

1
2
3
4
### spark-shell 运行scala
./spark-shell
sc.parallelize(Array(1,2,3,4,5)).map(x=>x*10).collect()

spark-shell 运行scala交互如下:
sparkscalajob

1
2
### submit-submit 直接运行 
./spark-submit --master local[*] /opt/spark/examples/src/main/python/pi.py 10 ## 10次迭代求解圆周率

spark-submit_pi

Standalone 架构

Standalone 模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群环境,Standalone模式是真实的在多个机器之间搭建spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。

Standalone 是完整的spark运行环境,其中:

  • Master角色以Master进程存在,worker角色以worker进程存在
  • Driver角色在运行时存在于Master进程内,Executor运行于Worker进程内

Standalone集群在进程上主要有3类进程:

  • 主节点Master进程:
    • master角色,管理整个集群资源,并托管运行各个任务的Driver
  • 从节点Workers:
    • worker角色,管理每个机器的资源,分配对应的资源来运行Excutor(Task)
  • 历史服务器HistoryServer(可选):
    • spark Application运行完成以后,保存时间日志数据至HDFS,启动HistoryServer可以查看应用运行相关信息

Standalone 集群环境安装

master 运行Spark的Master进程和1个work进程
worker1 运行Spark的1个work进程
worker2 运行Spark的1个work进程

每台机器部署Anaconda(python) 环境【略,同上】

每台机器部署spark 环境【略,同上】

spark集群文件配置

1
2
3
4
5
6
7
8
cd /opt/spark/conf
cp workers.template workers
cp spark-env.sh.template spark-env.sh
cp spark-defaults.conf.template spark-defaults.conf
cp log4j.properties.template log4j.properties
# 将spark程序运行的历史日志 存到hdfs的/sparklog文件夹中
hadoop fs -mkdir /sparklog
mkdir -p /data/spark/log/

1)修改 workers

1
2
3
echo 'master
worker1
worker2' >> workers

2) 修改 spark-env.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
echo '
## java安装目录
JAVA_HOME=/opt/java/jdk1.8.0_271
## HADOOP软件配置文件目录,读取HDFS上文件和运行YARN集群
HADOOP_CONF_DIR=/opt/hadoop/hadoop-3.2.3/etc/hadoop
YARN_CONF_DIR=/opt/hadoop/hadoop-3.2.3/etc/hadoop
## 指定spark master运行在哪台机器
export SPARK_MASTER_HOST=master
## 指定spark master的通讯端口
export SPARK_MASTER_PORT=9777
## 告知spark master的webui 端口
SPARK_MASTER_WEBUI_PORT=9780
## work cpu可用核数
SPARK_WORKER_CORES=1
## work 可用内存
SPARK_WORKER_MEMORY=1g
## work 的工作通讯地址
SPARK_WORKER_PORT=9778
## work 的webui地址
SPARK_WORKER_WEBUI_PORT=9781
## 设置历史服务器
# 配置的意思是 将spark程序运行的历史日志 存到hdfs的/sparklog文件夹中
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://master:9710/sparklog -Dspark.history.fs.cleaner.enabled=true"
' >> spark-env.sh

hdfs://master:9710 对应 fs.defaultFS;同时需要在hadoop下创建/sparklog文件夹 “hadoop fs -mkdir /sparklog”

3) 修改 spark-defaults.conf

1
2
3
4
5
6
7
8
9
echo '
# 开启spark的日期记录功能
spark.eventLog.enabled true
# 设置spark日志记录路径
spark.eventLog.dir hdfs://master:9710/sparklog/
# spark.eventLog.dir file:/data/spark/log/
# 设置spark日志是否启动压缩
spark.eventLog.compress false
' >> spark-defaults.conf

4) 修改 log4j.properties

1
2
3
4
log4j.rootCategory=WARN, console # 修改

cat log4j.properties | grep log4j.rootCategory=
sed -i 's#log4j.rootCategory=INFO, console#log4j.rootCategory=WARN, console#' log4j.properties

复制文件到其他节点

1
2
3
4
5
6
7
8
9
scp workers 192.168.1.7:/opt/spark/conf
scp spark-env.sh 192.168.1.7:/opt/spark/conf
scp spark-defaults.conf 192.168.1.7:/opt/spark/conf
scp log4j.properties 192.168.1.7:/opt/spark/conf

scp workers 192.168.1.9:/opt/spark/conf
scp spark-env.sh 192.168.1.9:/opt/spark/conf
scp spark-defaults.conf 192.168.1.9:/opt/spark/conf
scp log4j.properties 192.168.1.9:/opt/spark/conf

启动spark集群

一定要用”./path/start-all.sh “或”./start-all.sh”形式, 而不是绝对路径或直接文件执行

1
2
3
4
5
cd /opt/hadoop/hadoop-3.2.3/etc/hadoop/ && stop-all.sh
cd /data/hadoop/pid/

./sbin/start-history-server.sh
./sbin/start-all.sh

检查spark集群

http://ip:9780

sparkclusterdepolysuccessful

集群连接测试

1
2
3
4
5
6
7
8
cd /opt/spark
## pyspark
./bin/pyspark --master spark://master:9777
sc.parallelize([1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]).map(lambda x: x*10).collect()

sc.textFile("hdfs://master:9710/input/word.txt").flatMap(lambda line: line.split(" ")).map(lambda x:(x,1)).reduceByKey(lambda a,b: a+b).collect()
## spark-submit
./bin/spark-submit --master spark://master:9777 /opt/spark/examples/src/main/python/pi.py 100

总结

  1. StandAlone的原理?

Master和Worker角色以独立进程的形式存在,并组成Spark运行时环境(集群)

  1. Spark角色在StandAlone中的分布?

Master角色: Master进程, worker角色: worker进程, Driver角色: 以线程运行在Master中,Excutor角色:以线程运行在worker中

  1. Standalone如何提交Spark应用?

./bin/spark-submit –master spark://server:9777

  1. Job\Stage\Task的关系?

一个Spark运行程序会被分成多个子任务(Job)运行,每一个Job会分成多个阶段(Stage)来运行,每个Stage内会分出来多个线程(Task)来执行具体任务。