CentOS下的分布式内存计算Spark环境部署

news2025/6/12 20:43:01

一、Spark 核心架构与应用场景

1.1 分布式计算引擎的核心优势

Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势:

  • 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-790)。
  • 多范式支持:同时支持批处理(Spark SQL)、流处理(Spark Streaming)、图计算(GraphX)。
  • 生态统一:无缝集成 Hadoop 生态,支持从 HDFS、HBase 等数据源直接读取数据。
  • 高吞吐量:单机可处理百万级数据记录,集群可扩展至数千节点。

典型应用场景

  • 实时数据分析(如电商用户行为分析)。
  • 大规模机器学习(基于 MLlib 库的模型训练)。
  • 流式数据处理(配合 Kafka 实现实时日志分析)。

二、集群环境规划与前置准备

2.1 集群节点规划(3 节点方案)

节点名称IP 地址角色分配内存配置数据目录
spark-node1192.168.88.130Master、Worker16GB/data/spark/data
spark-node2192.168.88.131Worker16GB/data/spark/data
spark-node3192.168.88.132Worker16GB/data/spark/data

2.2 前置依赖安装(所有节点)

  1. JDK 环境(需 1.8+,文档段落:3-248):

    bash

    yum install -y java-1.8.0-openjdk-devel
    java -version # 验证版本
    
  2. Hadoop 集群(已部署 HDFS 和 YARN,文档段落:3-633):
    确保 HDFS 服务正常,Spark 将使用 HDFS 作为分布式存储。
  3. SSH 免密登录(文档段落:3-523):

    bash

    ssh-keygen -t rsa -b 4096 -N ""
    ssh-copy-id spark-node2 && ssh-copy-id spark-node3
    

三、Spark 单机安装与配置

3.1 下载与解压安装包

bash

# 下载Spark 2.4.5(文档段落:3-796)
wget https://archive.apache.org/dist/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz

# 解压到指定目录
tar -zxvf spark-2.4.5-bin-hadoop2.7.tgz -C /export/server/
ln -s /export/server/spark-2.4.5-bin-hadoop2.7 /export/server/spark # 创建软链接

3.2 核心配置文件修改

3.2.1 spark-env.sh(文档段落:3-800)

bash

vim /export/server/spark/conf/spark-env.sh
# 添加以下内容
export JAVA_HOME=/export/server/jdk
export HADOOP_CONF_DIR=/export/server/hadoop/etc/hadoop
export YARN_CONF_DIR=/export/server/hadoop/etc/hadoop
export SPARK_MASTER_HOST=spark-node1
export SPARK_MASTER_PORT=7077
export SPARK_MASTER_WEBUI_PORT=8080
export SPARK_WORKER_CORES=4 # 每个Worker使用4核
export SPARK_WORKER_MEMORY=8g # 每个Worker使用8GB内存
3.2.2 slaves(文档段落:3-803)

bash

vim /export/server/spark/conf/slaves
# 添加以下内容(每行一个节点)
spark-node1
spark-node2
spark-node3
3.2.3 spark-defaults.conf(可选优化)

bash

cp /export/server/spark/conf/spark-defaults.conf.template /export/server/spark/conf/spark-defaults.conf
vim /export/server/spark/conf/spark-defaults.conf
# 添加以下优化配置
spark.executor.memory 4g
spark.driver.memory 2g
spark.sql.shuffle.partitions 24
spark.default.parallelism 24

四、集群化部署:节点间配置同步

4.1 分发安装目录到其他节点

bash

# 在spark-node1执行,复制到node2/node3
scp -r /export/server/spark spark-node2:/export/server/
scp -r /export/server/spark spark-node3:/export/server/

4.2 配置文件一致性验证

检查所有节点的spark-env.shslaves文件内容一致,确保:

  • SPARK_MASTER_HOST指向正确的 Master 节点。
  • slaves文件包含所有 Worker 节点主机名。

五、集群启动与状态验证

5.1 启动 Spark 集群

5.1.1 单节点启动(spark-node1 执行)

bash

# 启动Master和Worker
/export/server/spark/sbin/start-all.sh
5.1.2 后台启动(生产环境推荐)

bash

nohup /export/server/spark/sbin/start-all.sh &
tail -f /export/server/spark/logs/spark-root-master-spark-node1.log # 查看启动日志

5.2 验证集群状态

5.2.1 进程检查(所有节点执行)

bash

jps | grep -E "Master|Worker"
# spark-node1应显示Master和Worker进程
# spark-node2/node3应显示Worker进程
5.2.2 网页管理界面
  • Master 状态:访问http://spark-node1:8080,查看集群概述、Worker 列表、应用程序运行情况(文档段落:3-810)。
  • Worker 状态:在管理界面中点击节点名称,查看 CPU、内存、磁盘使用情况。
5.2.3 命令行验证(文档段落:3-812)

bash

# 进入Spark Shell
/export/server/spark/bin/spark-shell --master spark://spark-node1:7077

# 执行单词计数示例
val textFile = sc.textFile("hdfs://spark-node1:8020/README.txt")
val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
wordCounts.collect()

六、核心功能测试与性能调优

6.1 数据处理测试

6.1.1 批量数据处理

使用 Spark SQL 处理 HDFS 上的 Parquet 文件:

sql

-- 在Spark SQL中执行
CREATE TABLE users USING parquet OPTIONS (path "hdfs://spark-node1:8020/users.parquet")
SELECT count(*) FROM users WHERE age > 30
6.1.2 流式数据处理

对接 Kafka 进行实时数据处理(需提前配置 Kafka 主题):

java

// 示例代码:Spark Streaming对接Kafka
val kafkaParams = Map[String, Object](
  "bootstrap.servers" -> "kafka-node1:9092,kafka-node2:9092",
  "key.deserializer" -> classOf[StringDeserializer],
  "value.deserializer" -> classOf[StringDeserializer],
  "group.id" -> "test-group",
  "auto.offset.reset" -> "latest",
  "enable.auto.commit" -> (false: java.lang.Boolean)
)
val topics = Array("test-topic")
val stream = KafkaUtils.createDirectStream[String, String](
  ssc,
  LocationStrategies.PreferConsistent,
  ConsumerStrategies.Subscribe[String, String](topics, kafkaParams)
)
stream.map(_._2).flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).print()

6.2 性能优化策略

6.2.1 资源分配优化
  • Executor 配置:根据任务类型调整 Executor 数量与内存:

    bash

    # 提交任务时指定资源
    /export/server/spark/bin/spark-submit \
    --master spark://spark-node1:7077 \
    --num-executors 10 \
    --executor-memory 4g \
    --executor-cores 2 \
    --class com.example.MyApp \
    my-app.jar
    
  • 动态资源分配:在spark-defaults.conf中启用:

    properties

    spark.dynamicAllocation.enabled true
    spark.dynamicAllocation.minExecutors 5
    spark.dynamicAllocation.maxExecutors 50
    
6.2.2 内存优化
  • 调整存储与执行内存比例

    properties

    spark.memory.storageFraction 0.5  # 存储占比50%
    spark.memory.fraction 0.8        # 总内存使用比例80%
    
  • 启用堆外内存

    properties

    spark.memory.offHeap.enabled true
    spark.memory.offHeap.size 2g
    
6.2.3 任务调度优化
  • 广播大变量

    java

    val broadcastVar = sc.broadcast(loadLargeData())
    
  • 合并小任务

    properties

    spark.sql.autoBroadcastJoinThreshold 104857600  # 100MB以下自动广播
    spark.default.parallelism 24 * num-executors
    

七、常见故障排查与解决方案

7.1 集群无法启动

可能原因

  • SSH 免密失败:检查节点间 SSH 连接是否正常,~/.ssh/authorized_keys是否包含所有节点公钥(文档段落:3-523)。
  • 端口冲突:确保 Master 端口(7077)、WebUI 端口(8080)未被占用。
  • 配置文件错误:检查spark-env.shHADOOP_CONF_DIR是否指向正确的 Hadoop 配置目录。

解决方法

bash

# 示例:修复SSH免密问题
ssh spark-node2 "echo 'hello' > /tmp/test" # 验证连接
netstat -anp | grep 7077 # 检查端口占用

7.2 任务执行缓慢

可能原因

  • 资源分配不足:Executor 数量或内存设置过低,导致任务排队。
  • 数据倾斜:某个分区数据量过大,形成任务热点。
  • Shuffle 操作频繁:过多的 Shuffle 操作导致磁盘 IO 瓶颈。

解决方法

  • 增加 Executor 数量与内存,调整--num-executors--executor-memory参数。
  • 对倾斜数据进行重分区:

    java

    df.repartition(24).write.parquet("hdfs://path")
    
  • 优化 SQL 查询,减少不必要的 Shuffle:

    sql

    SELECT * FROM table WHERE condition ORDER BY id LIMIT 100
    

7.3 Worker 节点掉线

可能原因

  • 内存溢出:Worker 内存不足导致 JVM 崩溃。
  • 网络分区:节点间网络延迟过高或断开。
  • 磁盘故障:数据目录所在磁盘损坏,导致任务失败。

解决方法

  • 增加spark-worker-memory配置,降低单个任务内存占用。
  • 检查网络连接,确保节点间延迟 < 1ms,带宽≥1Gbps。
  • 更换故障磁盘,重启 Worker 进程:

    bash

    /export/server/spark/sbin/stop-worker.sh spark-node2:8081
    # 修复磁盘后重新启动
    /export/server/spark/sbin/start-worker.sh spark://spark-node1:7077
    

八、生产环境最佳实践

8.1 高可用性配置

8.1.1 多 Master 部署(HA 模式)

通过 Zookeeper 实现 Master 自动故障转移(文档段落:3-793):

bash

# 修改spark-env.sh
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.zk.url=zk-node1:2181,zk-node2:2181,zk-node3:2181 -Dspark.zk.dir=/spark"

# 启动多个Master
/export/server/spark/sbin/start-master.sh --host spark-node1
/export/server/spark/sbin/start-master.sh --host spark-node2
8.1.2 数据持久化
  • Checkpoint 机制:对长时间运行的流作业设置 Checkpoint:

    java

    streamingContext.checkpoint("hdfs://spark-node1:8020/checkpoints")
    
  • 作业历史服务器:配置 HistoryServer 记录作业历史:

    bash

    # 修改spark-site.xml
    <property>
        <name>spark.history.fs.logDirectory</name>
        <value>hdfs://spark-node1:8020/spark-logs</value>
    </property>
    /export/server/spark/sbin/start-history-server.sh
    

8.2 安全与资源管理

8.2.1 启用 Kerberos 认证

bash

# 配置spark-env.sh
export SPARK_KERBEROS_PRINCIPAL="spark@EXAMPLE.COM"
export SPARK_KERBEROS_KEYTAB="/etc/kerberos/keytabs/spark.keytab"

# 提交任务时指定认证
kinit -kt spark.keytab spark@EXAMPLE.COM
/export/server/spark/bin/spark-submit --master yarn --deploy-mode cluster ...
8.2.2 资源队列管理

通过 YARN 队列管理不同应用资源(需提前配置 YARN 队列):

bash

/export/server/spark/bin/spark-submit \
--master yarn --deploy-mode cluster \
--queue production \
--resources memory=8g,vcores=4 \
--class com.example.MyApp my-app.jar

九、总结:Spark 集群部署核心流程

通过以上步骤,可构建一个高可用、高性能的 Spark 分布式计算集群,支撑大规模数据处理与分析任务。生产环境中需结合业务场景优化资源分配、内存使用及任务调度策略,并利用 Spark 生态工具(如 Spark SQL、MLlib)提升开发效率。参考官方文档(Spark Documentation)可进一步学习流处理、机器学习等高级特性及性能调优技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2407768.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…