• 大数据Hadoop之——Spark集群部署(Standalone)


    一、Spark概述

    Spark基础概念和原理讲解可以参考我上篇博文:大数据Hadoop之——计算引擎Spark

    二、Spark的运行模式

    1)Standalone(本章讲解)

    独立模式,自己独立一套集群(master/client/slave),Spark 原生的简单集群管理器, 自带完整的服务, 可单独部署到一个集群中,无需依赖任何其他资源管理系统, 使用 Standalone 可以很方便地搭建一个集群,一般在公司内部没有搭建其他资源管理框架的时候才会使用。缺点:资源不利于充分利用

    2)Mesos

    一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 yarn,由于mesos这种方式目前应用的比较少,这里没有记录mesos的部署方式。

    3)YARN(推荐)

    统一的资源管理机制, 在上面可以运行多套计算框架, 如map reduce、storm,spark、flink 等, 根据 driver 在集群中的位置不同,分为 yarn client 和 yarn cluster,其实本质就是drive不同。企业里用得最多的一种模式。这种模式环境部署,已经在大数据Hadoop之——计算引擎Spark博文中讲过,这里就不重复了。

    • yarn Client模式:Driver运行在本地,适合交互调试
    • yarn Cluster模式:Driver运行在集群(AM),正式提交任务的模式(remote)

    4)K8S(新模式)

    K8S 是 Spark 上全新的集群管理和调度系统。由于在实际生产环境下使用的绝大多数的集群管理器是 ON YARN模式,因此我们目前最主要还是关注ON YARN模式,ON K8S模式了解就行,有兴趣的小伙伴可以试试,工作模式如下图所示:

    Spark 的运行模式取决于传递给 SparkContext 的 MASTER 环境变量的值, 个别模式还需要辅助的程序接口来配合使用,目前支持的 Master 字符串及 URL 包括:

    --deploy-mode:是否将驱动程序(driver)部署在工作节点(cluster)上,或作为外部客户机(client)本地部署(默认值:client)。

    Master URL 含义
    local 在本地运行,只有一个工作进程,无并行计算能力
    local[K] 在本地运行,有 K 个工作进程,通常设置 K 为机器的CPU 核心数量
    local[*] 在本地运行,工作进程数量等于机器的 CPU 核心数量。
    spark://HOST:PORT 以 Standalone 模式运行,这是 Spark 自身提供的集群运行模式,默认端口号: 7077
    mesos://HOST:PORT 在 Mesos 集群上运行,Driver 进程和 Worker 进程运行在 Mesos 集群上,部署模式必须使用固定值:--deploy-mode cluster
    yarn 在yarn集群上运行,依赖于hadoop集群,yarn资源调度框架,将应用提交给yarn,在ApplactionMaster(相当于Stand alone模式中的Master)中运行driver,在集群上调度资源,开启excutor执行任务。
    k8s 在k8s集群上运行

    三、Standalone 模式运行机制

    Standalone 集群有四个重要组成部分, 分别是:

    • Driver: 是一个进程,我们编写的 Spark 应用程序就运行在 Driver 上, 由Driver 进程执行;
    • Master:是一个进程,主要负责资源的调度和分配,并进行集群的监控等职责;
    • Worker:是一个进程,一个 Worker 运行在集群中的一台服务器上,主要负责两个职责,一个是用自己的内存存储 RDD 的某个或某些 partition;另一个是启动其他进程和线程(Executor) ,对 RDD 上的 partition 进行并行的处理和计算。
    • Executor:是一个进程, 一个 Worker 上可以运行多个 Executor, Executor 通过启动多个线程( task)来执行对 RDD 的 partition 进行并行计算,也就是执行我们对 RDD 定义的例如 map、flatMap、reduce 等算子操作。

    1)Standalone Client 模式

    • 在Standalone Client模式下,Driver在任务提交的本地机器上运行,
    • Driver启动后向Master注册应用程序,Master根据submit脚本的资源需求找到内部资源至少可以启动一个Executor的所有Worker,
    • 然后在这些Worker之间分配Executor,Worker上的Executor启动后会向Driver反向注册,所有的Executor注册完成后,
    • Driver开始执行main函数,之后执行到Action算子时,开始划分stage,每个stage生成对应的taskSet,之后将task分发到各个Executor上执行。

    2)Standalone Cluster 模式

    • 在 Standalone Cluster 模式下,任务提交后,Master 会找到一个 Worker 启动 Driver进程,
    • Driver 启动后向 Master 注册应用程序,
    • Master 根据 submit 脚本的资源需求找到内部资源至少可以启动一个 Executor 的所有 Worker,
    • 然后在这些 Worker 之间分配 Executor,Worker 上的 Executor 启动后会向 Driver 反向注册,
    • 所有的 Executor 注册完成后,Driver 开始执行 main 函数,之后执行到 Action 算子时,开始划分 stage,每个 stage 生成对应的 taskSet,之后将 task 分发到各个 Executor 上执行。

    【 注意】Standalone的两种模式下(client/Cluster),Master在接到Driver注册Spark应用程序的请求后,会获取其所管理的剩余资源能够启动一个Executor的所有Worker,然后在这些Worker之间分发Executor,此时的分发只考虑Worker上的资源是否足够使用,直到当前应用程序所需的所有Executor都分配完毕,Executor反向注册完毕后,Driver开始执行main程序。

    四、Spark 集群安装(Standalone)

    1)机器及角色划分

    机器IP 机器名 节点类型
    192.168.0.113 hadoop-node1 Master/Worker
    192.168.0.114 hadoop-node2 Worker
    192.168.0.115 hadoop-node3 Worker

    2)三台机器安装JDK环境

    之前安装Hadoop集群的时候已经安装过了,这里就略过了,不清楚的可以参考我之前的文章:大数据Hadoop原理介绍+安装+实战操作(HDFS+YARN+MapReduce)

    3)下载

    Spark下载地址:http://spark.apache.org/downloads.html

    这里需要注意版本,我的hadoop版本是3.3.1,这里spark就下载最新版本的3.2.0,而Spark3.2.0依赖的Scala的2.13,所以后面用到Scala编程时注意Scala的版本。

    $ cd /opt/bigdata/hadoop/software
    # 下载
    $ wget https://dlcdn.apache.org/spark/spark-3.2.0/spark-3.2.0-bin-hadoop3.2.tgz
    # 解压
    $ tar -zxvf spark-3.2.0-bin-hadoop3.2.tgz -C /opt/bigdata/hadoop/server/
    # 修改安装目录名称
    $ cp -r /opt/bigdata/hadoop/server/spark-3.2.0-bin-hadoop3.2 /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2
    

    4)配置spark

    1、配置slaves文件

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/conf
    $ cp workers.template workers
    # slaves文件内容如下:
    hadoop-node1
    hadoop-node2
    hadoop-node3
    

    hadoop-node1即是master,也是worker

    2、配置spark-env.sh

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/conf
    # 创建data目录(所有节点都得创建这个目录)
    $ mkdir -p /opt/bigdata/hadoop/data/spark-standalone
    # copy一份环境变量文件
    $ cp spark-env.sh.template spark-env.sh
    # 加入以下内容:
    export SPARK_MASTER_HOST=hadoop-node1
    export SPARK_LOCAL_DIRS=/opt/bigdata/hadoop/data/spark-standalone
    

    3、配置spark-defaults.conf
    这里不做修改,如果需要修改,自行修改就行,默认端口7077

    $ cp spark-defaults.conf.template spark-defaults.conf
    $ cat spark-defaults.conf
    

    5)将配置好的包copy另外两台集群

    $ scp -r spark-standalone-3.2.0-bin-hadoop3.2 hadoop-node2:/opt/bigdata/hadoop/server/
    $ scp -r spark-standalone-3.2.0-bin-hadoop3.2 hadoop-node3:/opt/bigdata/hadoop/server/
    

    5)启动

    1、启动Master(在hadoop-node1节点上执行)

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/sbin
    $ ./start-master.sh
    # 查看进程端口,spark master web ui 默认端口为8080
    $ ss -tnlp|grep :8080
    # 如果端口冲突,修改start-master.sh脚本里的端口即可
    $ grep SPARK_MASTER_WEBUI_PORT start-master.sh
    


    访问spark master web ui:http://hadoop-node1:8080

    2、启动Worker节点(在所有节点上都执行)

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/sbin
    $ ./start-worker.sh spark://hadoop-node1:7077
    

    五、测试验证

    spark-submit 详细参数说明

    参数名 参数说明
    --master master 的地址,提交任务到哪里执行,例如 spark://host:port, yarn, local
    --deploy-mode 在本地 (client) 启动 driver 或在 cluster 上启动,默认是 client
    --class 应用程序的主类,仅针对 java 或 scala 应用
    --name 应用程序的名称
    --jars 用逗号分隔的本地 jar 包,设置后,这些 jar 将包含在 driver 和 executor 的 classpath 下
    --packages 包含在driver 和executor 的 classpath 中的 jar 的 maven 坐标
    --exclude-packages 为了避免冲突 而指定不包含的 package
    --repositories 远程 repository
    --conf PROP=VALUE 指定 spark 配置属性的值, 例如 -conf spark.executor.extraJavaOptions="-XX:MaxPermSize=256m"
    --properties-file 加载的配置文件,默认为 conf/spark-defaults.conf
    --driver-memory Driver内存,默认 1G
    --driver-java-options 传给 driver 的额外的 Java 选项
    --driver-library-path 传给 driver 的额外的库路径
    --driver-class-path 传给 driver 的额外的类路径
    --driver-cores Driver 的核数,默认是1。在 yarn 或者 standalone 下使用
    --executor-memory 每个 executor 的内存,默认是1G
    --total-executor-cores 所有 executor 总共的核数。仅仅在 mesos 或者 standalone 下使用
    --num-executors 启动的 executor 数量。默认为2。在 yarn 下使用
    --executor-core 每个 executor 的核数。在yarn或者standalone下使用

    1)driver client模式(--deploy-mode client)

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/bin
    $ ./spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master spark://hadoop-node1:7077 \
    --deploy-mode client \
    --driver-memory 1G \
    --executor-memory 1G \
    --total-executor-cores 2 \
    --executor-cores 1 \
    /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.2.0.jar 10
    

    这种模式运行结果,直接在客户端显示出来了。

    2)driver cluster模式(--deploy-mode cluster)

    $ cd /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/bin
    $ ./spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master spark://hadoop-node1:7077 \
    --deploy-mode cluster \
    --driver-memory 1G \
    --executor-memory 1G \
    --total-executor-cores 2 \
    --executor-cores 1 \
    /opt/bigdata/hadoop/server/spark-standalone-3.2.0-bin-hadoop3.2/examples/jars/spark-examples_2.12-3.2.0.jar 10
    

    这种模式基本上没什么输出信息,需要登录web页面查看

    查看driver日志信息

    最终在driver日志里查看运行结果了。

    【温馨提示】目前企业里用的最多的模式还是on yarn模式,Standalone模式了解就行。

  • 相关阅读:
    拯救祭天的程序员——事件溯源模式
    啥?SynchronousQueue和钟点房一个道理
    程序员应该掌握的一些 Linux 命令
    Linux 环境下使用 sqlplus 访问远程 Oracle 数据库
    我对鸿蒙OS的一些看法
    我对技术潮流的一些看法
    git merge --ff/--no-ff/--ff-only 三种选项参数的区别
    go语言的初体验
    完全使用 VSCode 开发的心得和体会
    重复代码的克星,高效工具 VSCode snippets 的使用指南
  • 原文地址:https://www.cnblogs.com/liugp/p/16153043.html
Copyright © 2020-2023  润新知