Spark - 安装部署详细教程5(ON YARN模式)
Spark 集群有多种部署方式,比较常见的有 Standalone 模式和 ON YARN 模式
- Standalone 模式就是说部署一套独立的 Spark 集群,后期开发的 Spark 任务就在这个独立的 Spark 集群中执行。
- ON YARN 模式是说使用现有的 Hadoop 集群,后期开发的 Spark 任务会在这个 Hadoop 集群中执行,此时这个 Hadoop 集群就是一个公共的了,不仅可以运行 MapReduce 任务,还可以运行 Spark 任务,这样集群的资源就可以共享了,并且也不需要再维护一套集群了,减少了运维成本和运维压力,一举两得。
五、ON YARN 模式
1,模式介绍
(1)ON YARN 模式很简单,先保证有一个 Hadoop 集群,然后只需要部署一个 Spark 的客户端节点即可,不需要启动任何进程。
注意:Spark 的客户端节点同时也需要是 Hadoop 的客户端节点,因为 Spark 需要依赖于 Hadoop。
2,Spark 部署
wget https://archive.apache.org/dist/spark/spark-3.4.1/spark-3.4.1-bin-hadoop3.tgz
(2)然后执行下面命令将下载下来的压缩包解压至指定目录(目录地址可以根据需要自行调整):
tar -zxvf spark-3.4.1-bin-hadoop3.tgz -C /usr/local
(3)进入 spark 目录中的 conf 目录,创建一个 spark-env.sh 文件:
cd /usr/local/spark-3.4.1-bin-hadoop3/conf/ vi spark-env.sh
(4)文件内容如下,指定 Hadoop 的配置文件目录:
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
3,提交任务
(1)Spark 安装包内已经包含一些示例 Jar 包,位于 examples 目录下。我们可以直接用来测试 spark-submit 功能。首先进入 spark 目录:
cd /usr/local/spark-3.4.1-bin-hadoop3
(2)然后执行如下命令通过这个 spark 客户点节点,向 Hadoop 集群上提交 spark 任务:
./bin/spark-submit \ --master yarn \ --class org.apache.spark.examples.SparkPi \ examples/jars/spark-examples_2.12-3.4.1.jar \ 10
(3)执行完毕后控制台会输出 Pi 的值:
(4)并且我也在 YARN 的 8088 界面也可以看到刚提交上去的任务信息:
附:开启 Spark history Server(Spark 历史服务)
1,服务介绍
(1)通过相应的配置,Spark 应用程序在运行完应用程序之后,会将应用程序的运行信息写入指定目录,而 Spark history server 可以将这些运行信息装载并以 web 的方式供用户浏览。
2,操作步骤
(1)我们可以任意选择一个服务器来开启 Spark history Server 进程,选择集群内的节点也可以,选择 Spark 的客户端节点也可以。首先进入 spark 的 conf 目录,创建一个 spark-defaults.conf 文件:
cd /usr/local/spark-3.4.1-bin-hadoop3/conf vi spark-defaults.conf
- 文件的内容如下:
注意:
- 在哪个节点上启动 spark 的 historyserver 进程,spark.yarn.historyServer.address 的值里面就指定哪个节点的主机名信息。
- 这里我使用 HDFS 目录进行日志统一存储,该目录要提前创建好,否则启动历史服务时会报目录不存在而启动失败。
spark.eventLog.enabled true spark.eventLog.dir hdfs://node1:9000/spark-log spark.history.fs.logDirectory=hdfs://node1:9000/spark-log spark.yarn.historyServer.address=http://node1:18080
vi spark-env.sh
- 在文件中添加如下日志配置:
参数说明:
- spark.history.ui.port:历史服务 WEB UI 访问的端口号
- spark.history.fs.logDirectory:指定历史服务器日志存储路径
export SPARK_HISTORY_OPTS=" -Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://node1:9000/spark-log"
(3)最后执行如下命令启动历史服务:
./sbin/start-history-server.sh
(4)然后我们可以使用 jps 命令验证下服务是否启动成功:
3,使用测试
(1)要查看 Spark 的日志,我们除了要启动 Spark 历史服务,还需要开启 Hadoop 的 historyserver:
关于 Hadoop 的 historyserver 的详细说明,可以参考我之前写的文中:
- Hadoop - MapReduce任务日志查看教程(启动historyserver开启日志聚合功能)
cd /usr/local/hadoop/ bin/mapred --daemon start historyserver
(2)接着我们编写个简单的 WordCount 程序并达打成 Jar 包上传到服务器,其中我们会通过 foreach 将结果数据打印出来:
import org.apache.spark.{SparkConf, SparkContext} object WordCount { def main(args: Array[String]): Unit = { //第一步:创建SparkContext val conf = new SparkConf() conf.setAppName("WordCount")//设置任务名称 // .setMaster("local")//local表示在本地执行 val sc = new SparkContext(conf) //第二步:加载数据 var path = "D:\\hello.txt" if (args.length == 1) { path = args(0) } val linesRDD = sc.textFile(path) //第三步:对数据进行切割,把一行数据切分成一个一个的单词 val wordsRDD = linesRDD.flatMap(_.split(" ")) //第四步:迭代words,将每个word转化为(word,1)这种形式 val pairRDD = wordsRDD.map((_,1)) //第五步:根据key(其实就是word)进行分组聚合统计 val wordCountRDD = pairRDD.reduceByKey(_ + _) //第六步:将结果打印到控制台 wordCountRDD.foreach(wordCount=>println(wordCount._1+"--"+wordCount._2)) //第七步:停止SparkContext sc.stop() } }
(3)然后执行如下命令使用 on yarn 模式向集群提交任务:
./bin/spark-submit \ --master yarn \ --class WordCount \ spark-1.0-SNAPSHOT-jar-with-dependencies.jar \ hdfs://node1:9000/hello.txt
(5)接着会打开如下页面,要查看 foreach 打印的日志信息,可以点击 Stages 链接,然后点击 foreach 链接
(6)再点击 stdout 这里:
(7)最后就可以看到 foreach 输出的信息了