该博客记录《云计算及其应用》课程中的一个关于Spark的实验
使用的系统是Ubuntu 20.04.4 LTS 和OpenEuler 20.03LTS
两个系统都运行在Vmware workstation pro 16.2.1 上
一、Local 模式运行 Spark
1. 上传 spark和java压缩包
老师分享的压缩包的微信群中,下载后需要上传到虚拟机中,该模式只需要一个系统,这里我使用的是Ubuntu,上传有多种方式,
- vmware tools 直接拖拽
- 磁盘映射
- 打包成.iso 装载到dvd磁盘
这里我选择的是第三种,可以看一下我的这一篇博客 https://blog.csdn.net/qq_41680771/article/details/121739501?spm=1001.2014.3001.5501
2. 解压并配置环境变量
我使用的是 root 用户
我把spark压缩包放置在用户主目录下
(为了方便复制,我是putty和主机切换使用,所以截图背景不太统一)
解压
tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz
重命名
mv spark-3.0.0-bin-hadoop3.2 spark
jdk我没有使用老师的java8, 我自己下载了一个java11
官网下载页面 https://www.oracle.com/java/technologies/downloads/#java11
选择这个
下载完成后我放在了 /usr/lib/jvm/
目录下(需要自己新建)
mkdir /usr/lib/jvm/
解压 tar -zxvf jdk-11.0.14_linux-x64_bin.tar.gz
然后配置环境变量
修改 .bashrc 文件
vim ~/.bashrc
在末尾添加如下内容
export JAVA_HOME=/usr/lib/jvm/jdk-11.0.14
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
:wq
保存退出
重新生效该文件
sourcee ~/.bashrc
查看java版本信息
java -version
3. 启动spark shell
~/spark/bin/spark-shell
这时可以在浏览器中查看可视化界面
127.0.0.1:4040
scala wordcount
这时可以重新打开一个terminal,原来的被占用了
首先新建一个文件在data/
目录下,可以随意写一些内容
vim word.txt
在spark shell界面
sc.textFile("~/spark/data/word.txt").flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).collect
4. 使用 spark submit 提交
在新打开的terminal界面
~/spark/bin/spark-submit --class org.apache.spark.examples.SparkPi --master local[2] ./examples/jars/spark-examples_2.12-3.0.0.jar 10
- –class 表示要执行程序的主类, 此处可以更换为咱们自己写的应用程序
- –master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟 CPU 核数量
- spark-examples_2.12-3.0.0.jar 运行的应用类所在的 jar 包, 实际使用时,可以设定为咱们自己打的 jar 包
- 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
可视化界面
5. 退出spark shell
:q
退出
第一部分结束
二、Standalone 模式运行 Spark
1.首先查看两台机器的ip
ifconfig
(如果报错请先安装)
Master(ubuntu) | Slave(openEuler) |
---|---|
192.168.91.128 | 192.168.91.129 |
2. 在master中解压并且配置java环境变量
由于上一部分我已经配置完毕,这里就不需要重复操作了
3. 修改配置文件
- 进入解压缩后路径的 conf 目录,修改 slaves.template 文件名为 slaves
mv slaves.template slaves
- 修改 slaves 文件,添加 work 节点
192.168.91.128
192.168.91.129
注意!!! 这里我的两台机器都是root用户(用户名相同)
如果你的不相同
格式应该是
userName@IP
(建议使用相同用户名,防止踩坑)
- 修改 spark-env.sh.template 文件名为 spark-env.sh
mv spark-env.sh.template spark-env.sh
- 修改 spark-env.sh 文件,添加 JAVA_HOME 环境变量和集群对应的 master 节点
export JAVA_HOME=/usr/lib/jvm/jdk-11.0.14
export SPARK_MASTER_HOST=192.168.91.128
export SPARK_MASTER_PORT=7077
4. 将 spark 复制到 slave 上,同步配置环境变量
(1) ssh 连接
首先为了避免多次输入用户密码,使用ssh
先实现两个系统无密码访问
先下载安装
sudo apt-get install openssh-server
使用语法如下
生成密钥 ssh-keygen -t rsa
传递密钥 ssh-copy-id -i "userName@IP"
一通回车就好
尝试连接:
连接成功
退出连接
(2)scp 传输文件
使用说明
scp [参数] <源地址(用户名@IP地址或主机名)>:<文件路径> <目的地址(用户名 @IP 地址或主机名)>:<文件路径>
举例: scp /home/work/source.txt work@192.168.0.10:/home/work/ #把本地的source.txt文件拷贝到192.168.0.10机器上的/home/work目录下
scp work@192.168.0.10:/home/work/source.txt /home/work/ #把192.168.0.10机器上的source.txt文件拷贝到本地的/home/work目录下
scp work@192.168.0.10:/home/work/source.txt work@192.168.0.11:/home/work/ #把192.168.0.10机器上的source.txt文件拷贝到192.168.0.11机器的/home/work目录下
scp -r /home/work/sourcedir work@192.168.0.10:/home/work/ #拷贝文件夹,加-r参数
scp -r /home/work/sourcedir work@www.myhost.com:/home/work/ #使用主机名
scp -r -v /home/work/sourcedir work@www.myhost.com:/home/work/ #显示详情,加-v参数
复制spark
scp -r ~/spark/ root@192.168.91.129:~/spark/
复制 jdk
scp -r /usr/lib/jvm/ root@192.168.91.129:/usr/lib/jvm/
配置slave 中的环境变量
操作相同
5. 启动集群
(1) 执行脚本命令
~/spark/sbin/start-all.sh
(2) 使用 jps 命令查看进程
jps
(3) 查看 Master 资源监控 Web UI 界面
http://192.168.133.133:8080
(4) 使用 spark-submit 提交任务
在 ~/spark/
目录下
bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://192.168.91.128:7077 ./examples/jars/spark-examples_2.12-3.0.0.jar 10
命令参数说明
bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]
参数 | 解释 | 可选值举例 |
---|---|---|
–class | Spark 程序中包含主函数的类 | ------- |
–master | Spark 程序运行的模式(环境) | local[*]、 spark://master:7077 |
–executor-memory 1G | 指定每个 executor 可用内存为 1G | ------- |
–total-executor-cores 2 | 指定所有 executor 使用的 cpu 核数为 2 个 | ------- |
–executor-cores | 指定每个 executor 使用的 cpu 核数 | ------- |
application-jar | 打包好的应用 jar,包含依赖。这个 URL 在集群中全局可见。 比如 hdfs:// 共享存储系统,如果是 file:// path,那么所有的节点的 | |
path 都包含同样的 jar | ------- | |
application-arguments | 传给 main()方法的参数 | ------- |
运行截图:
实验结束
贴一个很好的教程