实验0: Spark Local模式安装
实验说明:
1、 本次实验是第一次上机,属于验证性实验。实验报告上交截止日期为2023年2月26日上午12点之前。
2、 实验报告命名为:信2005-1班学号姓名实验零.doc。
实验环境:
操作系统: Ubuntu16.04;
Spark 版本: 2.1.0;
Hadoop 版本: 2.7.1。
实验目的:
1、掌握在 Linux 虚拟机中安装 Hadoop 和 Spark 的方法;
2、熟悉 HDFS 的基本使用方法;
3、掌握使用 Spark 访问本地文件和 HDFS 文件的方法。
4、了解Spark的六种运行模式;
5、准确理解Spark Local模式运行原理;
6、熟练掌握Spark Local模式的安装流程。
实验原理:
目前Apache Spark主要支持三种分布式部署方式:分别是standalone、Spark on mesos和spark on YARN,其中,第一种类似于MapReduce 1.0所采用的模式,内部实现了容错性和资源管理,后两种则是未来发展的趋势,部分容错性和资源管理交由统一的资源管理系统完成:让Spark运行在一个通用的资源管理系统之上,这样可以与其他计算框架,比如MapReduce共用一个集群资源,最大的好处是降低运维成本和提高资源利用率(资源按需分配)。
1.Spark运行模式概述
在实际应用中,Spark应用程序的运行模式取决于传递给SparkContext的MASTER环境变量的值,个别模式还需要依赖辅助的程序接口来配合使用,目前所支持的MASTER环境变量由特定的字符串或URL所组成,如下所示。
(1)Local[N]:本地模式,使用多个线程。
(2)Local cluster[worker, core, Memory]:伪分布式模式,可以配置所需要启动的虚拟工作节点的数量,以及每个工作节点所管理的CPU数量和内存尺寸。
(3)Spark://hostname:port:Standalone模式,需要部署Spark到相关节点,URL为Spark Master主机地址和端口。
(4)Mesos://hostname:port:Mesos模式,需要部署Spark和Mesos到相关节点,URL为Mesos主机地址和端口。
(5)YARN standalone/Yarn cluster:YARN模式一,主程序逻辑和任务都运行在YARN集群中。
(6)YARN client:YARN模式二,主程序逻辑运行在本地,具体任务运行在YARN集群中。
此外还有一些用于调试的URL,因为和应用无关,我们在这里就不列举了。
2.Local模式部署及程序运行
Local模式,顾名思义就是在本地运行,如果不加任何配置,Spark默认设置为Local模式。以SparkPi为例,Local模式下的应用程序的启动命令如下:
./bin/run-example org.apache.spark.examples.SparkPi local
在SparkPi代码的具体实现中,是根据用户传入的参数来选择运行模式的,如果需要自己在代码中指定运行模式,可以通过在代码中配置Master为Local来实现,如以下程序所示。
import org.apache.spark.{SparkConf, SparkContext}
val conf = new SparkConf()
.setMaster("local")
.setAppName("My application")
.set("spark.executor.memory", "1g")
val sc = new SparkContext(conf)
当然,为了使应用程序能够更灵活地在各种部署环境下使用,不建议把与运行环境相关的设置直接在代码中写死。
3.Local本地模式内部实现原理
Local本地模式使用LocalBackend配合TaskSchedulerImpl,内部逻辑结构如下图所示:
LocalBackend响应Scheduler的receiveOffers请求,根据可用的CPU核的设定值[N]直接生成CPU资源返回给Scheduler,并通过Executor类在线程池中依次启动和运行Scheduler返回的任务列表,其核心事件循环由内部类LocalActor以Akka Actor的消息处理形式来实现。
实验内容与要求:
1.安装 Hadoop 和 Spark
进入 Linux 系统,参照本教程官网“实验指南” 栏目的“Hadoop 的安装和使用” ,完成 Hadoop 伪分布式模式的安装。完成 Hadoop 的安装以后,再安装 Spark(Local 模式)。
2. HDFS 常用操作
使用 hadoop 用户名登录进入 Linux 系统,启动 Hadoop,参照相关 Hadoop 书籍或网络资料,或者也可以参考本教程官网的“实验指南” 栏目的“HDFS 操作常用 Shell 命令” ,使用 Hadoop 提供的 Shell 命令完成如下操作:
(1) 启动 Hadoop,在 HDFS 中创建用户目录“/user/hadoop” ;
(2) 在 Linux 系统的本地文件系统的“/home/hadoop” 目录下新建一个文本文件
test.txt,并在该文件中随便输入一些内容,然后上传到 HDFS 的“/user/hadoop”目录下;
(3) 把 HDFS 中“/user/hadoop” 目录下的 test.txt 文件,下载到 Linux 系统的本地文件系统中的“/home/hadoop/下载” 目录下;
(4) 将 HDFS中“/user/hadoop” 目录下的 test.txt文件的内容输出到终端中进行显示;
(5) 在 HDFS 中的“/user/hadoop” 目录下,创建子目录 input,把 HDFS 中“/user/hadoop” 目录下的 test.txt 文件,复制到“/user/hadoop/input” 目录下;
(6) 删除HDFS中“/user/hadoop” 目录下的 test.txt文件,删除HDFS中“/user/hadoop”目录下的 input 子目录及其子目录下的所有内容。
3. Spark 读取文件系统的数据
(1)在 spark-shell 中读取 Linux 系统本地文件“/home/hadoop/test.txt” ,然后统计出文件的行数;
(2)在 spark-shell 中读取 HDFS 系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;
(3)编写独立应用程序,读取 HDFS 系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过 sbt 工具将整个应用程序编译打包成 JAR 包,并将生成的 JAR 包通过 spark-submit 提交到 Spark 中运行命令。
4.在已经安装有jdk1.7的Linux系统的环境下,进行Spark local模式安装。
1.Spark的运行依赖jdk以及scala环境。在此已默认安装jdk1.7。
2.首先在linux上创建目录/data/spark1,用于存储所需文件。
- mkdir -p /data/spark1
切换目录到/data/spark1目录,使用wget命令,下载所需的Spark安装包spark-1.6.0-bin-hadoop2.6.tgz以及Scala安装包scala2.10.4.tgz。
- cd /data/spark1/
- wget http://192.168.1.100:60000/allfiles/spark1/scala-2.10.4.tgz
- wget http://192.168.1.100:60000/allfiles/spark1/spark-1.6.0-bin-hadoop2.6.tgz
此处建议使用scala-2.10.4版本。官网中指出,若使用scala2.11.x版本,需要重新编译Spark,并且编译时,需要指定Scala版本的类型。
关于Spark版本,没有严格要求。所以我们使用Spark1.6版本。
3.安装scala。切换目录到/data/spark1目录下,将scala-2.10.4.tgz解压缩到/apps目录下,并将解压后的目录名改为/apps/scala。
- cd /data/spark1/
- tar -xzvf /data/spark1/scala-2.10.4.tgz -C /apps/
- cd /apps
- mv /apps/scala-2.10.4/ /apps/scala
使用vim打开用户环境变量~/.bashrc。
- vim ~/.bashrc
将scala的bin目录,追加到用户环境变量中,然后保存退出。
- #scala
- export SCALA_HOME=/apps/scala
- export PATH=$SCALA_HOME/bin:$PATH
执行source命令,使系统环境变量生效。
- source ~/.bashrc
4,切换目录到/data/spark1目录下,将spark的安装包spark-1.6.0-bin-hadoop2.6.tgz,解压缩到/apps目录下,并将解压后的目录名重命名为spark。
- cd /data/spark1
- tar -xzvf /data/spark1/spark-1.6.0-bin-hadoop2.6.tgz -C /apps/
- cd /apps/
- mv /apps/spark-1.6.0-bin-hadoop2.6/ /apps/spark
使用vim打开用户环境变量~/.bashrc。
- vim ~/.bashrc
将Spark的配置信息追加到用户环境变量中,然后保存退出。
- #spark
- export SPARK_HOME=/apps/spark
- export PATH=$SPARK_HOME/bin:$PATH
执行source命令,使用户环境变量生效。
- source ~/.bashrc
5,下面不需要对spark进行任何配置,就可以启动spark-shell进行任务处理了。
切换目录到/apps/spark/bin目录下,启动spark shell,验证安装完的spark是否可用。
执行
- cd /apps/spark/bin/
- spark-shell
或执行
- spark-shell local
可以启动本地模式。
6,执行测试。在Spark Shell中,使用Scala加载Spark安装目录下,文件README.md,并转变为rdd。
- val rdd = sc.textFile("/apps/spark/README.md")
对rdd进行算子操作,统计文件的行数。
- rdd.count()
可以看到输出为:
- res3: Long = 95
表明安装正确。
完整效果为:
- scala> val rdd = sc.textFile("/apps/spark/README.md")
- rdd: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[1] at textFile at <console>:27
- scala> rdd.count
- res0: Long = 95
- scala>