0


【李老师云计算】实验二:Spark集群的搭建与求解最大值

索引

前言

直接进入正题吧。
在验收之后又做了一些修改,希望能有所帮助……

带★的是可能遇到的问题可以看一下,以防后续操作出问题。

内容可能来自博主自己手搓、吸取同学的经验、网络上内容的整合等等,仅供参考,更多内容可以查看大三下速通指南专栏。

1. Spark部署

有了前几次的经验这次就简单一点了。

1.1 下载Spark

直接在官网下载的spark-2.4.0,注意是下载这个153M的压缩包。

image-20230423151815371

1.2 解压Spark

首先把压缩包放到

/usr/local

目录下

然后依次执行下面的指令(在哪里打开终端都行):

  1. cd /usr/local
  2. tar -zxvf spark-2.4.0-bin-without-hadoop.tgz
  3. mv spark-2.4.0-bin-without-hadoop spark
  4. chown -R root:root spark

此时你的

/usr/local

目录下就有spark目录了。

image-20230423152227131

1.3 修改环境变量

首先

vi /etc/profile

,在文件的末尾加入以下内容:

export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
export JAVA_LIBRARY_PATH=/user/hadoop/hadoop-3.3.1/lib/native

**第三行是

Hadoop路径/lib/native

,根据自己的调整!**

:wq

保存后关闭,之后使用指令

source /etc/profile

刷新一下。

1.4 修改主机Spark配置文件

配置文件的路径是

/usr/local/spark/conf

1.4.1 slaves.template文件配置

cd /usr/local/spark/conf

进入配置文件目录

cp slaves.template slaves

将文件重命名为

slaves
vi slaves

进入修改文件,后面添加上两个从机的主机名(根据自己的改!)

vmware_TdLdsEJgzH.png

1.4.2 spark-env.sh.template文件配置

这里一定要仔细修改!大部分问题都出自这里。

cp spark-env.sh.template spark-env.sh

重命名为

spark-env.sh
vi spark-env.sh

进入修改文件,在文件末尾添加以下内容:

export SPARK_DIST_CLASSPATH=$(/user/hadoop/hadoop-3.3.1/bin/hadoop classpath)
export HADOOP_CONF_DIR=/user/hadoop/hadoop-3.3.1/etc/hadoop
export SPARK_MASTER_IP= master60
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b08-1.el7_9.x86_64
export HADOOP_HOME=/user/hadoop/hadoop-3.3.1
export SPARK_WORKER_MEMORY=1024m
export SPARK_WORKER_CORES=1

其中第1、2、5行是修改Hadoop的路径;第3行修改主机的主机名;第4行是JDK的路径;第6、7行不需要改。

**如果忘了在哪里可以看一下自己的

~/.bashrc

或者

/etc/profile

文件之前配置过的。**

1.5 分享主机Spark到从机

在主机依次进行以下操作:

  1. cd /usr/local
  2. tar -zcf spark.master.tar.gz spark
  3. scp spark.master.tar.gz slave1-60:/usr/local/spark.master.tar.gz(修改为从机1的主机名)
  4. scp spark.master.tar.gz slave2-60:/usr/local/spark.master.tar.gz(修改为从机2的主机名)

在两个从机依次执行以下操作(两台从机都执行依次!):

  1. cd /usr/local
  2. tar -zxf spark.master.tar.gz
  3. chown -R root /usr/local/spark

1.6 启动Spark集群(★重启后的操作)

在主机使用下面两个指令即可:

  1. /user/hadoop/hadoop-3.3.1/sbin/start-all.sh(启动Hadoop)
  2. /usr/local/spark/sbin/start-all.sh(启动Spark)

注意路径!注意路径!注意路径!Hadoop路径可能与我的不同。

这里就会出现问题,Spark和Hadoop都有

start-all.sh

的指令并且都被写到了环境变量中,你直接使用

start-all.sh

大概率是会用Spark的指令。为了避免这种不必要的误会,之后再重启**请使用完整的路径来

start-all.sh

。**

并且这次实验与上一次没关系,不需要打开Zookeeper以及HBase。

1.7 通过jps查看是否启动成功

在主机上

jps

可以看到至少以下两个进程:

image-20230423154759882

在从机上

jps

可以看到至少以下两个进程:

image-20230423154747912

1.8 通过网页查看是否启动成功

浏览器打开

主机的主机名或IP:8080

image-20230423155109135

打不开就把三台虚拟机重启之后按照1.6操作一遍。

再查看一下

spark-shell

,退出的指令是

:quit

:

的!!!,如果不正常退出,之后再启动可能也打不开4040端口。

image-20230423160627595

再看一下

4040

端口,注意需要运行

spark-shell

才能进入,上图也可以看的出来再使用了

spark-shell

之后才开启了这个端口。

连接失败是因为没开

spark-shell

一直加载打不开,可能是因为强制关闭了

spark-shell

,虚拟机重开再打开服务可以解决。

image-20230423155425112

2. Scala Maven项目访问Spark(local模式)100个随机数求最大值

19级是单词计数,感兴趣可以看一下涛哥的博客。

2.1 下载Scala IDE

直接下载,点了之后就下载了。

2.2 解压Scala IDE

拖到

usr/local

image-20230423162129252

终端通过指令解压一下:

tar -zxvf scala-SDK-4.7.0-vfinal-2.12-linux.gtk.x86_64.tar.gz 

解压出来的是一个

eclipse

目录,

之后的编程是通过这个目录中的eclipse!不要用桌面上的!

image-20230423162820439
如果打不开可以参考2.10的解决方法

2.3 下载Scala(主机+从机)

注意确保Spark版本是2.4.0(前面下载的就是)

直接依次执行以下操作:

  1. cd /usr/local
  2. wget https://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz
  3. tar -zxvf scala-2.11.8.tgz
  4. mv scala-2.11.8 scala

image-20230423163340756

2.4 添加环境变量(主机+从机)

vi /etc/profile

进入文件在末尾添加以下内容:

export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin

然后

source /etc/profile

刷新一下。

在终端输入

scala

看一下是否配置成功,

:quit

退出。

image.png

注意!Scala主机从机都需要下载,也就是2.3、2.4三台虚拟机都要操作。

2.5 创建Scala项目

打开

Scala IDE

image.png

创建一个Scala项目,

image.png

随便起了个名,无所谓的,

image.png

右键项目 ->

Configure

->

Convert to Maven Project

image-20230423165244523

没改直接下一步了,后面还可以在

pom.xml

里改,

image-20230423165430001

2.6 配置Scala项目

如果找不到类什么的错误可以重新创建一个项目,要先转换成Maven项目然后从2.6.2继续即可。2.6.1配置之后不会自动变化了。

2.6.1 设置Maven

两个地方要改。

点击

Window

->

Preferences

->

Maven

->

Installations

image.png

添加了以后记得选上,

image.png

点击

Window

->

Preferences

->

Maven

->

User Settings

vmware_9SI6iC7MSj.png

2.6.2 pom.xml添加依赖

打开

pom.xml

,添加以下内容:

<dependencies><!-- https://mvnrepository.com/artifact/org.apache.spark/spark-core --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId><version>2.4.0</version></dependency></dependencies>

image-20230423171830306

2.6.3 设置Scala Complier

右键项目,打开

Properties

image-20230423172111942

按照下图选择

Scala Compiler

然后确认,

image-20230423172212617

2.6.4 添加Spark的jar包

右键项目 ->

Build Path

->

Configure Build Path

上次做过这个,直接添加就行了,

vmware_6rVECoIL55.png

添加的路径是

/usr/local/spark/jars

,直接

ctrl+A

全选添加就可以。

vmware_dLUUvt4C1r.png

2.7 创建代码(Object)

右键src ->

new

->

Scala Object

,名字随便起。两个代码一个Random一个Max。
image-20230423165807424

2.7.1 Random

把主机名全改了!
Random代码如下,这个是生成50个1到10000之间随机数,并保存到HDFS下面的

/tmp/maxnumber/word_060.txt

(根据自己学号改)

importorg.apache.spark.{SparkConf,SparkContext}

object Random{
  def main(args:Array[String]){
    val conf =newSparkConf().setAppName("Random").setMaster("local")
    val sc =newSparkContext(conf)

    val randoms = sc.parallelize(Seq.fill(50)(scala.util.Random.nextInt(10000)+1))// 输出到控制台
    randoms.collect().foreach(println)// 将随机数和最大值保存到 HDFS 目录
    val outputPath ="hdfs://192.168.64.60:9000/tmp/maxnumber"
    randoms.saveAsTextFile(outputPath +"/word_060.txt")
    sc.stop()}}

2.7.2 Max

Max代码如下,这个是读取

word_060.txt

文件然后找最大值输出到

/tmp/maxnumber/max

(无所谓自己改)

importorg.apache.spark.{SparkConf,SparkContext}

object Max{
  def main(args:Array[String]){
    val filePath ="hdfs://192.168.64.60:9000/tmp/maxnumber/word_060.txt"
    val conf =newSparkConf().setAppName("Max").setMaster("local")
    val sc =newSparkContext(conf)
    val randoms = sc.textFile(filePath) 
    
    val nums = randoms.map(_.toInt).cache()
    
    val max = nums.max()println(s"The maximum number is: $max")

    val outputPath ="hdfs://192.168.64.60:9000/tmp/maxnumber/maxnumber_060"
    sc.parallelize(Seq(max)).saveAsTextFile(outputPath)

    sc.stop()}}

2.8 运行程序

……卡的要命,我又多分配了点运存之后才好一点。

Run As

->

Scala Application


先运行Random生成随机数输出到控制台,并且保存。
image.png
运行成功之后,再运行第二个Max程序。

打开

9870

端口的网页,打开HDFS的目录

image.png

进去以后打开

tmp

文件,

image.png

进入到

tmp/maxnumber

看一下,
在这里插入图片描述

具体怎么看用max演示一下,
在这里插入图片描述

OK!到此结束。

2.9 ★解决内存问题、其他问题

如果运行报错内存什么什么玩意,

Run Configurations

Arguments

VM arguments

里添加一句:

-Xmx512m

image.png

或者是给虚拟机多分配点内存……大概。

其他问题一般重启虚拟机然后重开Hadoop以及Spark就行了。

2.10 ★解决打不开Scala IDE(Eclipse)

如果出现以下错误,
请添加图片描述
可以尝试更换一下工作目录,修改为其他的如

/root/work

之类的随便改。

在这里插入图片描述

2.11 ★解决找不到jar包,一直爆红

大概率是maven仓库的问题把仓库删了就行了。
在终端输入下面指令删除仓库

rm -rf ~/.m2/repository

这个

.m2

仓库是隐藏的,打开显示隐藏文件也能看到。
删了之后重新创建项目然后操作会自动加载新的仓库大概率问题就解决了。

3. 对实验的一些解释

仅供参考仅供参考仅供参考,心酸。

3.1 Spark主从架构设计

主节点:主机(ip或主机名)
从节点:从机(ip或主机名)

3.2 对代码的解释(创建RDD,转换,持久化)

以Max的代码为例:

  1. 读入外部文件创建RDD
    val conf =newSparkConf().setAppName("Max").setMaster("local")
    val sc =newSparkContext(conf)// 创建RDD
    val randoms = sc.textFile(filePath)// 读入外部文件
  1. 转换操作
val nums = randoms.map(_.toInt).cache()// 将randoms RDD内的数据转换为整数类型
  1. 持久化与行动操作
    val max = nums.max()// 行动求最大值
    val outputPath ="hdfs://192.168.64.60:9000/tmp/maxnumber/maxnumber_060"
    sc.parallelize(Seq(max)).saveAsTextFile(outputPath)// 持久化保存到HDFS目录中

3.3 构建DAG图

报告中写的是AG,实际上是DAG,但是!似乎真正要的不是DAG而是课本上的某一种图,大概在宽窄依赖上面类似于这样的图。
请添加图片描述

3.4 宽窄依赖

窄依赖
textFile方法创建的输入数据的RDD与map方法创建的转换后的RDD之间存在窄依赖关系,因为每个输入数据的分区只会被一个转换后的分区所依赖。map方法创建的转换后的RDD与cache方法创建的持久化的RDD之间也存在窄依赖关系,因为每个转换后的分区只会被一个持久化的分区所依赖。cache方法创建的持久化的RDD与max方法创建的操作后的RDD之间也存在窄依赖关系,因为每个持久化的分区只会被一个操作后的分区所依赖。

3.5 划分阶段

读入外部文件创建RDD (textFile)-转换操作 (map)-持久化 (cache)-行动操作 (max)-转换操作 (parallelize)-持久化 (saveAsTextFile)-释放资源(stop)

标签: spark scala 云计算

本文转载自: https://blog.csdn.net/qq_34181160/article/details/130329209
版权归原作者 WtcSky 所有, 如有侵权,请联系我们删除。

“【李老师云计算】实验二:Spark集群的搭建与求解最大值”的评论:

还没有评论