CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景
1.1 分布式计算引擎的核心优势
Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势:
- 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-790)。
- 多范式支持:同时支持批处理(Spark SQL)、流处理(Spark Streaming)、图计算(GraphX)。
- 生态统一:无缝集成 Hadoop 生态,支持从 HDFS、HBase 等数据源直接读取数据。
- 高吞吐量:单机可处理百万级数据记录,集群可扩展至数千节点。
典型应用场景:
- 实时数据分析(如电商用户行为分析)。
- 大规模机器学习(基于 MLlib 库的模型训练)。
- 流式数据处理(配合 Kafka 实现实时日志分析)。
二、集群环境规划与前置准备
2.1 集群节点规划(3 节点方案)
节点名称 | IP 地址 | 角色分配 | 内存配置 | 数据目录 |
---|---|---|---|---|
spark-node1 | 192.168.88.130 | Master、Worker | 16GB | /data/spark/data |
spark-node2 | 192.168.88.131 | Worker | 16GB | /data/spark/data |
spark-node3 | 192.168.88.132 | Worker | 16GB | /data/spark/data |
2.2 前置依赖安装(所有节点)
- JDK 环境(需 1.8+,文档段落:3-248):
bash
yum install -y java-1.8.0-openjdk-devel java -version # 验证版本
- Hadoop 集群(已部署 HDFS 和 YARN,文档段落:3-633):
确保 HDFS 服务正常,Spark 将使用 HDFS 作为分布式存储。 - 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.sh
和slaves
文件内容一致,确保:
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.sh
中HADOOP_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)可进一步学习流处理、机器学习等高级特性及性能调优技巧。
相关文章:

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

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

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 …...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

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

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

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...

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>…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

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

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 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(Direct Memory Access)直接存储器存取 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)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...