• 云服务器搭建Spark集群


    1. Local 模式

    1.1 安装local模式

    • 即解压spark-3.0.0-bin-hadoop3.2.tgz 文件到/opt/moudle/路径下,并改名为spark-local

      [gaochuchu@s1 jvm]$ cd /opt/module/spark-local/
      [gaochuchu@s1 spark-local]$ bin/spark-shell 
      
      • 1
      • 2
      • 此时出现如下界面说明local环境启动成功

        image-20231028151907854

      • 启动后,可以通过http://虚拟机地址:4040访问Web UI监控界面

        image-20231028151959161

    1.2 命令行工具

    • 命令行工具

      • 在/opt/module/spark-local/data的目录下,添加一个word.txt文件。通过如下的命令执行单词统计程序

        image-20231028152309081

      • 退出local模式

        scala> :quit
        
        • 1

    1.3 提交本地应用

    • 提交本地的示例应用

      bin/spark-submit \
      --class org.apache.spark.examples.SparkPi \
      --master local[2] \
      ./examples/jars/spark-examples_2.12-3.0.0.jar \
      10
      
      • 1
      • 2
      • 3
      • 4
      • 5

      image-20231028152610275

      • –class 表示要执行程序的主类,此处可以更换为咱们自己写的应用程序
      • -master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟 CPU 核数量
      • spark-examples_2.12-3.0.0.jar 运行的应用类所在的 jar 包,实际使用时,可以设置为自己打的 jar 包
      • 数字 10 表示程序的入口参数,用于设定当前应用的任务数量

    2. Standlone模式

    • Local模式只适合进行练习,真实工作中还是要将应用提交到对应的集群中去执行,StandLione模式,只使用Spark自身节点运行的集群模式
    • 其特点为经典的master-slaver模式
    • 即解压spark-3.0.0-bin-hadoop3.2.tgz 文件到/opt/moudle/路径下,并改名为spark-standlone

    2.1 集群配置

    s1s2s3s4gracal
    SparkWorker MasterWorkerWorkerWorkerWorker

    2.2 修改配置文件

    • 修改slaves配置文件

      #进入spark-standline的conf目录
      [gaochuchu@s1 ~]$ cd /opt/module/spark-standalone/conf/
      #重命名
      [gaochuchu@s1 conf]$ mv slaves.template slaves
      #修改slaves文件,添加worker节点
      [gaochuchu@s1 conf]$ vim slaves
      s1
      s2
      s3
      s4
      gracal
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 环境变量配置文件spark-env.sh.tmpate 改名为spark-env.sh,并增加环境变量

      #重命名
      [gaochuchu@s1 conf]$ mv spark-env.sh.template spark-env.sh
      #修改配置文件
      [gaochuchu@s1 conf]$ vim spark-env.sh
      #这里配置的是本服务器的java home的位置
      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
      SPARK_MASTER_HOST=s1
      SPARK_MASTER_PORT=7077
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      这里的7077端口,相当于hadoop集群中内部通信的8020端口

    • 分发spark-standalone目录

      xsync spark-standalone
      
      • 1

    2.3 启动集群与停止集群

    • 执行脚本启动集群

      gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
      
      • 1
    • 查看集群运行状态:可以知道s1为master,而其余节点为worker节点

      image-20231028155856561

    • 执行脚本停止集群

      gaochuchu@s1 spark-standalone]$ sbin/stop-all.sh
      
      • 1

    2.4 提交应用到集群环境

    • 提交应用到集群环境

      bin/spark-submit \
      --class org.apache.spark.examples.SparkPi \
      --master spark://s1:7077 \
      ./examples/jars/spark-examples_2.12-3.0.0.jar \
      10
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 出现如下界面,说明应用执行完成,成功得到Pi的值

        image-20231028160403909

        注意:

        • –class 表示要执行程序的主类
        • –master spark://s1:7077 独立部署模式,连接到 Spark 集群
        • spark-examples_2.12-3.0.0.jar 运行类所在的 jar 包
        • 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
    • Standalone模式之下,会产生多个java进程

      • SparkSubmit是提交节点的进程

      • CoarseGrainedExecutorBackend是执行节点的进程

        image-20231028161120335
    • 执行任务时,在master的Web UI界面,可以看到节点的内存,以及服务器集群节点的总核数

      image-20231028162132075

    2.5 提交应用的参数详细说明

    参数解释可选值举例
    –classSpark 程序中包含主函数的类
    –masterSpark 程序运行的模式(环境)模式:local[*]、spark://s1:7077、Yarn
    –executor-memory 1G指定每个 executor 可用内存为 1G
    –total-executor-cores 2指定所有executor使用的cpu核数为2个
    –executor-cores指定每个executor使用的cpu核数其值=total-excutor-cores/ num-executors
    application-jar打包好的应用 jar,包含依赖。这个URL在集群全局可见。
    比如 hdfs:// 共享存储系统,如果是flie://path,那么所有的节点
    都包含相同的jar
    application-arguments传给main()方法的参数如上述的数字10,说明num-executors为10

    2.6 配置历史服务

    • 由于spark-shell停止后,集群监控s1:4040页面都看不到历史任务的运行情况,所以开发的时都配置历史服务器记录任务运行情况

      • 修改spark-default.conf.template 文件为spark-default.conf,并配置日志存储路径
      # 修改文件名
      [gaochuchu@s1 conf]$ mv spark-defaults.conf.template spark-defaults.conf
      #配置日志存储路径
      [gaochuchu@s1 conf]$ vim spark-defaults.conf 
      spark.eventLog.enabled             true
      spark.eventLog.dir                 hdfs://s1:8020/directory
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      注意:hdfs中必须已经存在directory

      因此启动hadoop集群,并使用hadoop fs -mkdir /directory 创建该目录

    • 修改spark-env.sh文件,添加日志配置并分发配置

      [gaochuchu@s1 conf]$ vim spark-env.sh
      export SPARK_HISTORY_OPTS="
      -Dspark.history.ui.port=18080 
      -Dspark.history.fs.logDirectory=hdfs://s1:8020/directory 
      -Dspark.history.retainedApplications=30"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 参数 1 含义:WEB UI 访问的端口号为 18080

      • 参数 2 含义:指定历史服务器日志存储路径 注意8020是当前版本的Hadoop集群的内部通信窗口,hadoop2.x也可能是9000

      • 参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。当 Spark 应用程序运行完成后,其元数据和日志可以被 Spark 历史服务器(Spark History Server)存储和显示,以便于开发者和管理员回顾和分析。需要注意的是,增加保留的应用程序数量将会增加 Spark 历史服务器的磁盘和内存使用量,因为它需要存储更多的元数据和日志信息。因此,在增加这个值时,你需要确保你的系统有足够的资源来支持这么做。

    • 重新启动spark集群和历史服务器

      [gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
      [gaochuchu@s1 spark-standalone]$ sbin/start-history-server.sh 
      
      • 1
      • 2
    • 提交任务

      bin/spark-submit \
      --class org.apache.spark.examples.SparkPi 
      \--master spark://s1:7077 \
      ./examples/jars/spark-examples_2.12-3.0.0.jar \
      10
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 查看历史服务器:http://s1:18080

      image-20231028170844247

    2.7 配置高可用(HA)

    • 当前集群中只有一个Master节点,会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个Master节点,一旦活动状态的Master发生故障,由备用Master提供服务,保证作业能够继续执行。高可用一般采用Zookeeper设置,因此需要确保集群中安装了Zookeeper

    • 关闭Spark集群,启动Zookeeper集群

      [gaochuchu@s1 spark-standalone]$ sbin/stop-all.sh
      [gaochuchu@s1 spark-standalone]$ zk.sh start
      
      • 1
      • 2
    • 修改spark-env.sh文件配置,添加如下内容,并且需要注释原来配置的master的host和port

      [gaochuchu@s1 conf]$ vim spark-env.sh 
      #SPARK_MASTER_HOST=s1
      #SPARK_MASTER_PORT=7077
      
      SPARK_MASTER_WEBUI_PORT=8989
      export SPARK_DAEMON_JAVA_OPTS="
      -Dspark.deploy.recoveryMode=ZOOKEEPER 
      -Dspark.deploy.zookeeper.url=s1,s2,s3,s4,gracal
      -Dspark.deploy.zookeeper.dir=/spark"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      注意:Master 监控页面默认访问端口为 8080,但是可能会和 Zookeeper 冲突,所以改成 8989,也可以自定义为其他端口号

    • 分发配置并启动spark集群

      [gaochuchu@s1 spark-standalone]$ xsync conf/
      [gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
      
      • 1
      • 2
    • 此时访问master节点的Web UI界面:http://s1:8989

      image-20231028173002764

    • 启动s2的单独master节点,访问其Web UI:http://s2:8989,发现此时s2会处于备用状态

      [gaochuchu@s2 spark-standalone]$ sbin/start-master.sh 
      
      • 1

      image-20231028173251765

    • 测试高可用

      • 首先我们提交应用

        bin/spark-submit \
        --class org.apache.spark.examples.SparkPi \
        --master spark://s1:7077 \
        ./examples/jars/spark-examples_2.12-3.0.0.jar \
        10
        
        • 1
        • 2
        • 3
        • 4
        • 5
      • 停止s1的master进程,然后再查看s2的master资源监控的Web UI,稍等一段时间,s2的Master状态提升为活动状态

        image-20231028173621255

    3. Yarn模式(常用)

    • 独立部署(Standalone)模式由Spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是,Spark主要是计算框架,不是资源调度框架,所以Spark其本身提供的资源调度并不是它的强项,所以还是和其他专业的资源调度框架集成更加可靠,如Yarn。

    3.1 集群配置

    s1s2s3s4gracal
    HDFSNameNode DataNodeDataNodeSecondaryNameNode DataNodeDataNodeDataNode
    YARNNodeManagerResourceManager NodeManagerNodeManagerNodeManagerNodeManager
    ZookeeperServer1(follower)Server2(follower)Server3(may be learder)Server4(follower)Server5(follower)
    SparkWorker MasterWorker 可开启备用MasterWorkerWorkerWorker

    3.2 安装Yarn模式

    • 即解压spark-3.0.0-bin-hadoop3.2.tgz 文件到/opt/moudle/路径下,并改名为spark-yarn

    • 修改hadoop的配置文件yarn-site.xml,新增配置并且分发配置

      [gaochuchu@s1 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
      [gaochuchu@s1 hadoop]$ vim yarn-site.xml
      <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认
      是 true -->
      <property>
       <name>yarn.nodemanager.pmem-check-enabled</name>
       <value>false</value>
      </property>
      <!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认
      是 true -->
      <property>
       <name>yarn.nodemanager.vmem-check-enabled</name>
       <value>false</value>
      </property>
      
      [gaochuchu@s1 hadoop]$ xsync yarn-site.xml 
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
    • 环境变量配置文件spark-env.sh.tmpate 改名为spark-env.sh,并增加环境变量

      [gaochuchu@s1 conf]$ mv spark-env.sh.template spark-env.sh
      export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
      YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
      
      • 1
      • 2
      • 3
    • 启动HDFS以及Yarn集群

      [gaochuchu@s1 conf]$ myhadoop.sh start
      
      • 1
    • 提交应用

      特别注意:Yarn模式下已经不需要启动Spark集群了,只需要保证Hadoop集群处于启动状态即可

      否则在启动Spark集群的时候会显示localhost: Authentication failed.

      bin/spark-submit \
      --class org.apache.spark.examples.SparkPi \
      --master yarn \
      --deploy-mode cluster \
      ./examples/jars/spark-examples_2.12-3.0.0.jar \
      10
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      image-20231028180636252

      • 运行完成,查看http://s2:7666页面,点击History 查看历史页面【因为Yarn的ResouceManager配置在s2节点上】

        image-20231028181039197

    3.3 配置历史服务器

    • 由于spark-shell停止后,集群监控s1:4040页面都看不到历史任务的运行情况,所以开发的时都配置历史服务器记录任务运行情况

      • 修改spark-default.conf.template 文件为spark-default.conf,并配置日志存储路径
      # 修改文件名
      [gaochuchu@s1 conf]$ mv spark-defaults.conf.template spark-defaults.conf
      #配置日志存储路径
      [gaochuchu@s1 conf]$ vim spark-defaults.conf 
      spark.eventLog.enabled             true
      spark.eventLog.dir                 hdfs://s1:8020/directory
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      注意:hdfs中必须已经存在directory

      因此启动hadoop集群,并使用hadoop fs -mkdir /directory 创建该目录

    • 修改spark-env.sh文件,添加日志配置并分发配置

      [gaochuchu@s1 conf]$ vim spark-env.sh
      export SPARK_HISTORY_OPTS="
      -Dspark.history.ui.port=18080 
      -Dspark.history.fs.logDirectory=hdfs://s1:8020/directory 
      -Dspark.history.retainedApplications=30"
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 参数 1 含义:WEB UI 访问的端口号为 18080

      • 参数 2 含义:指定历史服务器日志存储路径 注意8020是当前版本的Hadoop集群的内部通信窗口,hadoop2.x也可能是9000

      • 参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。当 Spark 应用程序运行完成后,其元数据和日志可以被 Spark 历史服务器(Spark History Server)存储和显示,以便于开发者和管理员回顾和分析。需要注意的是,增加保留的应用程序数量将会增加 Spark 历史服务器的磁盘和内存使用量,因为它需要存储更多的元数据和日志信息。因此,在增加这个值时,你需要确保你的系统有足够的资源来支持这么做。

    • 修改spark-default.conf,添加配置文件

      [gaochuchu@s1 conf]$ vim spark-defaults.conf 
      spark.yarn.historyServer.address=s1:18080
      spark.history.ui.port=18080
      
      • 1
      • 2
      • 3
    • 重新启动历史服务器

      [gaochuchu@s1 spark-standalone]$ sbin/start-history-server.sh 
      
      • 1
    • 重新提交应用

      bin/spark-submit \
      --class org.apache.spark.examples.SparkPi \
      --master yarn \
      --deploy-mode cluster \
      ./examples/jars/spark-examples_2.12-3.0.0.jar \
      10
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
    • 查看Yarn的WebUI http:s2:1666 ,以及历史服务器http:s1:18080

      image-20231028185117994

      image-20231028185140416

    3.4 关于配置高可用的相关说明|

    • Spark on YARN模式的高可用性

      使用YARN ResourceManager的HA机制,通过ResourceManager的自动故障转移实现Spark集群的高可用性。

    • Spark Standalone模式的高可用性:

      使用Spark自带的HA机制,通过Zookeeper实现主节点的选举和故障转移,从而保证Spark集群的高可用性。

    3.5 停止集群

    # 停止hadoop集群
    [gaochuchu@s1 spark-yarn]$ myhadoop.sh stop
    # 停止历史服务器
    [gaochuchu@s1 spark-yarn]$ sbin/stop-history-server.sh 
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【推荐系统学习笔记】-- 1、推荐系统架构
    asp.net core服务限制堆内存大小
    基于Spring Boot+vue的民宿预定管理系统的设计与实现
    java计算机毕业设计信用卡逾期数据处理分析系统源程序+mysql+系统+lw文档+远程调试
    JAVA社区疫情防控系统毕业设计,社区疫情防控管理系统设计与实现,毕设作品参考
    高速数据采集与图像传输对带宽需求的对比分析
    C++ | Leetcode C++题解之第35题搜索插入位置
    Python中的import和from import
    甲醇燃料电池(DMFC) 系统
    本地连接服务器使用GPU训练模型
  • 原文地址:https://blog.csdn.net/weixin_44911248/article/details/134095052