spark Standalone模式搭建
部署说明
standalone模式是Spark原生的简单集群管理器, 自带完整的服务,无需依赖任何其他资源管理系统, 可单独部署到一个集群中。该模式需要把节点部署在不同主机上,因而主机之间的通信是部署的重点和难点。
这里采用虚拟机的方式,创建3台虚拟主机来集群模式的搭建,主机命名与Hadoop集群模式相同。即主机1(master)、主机2(slave1)和主机3(slave2)。
由于采用虚拟机,所以首先在一台主机上安装必备软件jdk和spark配置;然后将该主机复制2份,修改主机名;最后完成3台主机之间的通信(免密登录),即可完成hadoop集群模式的搭建。
主机1上的配置
下载安装jdk(目前hadoop3只支持java8)
JDK安装包可以从oracle官网(https://www.oracle.com/java/technologies/downloads/ )下载,然后使用WinSCP上传到虚拟机的Ubuntu系统。
sudo tar -xzvf jdk-8u202-linux-x64.tar.gz -C /usr/local
配置jdk环境变量
打开~/.bashrc文件
$ sudo vim ~/.bashrc
然后在文件末尾加入以下代码,保存退出。
export JAVA_HOME=/usr/local/jdk1.8.0_202
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效
$ source ~/.bashrc
查看java版本
$ java -version
安装成功后,会出现如下信息:
下载安装spark
Spark安装包可以从官网(https://spark.apache.org/downloads.html )下载,然后使用WinSCP上传到虚拟机的Ubuntu系统。
注意需要在spark安装目录下创建logs目录(spark运行时存放临时文件),然后再整体修改spark安装目录可操作权限(否则普通用户和管理员用户无法在该目录下创建目录和输出文件)。
$ sudo tar -xzvf spark-3.3.1-bin-hadoop3-scala2.13.tgz -C /usr/local
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13
$ sudo mkdir logs
$ cd /usr/local/
$ sudo chmod -R 777 spark-3.3.1-bin-hadoop3-scala2.13
配置spark环境变量(可以在bashrc或profile文件中添加)
打开~/.bashrc文件
$ sudo vim ~/.bashrc
然后在文件末尾加入以下代码,保存退出。
export SPARK_HOME=/usr/local/spark-3.3.1-bin-hadoop3-scala2.13
export PATH=${SPARK_HOME}/sbin:${SPARK_HOME}/bin:$PATH
使环境变量生效
$ source ~/.bashrc
运行Spark自带计算PI的例子
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13
$ run-example SparkPi 10
成功运行后,将给出pi的估计值,如下图所示。表明Spark安装成功!
修改配置文件
spark standalone的配置相对简单。只需要修改workers和spark-env.sh两个配置文件,其他保持默认即可。配置文件的位于hadoop安装目录下的conf/中。
workers
$/usr/local/spark-3.3.1-bin-hadoop3-scala2.13/conf
$ mv workers.template workers
$sudo vim workers
在文件末尾加入三台主机名,然后保存退出。如下所示:
master
slave1
slave2
spark-env.sh
$ mv spark-env.sh.template spark-env.sh
$ sudo vim spark-env.sh
在文件末尾加入如下内容,配置SPARK_MASTER_HOST的主机名,以及jdk的路径:
export SPARK_MASTER_HOST=master
export JAVA_HOME=/usr/local/jdk1.8.0_202
主机2和主机3的复制
主机1配置好后,需要将其关机。
找到主操作系统VMware虚拟机的存放目录,直接复制粘贴两份。为了区分各主机的名字,分别将文件夹命名为Ubuntu-master、Ubuntu-slave1、Ubuntu-slave2(主机1如果之前没有命名为Ubuntu-master,也可以在这步命名),如下图所示:
打开master主机
进入VMware主界面,选择打开虚拟机;然后选择Ubuntu-master所在目录。
进入Ubuntu-master目录,双击Ubuntu.vmx加载虚拟机,然后按开机按钮开机。
由于之前对主机1进行了重命名,所以会出现如下提示框。注意这里选择我已复制该虚拟机(ip地址保留原来的)。
进入master主机后,采用ifconfig命令查看ip地址并记下。
打开slave1和slave2主机
按照同样的方式,在VMware中分别选择Ubuntu-slave1和Ubuntu-slave2目录下的Ubuntu.vmx,打开slave1和slave2主机。
在开机时,会出现如下提示框,注意必须选择我已复制该虚拟机(slave1和slave2会重新分配ip地址,否则三个主机ip地址一致,无法同时联网)。
同样,进入slave1和slave2主机后,分别采用ifconfig查看ip地址并记下。
主机1、2、3间免密通信(一)
master主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为master
,然后保存退出。
修改成功后,shell中以“用户名@主机名:”的形式显示,如下图所示(需要重启)。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
slave1主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为slave1
,然后保存退出。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
slave2主机的配置
修改主机名
$ sudo vim /etc/hostname
将文件的第一行改为slave2
,然后保存退出。
配置主机之间的IP映射
$ sudo vim /etc/hosts
进入hosts文件中,添加如下三下IP映射
安装ssh-server
$ sudo apt install openssh-server
配置ssh无密码登陆
生成公钥与私钥(注意三次提示都直接按回车)。
$ ssh-keygen -t rsa
切换到".ssh"隐藏目录
cd ~/.ssh
将密钥加入到授权中
$ cat ./id_rsa.pub >> ./authorized_keys
主机1、2、3间免密通信(二)
master主机的配置
将master主机的公钥发送给slave1和slave2主机
$ scp id_rsa.pub chuishuju@slave1:~/.ssh/master_rsa.pub
$ scp id_rsa.pub chuishuju@slave2:~/.ssh/master_rsa.pub
slave1主机的配置
将slave1主机的公钥发送给master和slave2主机
$ scp id_rsa.pub chuishuju@master:~/.ssh/slave1_rsa.pub
$ scp id_rsa.pub chuishuju@slave2:~/.ssh/slave1_rsa.pub
slave2主机的配置
将slave2主机的公钥发送给master和slave1主机
$ scp id_rsa.pub chuishuju@master:~/.ssh/slave2_rsa.pub
$ scp id_rsa.pub chuishuju@slave1:~/.ssh/slave2_rsa.pub
主机1、2、3间免密通信(三)
master主机的配置
将slave1和slave2的密钥添加到授权文件
$ cat ./slave1_rsa.pub >> ./authorized_keys
$ cat ./slave2_rsa.pub >> ./authorized_keys
slave1主机的配置
将master和slave2的密钥添加到授权文件
$ cat ./master_rsa.pub >> ./authorized_keys
$ cat ./slave2_rsa.pub >> ./authorized_keys
slave2主机的配置
将master和slave1的密钥添加到授权文件
$ cat ./master_rsa.pub >> ./authorized_keys
$ cat ./slave1_rsa.pub >> ./authorized_keys
主机1、2、3间免密通信(四)
前面步骤已经完成了主机1、2、3间免密通信的配置。可以试下是否成功
在master主机中执行如下命名
$ ssh slave1
如下shell中变为“用户名@slave1”,就表明免密登录成功。输入exit退出远程登录,返回master主机。
$ exit
按照相同的步骤,可以试下3台主机之间的相互免密登录是否成功。记得exit退出远程登录。
启动与结束spark集群
启动集群
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/sbin
$ start-all.sh
启动成功后,在master主机输入jps,会显示如下进程
Jps
Worker
Master
slave1和slave2主机输入jps,会显示如下进程
Jps
Worker
在主系统的浏览器输入:http://192.168.72.142:8080 ,将登录管理页面(需要替换成自己的master主机ip,8080是集群管理页面的端口)。
结束集群
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/sbin
$ stop-all.sh
spark standalone的应用
spark-shell方式
进入spark安装目录
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13
创建wcinput目录
$ sudo mkdir wcinput
将“song.txt”文件通过WinSCP上传到虚拟机的Ubuntu系统,并移动到spark安装目录的wcinpu目录下。
$ sudo cp song.txt /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/wcinput/
song.txt的内容如下:
再次进入spark安装目录
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13
启动spark shell,注意spark standalone需要先启动。
$ spark-shell --master spark://master:7077
启动spark shell后,其也有对应的后台管理页面(和集群的后台管理页面不同):http://192.168.72.142:4040 ,注意其端口是4040.
在spark-shell中输入单词统计的代码(结果展示在控制台),注意再次执行时需要把spark安装目录下的work目录删除:
scala> sc.textFile("wcinput").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
client 模式
client 模式适用于测试调试程序,不适用于生产环境。结果直接在控制台输出。
运行自带的计算PI的例子,其中参数“--deploy-mode client”可不加
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/bin
$ spark-submit --master spark://master:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/examples/jars/spark-examples_2.13-3.3.1.jar 100
计算结果如下所示:
后台管理页面也会显示运行情况:
cluster 模式
cluster 模式适用于生产环境,结果需要在管理页面的driver中查看。
$ cd /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/bin
$ spark-submit --master spark://master:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/local/spark-3.3.1-bin-hadoop3-scala2.13/examples/jars/spark-examples_2.13-3.3.1.jar 100
运行结果需要从后台管理页面的driver中查看: