当前位置: > > > Spark - 安装部署详细教程5(ON YARN模式)

Spark - 安装部署详细教程5(ON YARN模式)

    Spark 集群有多种部署方式,比较常见的有 Standalone 模式和 ON YARN 模式
  • Standalone 模式就是说部署一套独立的 Spark 集群,后期开发的 Spark 任务就在这个独立的 Spark 集群中执行。
  • ON YARN 模式是说使用现有的 Hadoop 集群,后期开发的 Spark 任务会在这个 Hadoop 集群中执行,此时这个 Hadoop 集群就是一个公共的了,不仅可以运行 MapReduce 任务,还可以运行 Spark 任务,这样集群的资源就可以共享了,并且也不需要再维护一套集群了,减少了运维成本和运维压力,一举两得。
    我在之前的文章介绍了如何使用 Standalone 模式部署 Spark点击查看),本文接着演示另一种 ON YARN 模式,这也是实际工作中都会使用。

五、ON YARN 模式

1,模式介绍

(1)ON YARN 模式很简单,先保证有一个 Hadoop 集群,然后只需要部署一个 Spark 的客户端节点即可,不需要启动任何进程。
注意Spark 的客户端节点同时也需要是 Hadoop 的客户端节点,因为 Spark 需要依赖于 Hadoop

(2)假设我们的 Hadoop 集群是 node1node2node3。那我们可以选择把 Spark 部署在一个单独的节点上就可以了。而关于 Hadoop 集群的部署,可以参考我之前写的文章:

2,Spark 部署

(1)首先我们访问 Apache Spark 官方下载页面(点击访问),选择合适的版本下载。这里我下载的是 3.4.1 版本。
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)我之前写过文章介绍当使用 Standalone 模式部署 Spar k集群时如何开启 Spark 历史服务(点击查看),本文接着演示在 ON YARN 模式下如何开启历史服务。

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

(2) 接着编辑 conf 目录下的 spark-env.sh 文件:
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

(4)执行完毕后,我们在 YARN 8088 界面也可以看到刚提交上去的任务信息,点击“History”链接。

(5)接着会打开如下页面,要查看 foreach 打印的日志信息,可以点击 Stages 链接,然后点击 foreach 链接

(6)再点击 stdout 这里:

(7)最后就可以看到 foreach 输出的信息了
评论0