大数据Hadoop运维应用实践——Spark与hadoop集群的整合_独立模式下Spark集群的安装部署

大数据Hadoop运维应用实践------Hbase与hadoop的整合_Hbase的配置安装文章浏览阅读62次。本文详细介绍了HBase分布式数据库的配置安装与使用实践。主要内容包括:1. HBase的介绍(是什么?有啥用?优缺点、适用与不适用场景)。2. 版本选型指南:针对不同JDK版本HBase和Hadoop环境提供兼容性矩阵。3. 集群部署实践:包含环境变量配置、JVM参数调优、核心参数(hbase-site.xml)详解,特别强调内存分配(堆内外)、ZK超时、Region分裂等关键配置与高可用配置。最后提供了Ansible自动化批量部署脚本,适合企业级生产环境安装部署HBase参考。https://coffeemilk.blog.csdn.net/article/details/163283293

一、Spark的简介

1.1、Spark是什么

Apache Spark是面向大规模数据处理的统一分析引擎,可用于数据科学,以及单节点机器或集群上的机器学习。主要包含如下五个核心组件:

Spark的5个核心组件
1. Spark Core:底层调度、内存管理、RDD、任务执行(基础内核); 2. Spark SQL:结构化数据处理、ANSI SQL、DataFrame/Dataset API; 3. Structured Streaming:基于 Spark SQL 的批流一体流处理引擎; 4. MLlib:分布式机器学习库(分类、回归、聚类、推荐、特征工程); 5. GraphX:分布式图计算 API 与图算法库。
Spark支持三种运行模式 说明
1、Standalone独立式 Spark 附带的简单集群管理器,可很容易的设置集群。
2、Hadoop YARN整合式 Spark与Hadoop 3 中的资源管理器(Yarn)整合。
3、Kubernetes k8s用于自动化部署、扩展的开源系统以及容器化应用程序的管理。

1.2、Spark有啥用

Spark有啥用
1、批量数据处理(离线 ETL、数据仓库加工、日志清洗);
2、交互式 SQL 分析、即席查询、报表计算(Spark SQL);
3、流数据实时处理(Structured Streaming,物联网、实时业务指标);
4、大规模数据科学探索、海量数据 EDA 分析;
5、分布式机器学习模型训练、预测推理(MLlib);
6、分布式图计算(社交网络、知识图谱、网页链接分析 GraphX);
7、兼容绝大多数存储:HDFS、S3、Hive、Kafka、Cassandra、JDBC 数据库等。

1.3、Spark的优缺点

✅Spark的优点 说明
1、高性能:内存计算,减少磁盘 IO Spark 中间计算结果可缓存在内存,避免 MapReduce 每阶段强制落盘;采用 DAG 执行计划,减少多阶段任务启动开销。
2、统一一套引擎支持批、流、SQL、机器学习、图计算(主要特色) 同一套 API、同一调度引擎实现批流一体,不需要维护多套计算框架。
3、多语言友好 原生支持 Scala、Java、Python (PySpark)、R,降低大数据开发门槛。
4、强大容错机制:RDD 血统(Lineage) 不依赖数据副本,分区丢失时通过记录转换链路重新计算,节省存储开销。
5、极佳扩展性 官方确认大量企业运行数千节点集群,支持 PB 级数据集。
6、生态兼容 原生对接 Hadoop 体系,可读取 HDFS/Hive 数据,兼容主流云对象存储(S3、OBS 等)。
❌Spark的缺点/局限性 说明
1、内存资源消耗巨大 Spark 性能高度依赖内存。若数据集无法全部放入内存,数据会溢写到磁盘(spill),性能大幅下滑。
2、原生没有分布式文件系统 Spark 只是计算引擎,不自带存储,必须依赖外部存储(HDFS/S3 等),不能独立完成存储 + 计算整套链路。
3、Structured Streaming 为微批模型,并非极低延迟原生流引擎 官方定位为增量处理引擎;亚毫秒级超低延迟场景相比原生流引擎存在差距。
4、Shuffle 开销难以规避 Join、groupby、聚合等操作触发 Shuffle,涉及大量网络数据传输与磁盘读写,是作业性能瓶颈,需要人工调优。官方文档多处提到 Shuffle 调优参数
5、调优门槛高 分区数量、内存比例、序列化、并行度、数据倾斜、小文件问题,大量参数需要人工调参,开箱即用性能往往不理想。
6、MLlib 内置算法数量有限 专注经典分布式机器学习算法;深度学习、复杂大模型原生支持弱,通常需要和 TensorFlow/PyTorch 搭配。
7、不擅长超小数据集 启动 Driver/Executor 集群开销大;单机少量数据场景,Spark overhead 高于普通单机脚本。

1.4、Spark的适用与不适用场景

✅Spark的适用场景
1、大规模离线 ETL、数据湖 / 数仓批量加工(TB~PB 级日志、业务数据清洗转换);
2、多轮迭代计算场景:机器学习训练、图算法(PageRank、社区发现); > 迭代计算是 Spark 相比 MapReduce 最大优势,避免反复读写磁盘
3、交互式大数据即时查询(Spark SQL 替代 Hive 做快速 Ad-Hoc 分析);
4、批流一体业务:同一套代码同时支持离线历史数据重跑 + 实时数据流计算(实时大屏、实时指标);
5、海量数据探索分析 EDA、用户画像、风控特征计算;
6、云原生数据湖架构,跨 S3/HDFS 多源异构数据统一处理。
❌Spark的不适用场景 说明
1、极小数据集(GB 以内、单机即可处理) 集群启动开销远大于计算本身,直接使用 Pandas、单机 SQL 更高效。
2、要求亚毫秒级超低延迟纯实时流处理 如高频交易极低延迟风控;优先考虑 Apache Flink 等原生连续流引擎。 > 备注:Structured Streaming 延迟一般百毫秒~秒级,满足绝大多数实时业务,但极致低延迟场景不占优。
3、简单单一轮次轻量任务、极少 IO、无复杂聚合 简单单次文件转换,使用轻量工具(Hive、shell 脚本)运维成本更低。
4、强事务、低延迟在线 OLTP 数据库业务 Spark 是分析引擎,不适合在线业务读写;不能替代 MySQL/PostgreSQL。
5、资源极其受限、集群内存不足 如果硬件内存紧张,大量任务频繁 spill 磁盘,Spark 性能会严重恶化,此时 MapReduce 等磁盘优先框架反而更稳定。
6、仅需要极简独立图数据库查询 图数据库(Neo4j、NebulaGraph)擅长单点查询;GraphX 适合全图大规模分布式离线图挖掘,不适合在线图查询。

1.5、Spark的整体架构

Spark的整体架构组件 说明
1、Cluster Manager Spark的集群管理器,主要负责对整个集群资源的分配与管理。 * Cluster Manager在YARN部署模式下为ResourceManager; * 在Standalone部署模式下为Master。
2、Worker Spark的工作节点。在YARN部署模式下实际由NodeManager替代。Worker节点主要负责以下工作: 1. 将自己的内存、CPU等资源通过注册机制告知Cluster Manager 2. 创建Executor;将资源和任务进一步分配给Executor; 3. 同步资源信息、Executor状态信息给Cluster Manager。
3、Executor Executor是spark任务(task)的执行单元,运行在worker上,实际上它是一组计算资源(cpu核心、memory)的集合。一个worker上的memory、cpu由多个executor共同分摊。同时,Executor 还负责与Worker、Driver的信息同步。
4、Driver 可以理解为Application的驱动程序,Application通过Driver与Cluster Manager、Executor进行通信。Driver可以运行在Application中,也可以由Application提交给Cluster Manager并由Cluster Manager安排在Worker中运行。
5、Application 用户使用Spark提供的API编写的应用程序,Application通过Spark API将进行RDD的转换和DAG的构建,并通过Driver将Application注册到Cluster Manager。

二、独立模式下Spark集群的部署

2.1、独立模式下Spark集群的部署规划

主机名 部署服务 角色
namenodemaster(192.168.1.120) 主Namenode、spark spark master
slave001(192.168.1.70) Datanode、spark spark work1
slave002(192.168.1.151) Datanode、spark spark work2
slave003(192.168.1.169) Datanode、spark spark work3

2.2、下载安装Spark

2.2.1、Spark版本与JDK版本兼容表

✅ 官方正式支持 | ⚠️ 可运行但非官方正式支持 / 实验性 / 已废弃 | ❌ 不支持

Spark 版本分支 JDK7 JDK8 JDK11 JDK17 补充官方说明
0.9.x ~ 1.6.x(1.x 系列) ⚠️ 官方推荐 JDK7;JDK8 在 1.4+ 可启动但未充分测试;无 JDK11 支持
2.0.x ~ 2.3.x ⚠️ Spark 2.0 起 JDK7 标记为 deprecated;正式支持 JDK8;不支持 JDK11+
2.4.x ⚠️ 官方仅正式支持 JDK8;JDK11 社区可运行但存在兼容性问题,无官方保障
3.0.x 官方正式支持 JDK8 / JDK11;不支持 JDK17
3.1.x 官方正式支持 JDK8 / JDK11;不支持 JDK17
3.2.x ⚠️ 官方正式支持 JDK8 / JDK11;JDK17 未列入官方支持清单,社区可运行但无保障
3.3.x 官方正式纳入 JDK17 支持;同时支持 JDK8 / JDK11 / JDK17
3.4.x 官方正式支持 JDK8 / JDK11 / JDK17
3.5.x(最新 3.x 稳定分支) ⚠️ 官方正式支持 JDK8 / JDK11 / JDK17;JDK8 低于 8u371 已标记 Deprecated;下一大版本将移除 JDK8、JDK11
4.0.x+(4.x 系列) 彻底移除 JDK8、JDK11 支持;仅正式支持 JDK17 / JDK21

2.2.2、下载安装Spark

由于现有的Hadoop集群3.4.3版本环境配置的是openjdk11的环境,因此这里下载安装Spark最高可使用的稳定版本就是3.5.9;

bash 复制代码
#下载安装Spark
mkdir -p /data/bigdata/spark
wget https://dlcdn.apache.org/spark/spark-3.5.9/spark-3.5.9-bin-hadoop3.tgz -c -P /data/bigdata/spark
cd /data/bigdata/spark
tar -zxvf spark-3.5.9-bin-hadoop3.tgz
ln -s spark-3.5.9-bin-hadoop3 current

2.3、Spark的配置

Spark配置文件在【/data/bigdata/spark/current/conf】文件夹下,默认配置文件都是以template为后缀的模板文件,需要将模板文件重命名一下。

bash 复制代码
#复制一份需要配置的Spark文件
cd /data/bigdata/spark/current/conf
cp -p spark-env.sh.template spark-env.sh
cp -p spark-defaults.conf.template spark-defaults.conf
cp -p workers.template workers
cp -p log4j2.properties.template log4j2.properties

2.3.0、在集群的每个节点配置环境变量

bash 复制代码
#在集群的每个节点配置环境变量
#修改hadoop用户下.bash_profile文件,末尾添加hbase环境变量,添加内容如下:
#spark env
export SPARK_HOME=/data/bigdata/spark/current
export SPARK_CONF_DIR=/data/bigdata/spark/current/conf
export SPARK_LOG_DIR=/data/spark/logs
export PATH=$PATH:$SPARK_HOME/bin

2.3.1、配置spark-env.sh文件

bash 复制代码
#配置spark-env.sh文件【单节点 4 核 CPU,8G 物理内存】
# 指定JDK根目录
export JAVA_HOME=/opt/openjdk/default

# Hadoop本地库路径(支持Hadoop原生压缩库:snappy/lz4等)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/data/bigdata/hadoop/current/lib/native

# ----------------⚠️ 废弃参数说明 ⚠️----------------
# SPARK_LIBRARY_PATH / SPARK_CLASSPATH 在 Spark 1.x 之后已废弃!
# Spark2.x/3.x不再识别这两个参数,直接删除,保留无效
# export SPARK_LIBRARY_PATH=$SPARK_LIBRARY_PATH
# export SPARK_CLASSPATH=$SPARK_CLASSPATH
# ------------------------------------------------

# Hadoop主目录
export HADOOP_HOME=/data/bigdata/hadoop/current
# Spark读取HDFS、使用YARN时加载hadoop配置文件
export HADOOP_CONF_DIR=/etc/hadoop/conf

# Spark Standalone集群Master节点主机名【需根据服务器名称修改】
export SPARK_MASTER_IP=namenodemaster

# 单节点启动Worker进程数量;官方推荐单机=1,多实例会造成竞争,固定1
export SPARK_WORKER_INSTANCES=1

# 【关键】Worker最大可用内存
# 整机8G,系统预留2G,分配6G给Worker;额外预留少量管理开销,设置4.5G,只能设置整数因此修改为4608m
export SPARK_WORKER_MEMORY=4608m

# 【关键】Worker最大可用CPU核心
# 整机4核,系统预留1核,分配3核给Spark Worker
export SPARK_WORKER_CORES=3

# ==============================================
# 注意区分:
# SPARK_WORKER_CORES:整个Worker能分配给所有Executor总核心上限
# SPARK_EXECUTOR_CORES / SPARK_EXECUTOR_MEMORY 【不建议写在spark-env.sh!】
# 官方规范:Executor资源属于作业参数,推荐在 spark-submit / spark-defaults.conf 指定
# 如果硬要全局默认,下面保留;生产最佳实践:注释掉,提交任务动态控制
# ==============================================
# 每个Executor默认占用CPU核心数【建议核心数与内存匹配,否则会浪费资源】
export SPARK_EXECUTOR_CORES=1
# 每个Executor默认堆内存,1.5g=1536m
export SPARK_EXECUTOR_MEMORY=1536m

# Spark的本地缓存目录【不要使用共享存储(NFS),必须本地磁盘;多目录逗号分隔不要带空格!】
# 提前创建目录,每个节点都要新建目录,权限 755,spark 启动用户具备读写权限
export SPARK_LOCAL_DIRS=/data/sparktmp,/data1/sparktmp

# 日志根目录,自行修改节点磁盘挂载目录
export SPARK_LOG_DIR=/data/spark/logs
bash 复制代码
#创建所需目录与授权
mkdir -p /data/sparktmp /data1/sparktmp
chmod 755 /data/sparktmp /data1/sparktmp
chown -R hadoop:hadoop /data/sparktmp /data1/sparktmp

mkdir -p /data/spark/logs
chmod 755 /data/spark/logs
chown -R hadoop:hadoop /data/spark/logs

2.3.2、配置spark-defaults.conf文件

bash 复制代码
#配置spark-defaults.conf文件
#==================================================================================================
# 一、JVM基础参数(JDK11必须配置,官方文档明确要求,解决Arrow/PySpark反射异常)
#==================================================================================================
spark.driver.extraJavaOptions     -Dio.netty.tryReflectionSetAccessible=true -XX:+UseG1GC
spark.executor.extraJavaOptions   -Dio.netty.tryReflectionSetAccessible=true -XX:+UseG1GC

#==================================================================================================
# 【⚠️ 禁止启用!无需配置】Spark原生libexec目录不需要加入extraClassPath
# 官方说明:extraClassPath仅用于第三方扩展依赖,容易引发Jar冲突
# 如果后续需要HBase/MySQL驱动,统一放置extlib目录再放开
#==================================================================================================
#spark.driver.extraClassPath      /data/bigdata/spark/current/libexec/*
#spark.executor.extraClassPath    /data/bigdata/spark/current/libexec/*

#==================================================================================================
# 二、序列化、压缩(生产标准配置,官方推荐Kryo)
# https://spark.apache.org/docs/3.5.9/tuning.html#serialization
#==================================================================================================
spark.serializer                  org.apache.spark.serializer.KryoSerializer
spark.kryoserializer.buffer.max   512m
spark.kryo.registrationRequired   false

# 全局压缩开启,降低网络IO与磁盘shuffle开销
spark.io.compression.codec        snappy
spark.shuffle.compress            true
spark.shuffle.spill.compress      true

#==================================================================================================
# 三、Shuffle 参数优化
#==================================================================================================
spark.shuffle.file.buffer         32k
spark.reducer.maxSizeInFlight     48m
spark.file.transferTo.enabled     true

#==================================================================================================
# 四、本地临时目录【推荐启用,替换系统默认/tmp】
# 注意:逗号分隔路径不能带有空格;所有节点预先创建目录
# 优先级提示:spark-env.sh 中 SPARK_LOCAL_DIRS 会覆盖该配置,不要两处同时设置
#==================================================================================================
#spark.local.dirs                  /data/sparktmp,/data1/sparktmp

#==================================================================================================
# 四、内存模型
# 本机8G低配机器,关闭堆外内存,防止OOM;大内存集群再开启
# 官方不建议随意修改 spark.memory.fraction 默认值
#==================================================================================================
spark.memory.offHeap.enabled      false
#spark.memory.offHeap.size        1g

#==================================================================================================
# 五、Spark SQL 全局基线(离线ETL、交互式查询通用)
# AQE自适应执行 Spark3.x 默认开启,强烈建议保留
# https://spark.apache.org/docs/3.5.9/sql-performance-tuning.html#adaptive-query-execution
#==================================================================================================
spark.sql.adaptive.enabled                    true
spark.sql.adaptive.coalescePartitions.enabled true
spark.sql.adaptive.skewJoin.enabled           true

# 默认shuffle分区数,任务可通过 --conf 动态覆盖
spark.sql.shuffle.partitions                  24

# 列存优化
spark.sql.parquet.compression.codec           snappy
spark.sql.parquet.enableVectorizedReader      true

# 广播join超时时间
spark.sql.broadcastTimeout                    600

#==================================================================================================
# 六、任务调度 & 容错参数
#==================================================================================================
spark.task.maxFailures            4
spark.stage.maxConsecutiveAttempts 4
spark.locality.wait               3s

#==================================================================================================
# 七、Standalone 独立集群专属配置【必须】
#==================================================================================================
# 默认Master地址,spark-submit可以省略 --master
spark.master                      spark://namenodemaster:7077

# Driver返回结果上限,避免大结果集撑爆Driver
spark.driver.maxResultSize        2g

#==================================================================================================
# 八、事件日志【运维必备,搭配HistoryServer】
# 注意:提前在HDFS创建目录 hdfs dfs -mkdir -p /spark/eventlog
# https://spark.apache.org/docs/3.5.9/monitoring.html#viewing-after-the-fact
#==================================================================================================
spark.eventLog.enabled            true
spark.eventLog.dir                hdfs://namenodemaster:9000/spark/eventlog
spark.eventLog.cleanup.enabled    true
spark.eventLog.maxAge             604800
spark.eventLog.cleanup.interval   86400

#==================================================================================================
# 九、HDFS原生支持优化(依赖hadoop native库,你spark-env已配置LD_LIBRARY_PATH)
#==================================================================================================
spark.hadoop.dfs.client.read.shortcircuit    true
spark.hadoop.fs.file.impl.disable.cache      true

#==================================================================================================
# 十、【禁止全局启用】Executor资源配置(官方规范)
# 所有任务统一资源会导致资源浪费或不足,提交任务动态指定示例:
# spark-submit --executor-cores 1 --executor-memory 1500m
#==================================================================================================
#spark.executor.cores              1
#spark.executor.memory             1.5g

#==================================================================================================
# 十一、调试参数【生产注释关闭,故障排查按需打开】
#==================================================================================================
#spark.ui.port                    4040
#spark.ui.killEnabled             true

2.3.3、配置workers文件

bash 复制代码
#配置workers文件【添加上规划的spark work 角色主机名称】
slave001
slave002
slave003

2.3.4、配置log4j2.properties文件

bash 复制代码
#配置log4j2.properties文件
#只需要将【log4j2.properties】文件中的【rootLogger.level = info】修改为【rootLogger.level = warn】

2.4、批量部署Spark集群环境

bash 复制代码
- name: 批量部署Spark独立模式集群环境
  hosts: spark
  remote_user: root
  gather_facts: false
  # 全局变量定义
  vars:
    AnsibleDir: /etc/ansible
    BigdataDir: /data/bigdata
  # 引用角色目录(保留原有配置)
  roles:
    - /etc/ansible/roles

  tasks:
    - name: 1. 创建Spark临时目录 /data/sparktmp、/data1/sparktmp 并授权
      file:
        path: "{{ item }}"
        state: directory
        mode: '0755'
        owner: hadoop
        group: hadoop
        recurse: yes
      with_items:
        - /data/sparktmp
        - /data1/sparktmp

    - name: 2. 创建Spark日志目录 /data/spark/logs 并授权
      file:
        path: /data/spark/logs
        state: directory
        mode: '0755'
        owner: hadoop
        group: hadoop
        recurse: yes

    - name: 3. 推送并解压Spark安装包至大数据根目录
      unarchive:
        src: "{{ AnsibleDir }}/roles/files/spark.tar.gz"
        dest: "{{ BigdataDir }}"
        remote_src: no
        creates: "{{ BigdataDir }}/spark"  # 已解压则跳过,提升幂等性

    - name: 4. 递归修改Spark目录归属hadoop用户组
      file:
        path: "{{ BigdataDir }}/spark"
        owner: hadoop
        group: hadoop
        recurse: yes
        state: directory

    - name: 5. 向hadoop用户.bash_profile写入Spark全套环境变量
      lineinfile:
        dest: /home/hadoop/.bash_profile
        line: "{{ item.value }}"
        state: present
        insertafter: EOF
        create: yes
        backrefs: no
      with_items:
        - {value: "#spark env"}
        - {value: "export SPARK_HOME=/data/bigdata/spark/current"}
        - {value: "export SPARK_CONF_DIR=/data/bigdata/spark/current/conf"}
        - {value: "export SPARK_LOG_DIR=/data/spark/logs"}
        - {value: "export PATH=$PATH:$SPARK_HOME/bin"}

    - name: 6. 重载hadoop用户环境变量(当前会话生效)
      shell: source /home/hadoop/.bash_profile
      become: true
      become_user: hadoop
      args:
        executable: /bin/bash

三、启动并测试Spark集群

3.1、启动Spark集群

要启动Spark集群,需要首先保证hadoop的HDFS服务正常运行。

bash 复制代码
#启动Spark集群

#1-启动spark的master节点【仅在规划的namenodemaster节点操作】
su - hadoop
/data/bigdata/spark/current/sbin/start-master.sh

#1.1-验证spark的master节点是否启动成功
#执行jps可以看到【Master】则表示成功【成功后可在浏览器访问IP:8080】
jps
ps -ef | grep Master
netstat -antlp | grep -E '7077|8080'



#2-启动spark的work节点【仅在规划的slave001、slave002、slave003节点操作】
su - hadoop
/data/bigdata/spark/current/sbin/start-worker.sh  spark://namenodemaster:7077

#2.1-验证spark的work节点是否启动成功
#执行jps可以看到【Worker】则表示成功【成功后可在浏览器访问IP:8081】
jps
ps -ef | grep Worker
netstat -antlp | grep 8081

3.2、配置启动Spark集群的服务

bash 复制代码
#配置启动Spark集群的服务
#1-配置spark的master节点服务【仅在规划的namenodemaster节点操作】
cat >/etc/systemd/system/spark-master.service<<'EOF'
[Unit]
Description=Apache Spark Master Service
After=network.target
StartLimitBurst=5
StartLimitIntervalSec=60

[Service]
Type=forking
User=hadoop
Group=hadoop
WorkingDirectory=/data/bigdata/spark/current

Environment=JAVA_HOME=/opt/openjdk/default
# Spark读写HDFS依赖Hadoop环境
Environment=HADOOP_HOME=/data/bigdata/hadoop/current
Environment=HADOOP_CONF_DIR=/etc/hadoop/conf
# 对接HBase组件
Environment=HBASE_HOME=/data/bigdata/hbase/current
Environment=HBASE_CONF_DIR=/data/bigdata/hbase/current/conf
# Spark自身核心环境
Environment=SPARK_HOME=/data/bigdata/spark/current
Environment=SPARK_CONF_DIR=/data/bigdata/spark/current/conf
Environment=SPARK_LOG_DIR=/data/spark/logs
# 合并PATH,补齐所有二进制路径
Environment=PATH=/usr/bin:/bin:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${HBASE_HOME}/bin:${SPARK_HOME}/bin

ExecStart=/data/bigdata/spark/current/sbin/start-master.sh
ExecStop=/data/bigdata/spark/current/sbin/stop-master.sh

# 生产最小必要自愈配置
Restart=on-failure
RestartSec=10

# 日志交给systemd默认journal即可,无需额外配置
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF


#2-启动spark的master节点服务并开机自启
systemctl daemon-reload
systemctl start spark-master
systemctl status spark-master
systemctl enable spark-master
# 实时查看master日志
journalctl -u spark-master -f

#3-验证spark的master节点服务是否正常
jps
ps -ef | grep Master
netstat -antlp | grep -E '7077|8080'
bash 复制代码
#配置启动Spark集群的服务
#1-配置spark的work节点服务【仅在规划的slave001、slave002、slave003节点操作】
cat >/etc/systemd/system/spark-worker.service<<'EOF'
[Unit]
Description=Apache Spark Worker Service
After=network.target
# 重启限流配置迁移至Unit段
StartLimitBurst=5
StartLimitIntervalSec=60

[Service]
Type=forking
User=hadoop
Group=hadoop
WorkingDirectory=/data/bigdata/spark/current

# 基础运行JDK
Environment=JAVA_HOME=/opt/openjdk/default
# HDFS访问依赖
Environment=HADOOP_HOME=/data/bigdata/hadoop/current
Environment=HADOOP_CONF_DIR=/etc/hadoop/conf
# HBase依赖
Environment=HBASE_HOME=/data/bigdata/hbase/current
Environment=HBASE_CONF_DIR=/data/bigdata/hbase/current/conf
# Spark核心环境变量
Environment=SPARK_HOME=/data/bigdata/spark/current
Environment=SPARK_CONF_DIR=/data/bigdata/spark/current/conf
Environment=SPARK_LOG_DIR=/data/spark/logs
# 固化系统基础PATH
Environment=PATH=/usr/bin:/bin:${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${HBASE_HOME}/bin:${SPARK_HOME}/bin

ExecStart=/data/bigdata/spark/current/sbin/start-worker.sh spark://namenodemaster:7077
ExecStop=/data/bigdata/spark/current/sbin/stop-worker.sh

# 故障自动重启策略
Restart=on-failure
RestartSec=10

# 日志交由systemd journal管理
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF


#2-启动spark的work节点服务并开机自启
systemctl daemon-reload
systemctl start spark-worker
systemctl status spark-worker
systemctl enable spark-worker
# 实时查看worker运行日志
journalctl -u spark-worker -f

#3-验证spark的work节点服务是否正常
jps
ps -ef | grep Worker
netstat -antlp | grep 8081

3.3、spark-shell与spark-submit的使用

3.3.1、spark-shell的使用

使用spark-shell用两种模式,分别是【本地模式】和【集群模式】。

bash 复制代码
#spark-shell的使用(任意spark worker节点操作)
#1-【spark-shell本地模式】的使用方法
su - hadoop
spark-shell --master local

#1.1-将本地文件导入到spark中【注意:读取的路径前面需要添加:file://】
var textfile=sc.textFile("file:///data/spark/logs/spark-hadoop-org.apache.spark.deploy.worker.Worker-1-slave001.out.1");
#1.2-简单统计这个文件有多少行
textfile.count();
#最后按下Ctrl+C退出

注意1:当使用【spark-shell --master local】命令读取时若报错"Failed to initialize fileystem hdfs://namenodemaster:9000/spark/eventlog: org.apache.hadoop.HadoopIllegalArgumentException: The short-circuit local reads feature is enabled but dfs.domain.socket.path is not set."是表示(hdfs-site.xml 开启了短回路本地读取(dfs.client.read.shortcircuit=true),但是未配置本地 socket 文件路径 dfs.domain.socket.path,HDFS 客户端初始化直接抛出异常)。

bash 复制代码
#解决当使用【spark-shell --master local】命令读取时报错"hdfs-site.xml 开启了短回路本地读取(dfs.client.read.shortcircuit=true),但是未配置本地 socket 文件路径dfs.domain.socket.path`,HDFS 客户端初始化直接抛出异常"问题
#1-使用自定义短回路路径(即:socket 文件创建在 /data/hadoop/hdfs)
mkdir -p /data/hadoop/hdfs
chown -R hadoop:hadoop /data/hadoop/hdfs
chmod 755 /data/hadoop/hdfs


#2-给hadoop的所有【datanode】节点(仅在规划的slave001、slave002、slave003节点操作)【hdfs-site.xml】文件追加HDFS短回路读取配置
cd /etc/hadoop/conf
vi hdfs-site.xml 
#【hdfs-site.xml】文件添加的短回路配置内容如下:
    <!-- 1. DataNode 监听的本地域套接字路径(核心) -->
    <property>
        <name>dfs.datanode.domain.socket.path</name>
        <value>/data/hadoop/hdfs/dn_socket</value>
    </property>

    <!-- 兼容旧参数!修复客户端启动异常【必须加】 -->
    <property>
        <name>dfs.domain.socket.path</name>
        <value>/data/hadoop/hdfs/dn_socket</value>
    </property>

    <!-- 2. HDFS客户端短回路读取连接Socket路径,必须和上面保持一致 -->
    <property>
        <name>dfs.client.short.circuit.replica.reader.socket.path</name>
        <value>/data/hadoop/hdfs/dn_socket</value>
    </property>

    <!-- 3. 开启短回路读取总开关 -->
    <property>
        <name>dfs.client.read.shortcircuit</name>
        <value>true</value>
    </property>

    <!-- 4. 开启本地副本短路访问(必须) -->
    <property>
        <name>dfs.client.read.shortcircuit.skip.checksum</name>
        <value>false</value>
    </property>

    <!-- 5. 短回路缓存块追踪(性能优化) -->
    <property>
        <name>dfs.client.read.shortcircuit.streams.cache.size</name>
        <value>256</value>
    </property>
    <property>
        <name>dfs.client.read.shortcircuit.streams.cache.expiry.ms</name>
        <value>600000</value>
    </property>

    <!-- 6. 允许访问socket的用户-->
    <property>
        <name>dfs.datanode.domain.socket.allowed.users</name>
        <value>hadoop,yarn,spark,hdfs</value>
    </property>

    <!-- 7. 开启短回路权限检查 -->
    <property>
        <name>dfs.client.read.shortcircuit.access.check.enabled</name>
        <value>true</value>
    </property>



#3-滚动重启datanode服务
systemctl stop hadoop-hdfs-datanode
systemctl start hadoop-hdfs-datanode
systemctl status hadoop-hdfs-datanode

#4-验证新增的短回路配置是否加载成功
su - hadoop
hdfs getconf -confkey dfs.datanode.domain.socket.path
ls -l /data/hadoop/hdfs/dn_socket
tail -f /data/bigdata/hadoop/logs/hadoop-hadoop-datanode-*.log

注意2:当使用【spark-shell --master local】命令读取时报错"ERROR SparkContext: Error initializing SparkContext.java.io.FileNotFoundException: File does not exist: hdfs://namenodemaster:9000/spark/eventlog"是由于(Spark 开启了事件日志记录 spark.eventLog.enabled=true,配置的日志存储路径 /spark/eventlog 在 HDFS 上不存在,Spark 启动时自动校验目录,直接初始化失败)。

bash 复制代码
#解决"Spark 开启了事件日志记录 spark.eventLog.enabled=true,配置的日志存储路径 /spark/eventlog 在 HDFS 上不存在"问题
su - hadoop
hadoop fs -mkdir -p /spark/eventlog
hadoop fs -ls /
#【spark-shell本地模式】的使用方法
spark-shell --master local
bash 复制代码
#spark-shell的使用(任意spark worker节点操作)
#1-【spark-shell集群模式】的使用方法
su - hadoop
spark-shell --master spark://namenodemaster:7077
#1.1-只能读取HDFS上的内容
var textfile=sc.textFile("/spark/eventlog/local-1785396106091");
#1.2-简单统计内容的行数
textfile.count();

3.3.2、spark-submit的使用

Spark-Submit用来提交在IDEA中编写并且打包成jar的包到集群中运行。一般在生产环境使用这种方式。

bash 复制代码
#spark-submit的使用
#使用spark自带的例子演示
su - hadoop
#示例1【基于客户端的集群模式】(spark自带的jar包演示计算圆周率)
#--executor-memory:指定每个executor的内存,此值可在spark-env.sh中进行配置,也可在执行spark任务时指定,如果不指定默认读取spark-env.sh中的设置。
#--total-executor-cores:指定运行此任务需要所有executor总共使用的cpu核数。
spark-submit --executor-memory 1g --total-executor-cores 3 --class org.apache.spark.examples.SparkPi --master spark://namenodemaster:7077 /data/bigdata/spark/current/examples/jars/spark-examples_2.12-3.5.9.jar

#示例2【完全集群模式】(spark自带的jar包演示计算圆周率)
spark-submit --master spark://namenodemaster:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi /data/bigdata/spark/current/examples/jars/spark-examples_2.12-3.5.9.jar
相关推荐
奥莱维15 小时前
酒店客房智能控制如何提升睡眠与入住体验
大数据·人工智能
greenbbLV16 小时前
中小公司积分商城选型:SaaS与私有化优劣对比分析
大数据·运维·人工智能
希艾席帝恩16 小时前
数字孪生赋能智慧物流:物流行业转型升级新路径
大数据·人工智能·低代码·ai·数字化转型
阿里云大数据AI技术17 小时前
EMR Serverless Spark 基于 MinHash-LSH 实现 PB 级文本语义去重 4 倍加速
大数据·人工智能·spark
阿里云大数据AI技术17 小时前
阿里云 Hologres 登顶 TPC-H 3TB 基准测试榜单,性价比第一
大数据·人工智能
万岳软件开发小城18 小时前
同城跑腿系统源码功能开发详解:用户端、骑手端、管理后台有哪些核心模块?
大数据·跑腿小程序开发·同城跑腿系统源码·跑腿app开发·跑腿平台搭建
2603_9547083118 小时前
什么是微能网?新型电力系统下园区能源转型新范式
大数据·人工智能·物联网·能源
智圣新创0118 小时前
存量校园信息化效能跃升 智圣新创数据驱动智慧校园升级的通用落地路径
大数据·人工智能
BioRunYiXue18 小时前
技术干货 | LiP-MS全流程解析:从实验设计到数据分析
大数据·前端·javascript·人工智能·算法·数据挖掘·数据分析
林澈在路上18 小时前
2026 AI 写歌 APP 推荐:国产软件哪个好用实测
大数据·人工智能·aigc·音视频·音频