大数据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;
#下载安装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为后缀的模板文件,需要将模板文件重命名一下。
#复制一份需要配置的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、在集群的每个节点配置环境变量
#在集群的每个节点配置环境变量
#修改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文件
#配置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
#创建所需目录与授权
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文件
#配置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文件
#配置workers文件【添加上规划的spark work 角色主机名称】
slave001
slave002
slave003
2.3.4、配置log4j2.properties文件
#配置log4j2.properties文件
#只需要将【log4j2.properties】文件中的【rootLogger.level = info】修改为【rootLogger.level = warn】
2.4、批量部署Spark集群环境
- 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服务正常运行。
#启动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集群的服务
#配置启动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'
#配置启动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用两种模式,分别是【本地模式】和【集群模式】。
#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 客户端初始化直接抛出异常)。
#解决当使用【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 启动时自动校验目录,直接初始化失败)。
#解决"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
#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的包到集群中运行。一般在生产环境使用这种方式。
#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