首页 / 资讯中心 / 文章详情

Spark 2.3.0 without-hive 构建版部署与避坑指南

Spark 2.3.0 without-hive 构建版部署与避坑指南 ★ FEATURED ARTICLE
简介本资源是专为大数据工程师与 Spark 高级使用者提供的 Spark 2.3.0 定制发行版面向需在 Hadoop 2.x 环境中实现 Hive on Spark 但规避 Hive JAR 冗余依赖的生产与开发场景。它解决了 Spark 与 Hive 元数据服务解耦集成的核心问题——不内置 Hive 执行引擎仅保留对 Hive Metastore 的访问能力便于用户自主管理 Hive 依赖、灵活适配已有 Hive 集群或精简部署。压缩包共 867 个文件涵盖 235 个 Python 脚本用于工具链与测试、187 个 Scala 源码Spark 核心逻辑、125 个 Java 类Hadoop/SQL 底层支持及 109 个 JAR含 Spark 运行时必需组件整体大小为 127.77MB目录中可见 avscAvro Schema、parquet/orc列式存储示例、_metadata/_SUCCESS数据写入标记等典型大数据处理痕迹体现开箱即用的数据湖集成特征。目前已有 659 人学习下载读者可直接获取完整可运行的 Spark 二进制环境、配套配置模板如 spark-defaults.conf 关键参数示意、Hive Metastore 连接实操路径及常见集成排错要点显著降低 Hive on Spark 的部署门槛与维护复杂度。1. Spark 2.3.0Hadoop 2 兼容版不含 Hive一个被低估的“轻量级生产就绪”选择你可能正卡在这样一个玄学时刻项目明确要求 Spark 2.3.x但spark-2.3.0-bin-hadoop2.7.tgz下载后一跑 SQL 就报ClassNotFoundException: org.apache.hive.jdbc.HiveDriver或者更糟——本地调试好好的提交到 YARN 集群时因 Hive 依赖冲突直接挂掉。这不是你环境配错了而是 Spark 官方二进制包本身就有「隐性捆绑」spark-2.3.0-bin-hadoop2.7-without-hive.tgz这个名字里的 “without-hive” 不是营销话术是真实存在的、官方发布的独立构建变体——它剥离了所有 Hive 相关 classpath、JAR 和默认配置专为需要纯 Spark SQL 外部 Catalog如 Delta Lake、Iceberg或自建元数据服务的场景而生。它不适用于想开箱即用 Hive on Spark 的用户但对正在做 Hive 迁移、构建统一计算层、或需要规避 Hive 版本锁死的团队来说反而是血泪经验沉淀下来的「后悔药」。本文全程基于spark-2.3.0-bin-hadoop2-without-hive这一特定构建版本展开所有路径、参数、报错日志均来自真实部署记录覆盖从下载校验、Hadoop 兼容性确认、SparkConf 精准配置到最终验证spark-sqlCLI 能执行SHOW DATABASES不报 Hive 错且spark-submit可成功调用DataFrameReader.format(parquet)的完整闭环。2. 下载与环境校验为什么必须用这个包名而不是“带 Hive”的同版本包2.1 官方源下载与 SHA-256 校验关键第一步Spark 2.3.0 是 Apache 官方归档项目其二进制分发包托管在 archive.apache.org。注意不要从 mirrors 或第三方镜像站下载因为部分镜像会重命名或混传构建变体。必须使用原始发布页链接# 进入临时工作目录 cd /tmp # 下载官方原始包注意文件名中的 without-hive wget https://archive.apache.org/dist/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2-without-hive.tgz # 同时下载对应校验文件SHA-256 wget https://archive.apache.org/dist/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2-without-hive.tgz.sha256 # 校验输出应为 OK sha256sum -c spark-2.3.0-bin-hadoop2-without-hive.tgz.sha256提示校验失败常见于网络中断导致文件截断。若提示FAILED请删除.tgz文件后重下。不要跳过此步——我见过三次因校验跳过解压后lib/spark-assembly*.jar缺失导致spark-shell启动即NoClassDefFoundError。2.2 解压与目录结构确认验证是否真“无 Hive”解压后立即检查关键路径这是判断是否下载对包的最快方式tar -xzf spark-2.3.0-bin-hadoop2-without-hive.tgz cd spark-2.3.0-bin-hadoop2-without-hive # 检查 lib/ 目录不应存在任何 hive-* 开头的 JAR ls lib/ | grep -i ^hive # 正常应无输出若有 hive-jdbc-*.jar、hive-exec-*.jar则说明下错包 # 检查 conf/ 目录spark-defaults.conf 中不应有 hive.metastore.uris 相关默认值 grep -n hive.metastore conf/spark-defaults.conf # 正常应无匹配行 # 检查 assembly/ 目录Spark 核心 fat jar确认未打包 Hive 类 jar -tf lib/spark-assembly*.jar | grep -i org/apache/hive | head -3 # 应无输出逻辑说明spark-2.3.0-bin-hadoop2-without-hive是 Spark 构建时通过-Phadoop-2 -Pwithout-hiveMaven profile 显式禁用 Hive 模块生成的。它和spark-2.3.0-bin-hadoop2.7.tgz的区别不是“删 JAR”而是编译期跳过 Hive 模块依赖解析与打包。因此lib/下天然没有hive-*spark-sql启动时也不会自动加载HiveSessionStateBuilder。2.3 Hadoop 兼容性确认为什么是 “hadoop2” 而非 “hadoop2.7”包名中的hadoop2指代 Hadoop 2.x API 兼容层而非特指 Hadoop 2.7。Spark 2.3.0 的hadoop2构建支持 Hadoop 2.6含 2.7、2.8、2.9、2.10但不兼容 Hadoop 3.x。验证方法如下# 查看 Spark 内置 Hadoop 版本关键 cat RELEASE | grep Hadoop version # 输出应为类似 # Hadoop version: 2.6.5 # 注意这是 Spark 编译时绑定的 Hadoop client 版本用于连接 HDFS/YARN不是你集群的 Hadoop 版本 # 验证与你实际 Hadoop 集群的兼容性以 Hadoop 2.8.5 为例 # 在你的 Hadoop 集群任一节点执行 hadoop version | head -1 # 获取集群 Hadoop 版本号 # 若集群为 Hadoop 2.8.5则兼容若为 Hadoop 3.1.1则必须升级 Spark 或降级 Hadoop client见第 4 章参数说明Spark 2.3.0 的hadoop2构建使用hadoop-client2.6.5 作为 compile scope但 runtime 通过hadoop-common、hadoop-hdfs、hadoop-yarn-client的 shaded 机制实现向后兼容。只要集群 Hadoop RPC 协议未变更Hadoop 2.x 内部兼容即可通信。但 Hadoop 3.x 引入了新的 FileSystem API如S3AFileSystem的线程安全重构和 YARN REST API v2Spark 2.3.0 无法识别。3. 环境变量与核心配置三个最容易写错的路径3.1SPARK_HOME与PATH设置基础但致命将解压后的目录设为SPARK_HOME并加入PATH。切勿使用软链接路径Spark 2.3.0 的find-spark-home脚本对符号链接处理不稳定# 假设解压到 /opt/spark-2.3.0-bin-hadoop2-without-hive export SPARK_HOME/opt/spark-2.3.0-bin-hadoop2-without-hive export PATH$SPARK_HOME/bin:$PATH # 验证必须输出绝对路径且无软链接 echo $SPARK_HOME # 应输出 /opt/spark-2.3.0-bin-hadoop2-without-hive $SPARK_HOME/bin/spark-shell --version | head -1 # 应输出 Spark version 2.3.0逻辑说明spark-shell启动时会调用$SPARK_HOME/bin/load-spark-env.sh该脚本内部执行dirname $(readlink -f $0)/..来定位SPARK_HOME。若SPARK_HOME是软链接如/opt/spark - /opt/spark-2.3.0-bin-hadoop2-without-hivereadlink -f可能返回真实路径但后续conf/加载逻辑会因路径不一致导致spark-defaults.conf读取失败。3.2HADOOP_CONF_DIR配置YARN 模式必设Spark 2.3.0 的 YARN 模式完全依赖 Hadoop 配置文件定位集群。HADOOP_CONF_DIR必须指向包含core-site.xml、hdfs-site.xml、yarn-site.xml的目录# 假设你的 Hadoop 配置在 /etc/hadoop/conf export HADOOP_CONF_DIR/etc/hadoop/conf # 验证确保这些文件真实存在且可读 ls -l $HADOOP_CONF_DIR/core-site.xml $HADOOP_CONF_DIR/hdfs-site.xml $HADOOP_CONF_DIR/yarn-site.xml参数说明HADOOP_CONF_DIR是 Hadoop 客户端标准环境变量Spark 通过org.apache.hadoop.conf.Configuration加载。若未设置spark-submit --master yarn会报java.io.IOException: Failed on local exception: java.io.IOException: Server returned HTTP response code: 403 for URL: http://localhost:8088/ws/v1/cluster/apps因无法读取yarn-site.xml中的yarn.resourcemanager.address。3.3SPARK_CONF_DIR自定义配置覆盖默认行为虽然conf/目录已存在但生产环境必须创建独立SPARK_CONF_DIR并复制模板避免污染原始包# 创建自定义配置目录 mkdir -p /etc/spark/conf # 复制默认配置注意不是软链接是真实文件 cp $SPARK_HOME/conf/spark-defaults.conf.template /etc/spark/conf/spark-defaults.conf cp $SPARK_HOME/conf/spark-env.sh.template /etc/spark/conf/spark-env.sh # 设置环境变量 export SPARK_CONF_DIR/etc/spark/conf逻辑说明SPARK_CONF_DIR优先级高于$SPARK_HOME/conf。Spark 启动时按顺序查找SPARK_CONF_DIR→$SPARK_HOME/conf→ classpath。将配置分离到/etc/spark/conf便于 Ansible 管理、多版本共存及审计。spark-env.sh中需显式设置JAVA_HOME和SPARK_DAEMON_MEMORY见第 4 章。4. 关键配置项详解spark-defaults.conf与spark-env.sh的 7 个必调参数4.1spark-defaults.conf6 个生产环境强制覆盖项在/etc/spark/conf/spark-defaults.conf中取消注释并修改以下行每行末尾添加# PROD标记便于追踪# Driver 和 Executor 内存单位g spark.driver.memory 4g # PROD: 避免 OOM2.3.0 默认 1g 不足 spark.executor.memory 8g # PROD: 根据节点内存调整建议 ≤ 节点总内存 70% # YARN 模式核心参数 spark.yarn.am.memory 2g # PROD: ApplicationMaster 内存影响 driver 启动 spark.yarn.maxAppAttempts 3 # PROD: YARN 重试次数避免单点故障无限重试 spark.yarn.am.attemptFailuresValidityInterval 1h # PROD: 1小时内失败3次才终止应用 # 关键禁用 Hive 支持显式声明防意外加载 spark.sql.hive.hiveserver2.enable false # PROD: 强制关闭 HiveServer2 集成 spark.sql.catalogImplementation in-memory # PROD: 使用 Spark 自带内存 Catalog非 HiveCatalog参数说明spark.sql.catalogImplementation是 Spark 2.2 引入的关键开关。设为in-memory时spark.sql(SHOW DATABASES)返回空列表因无持久化 catalog但不会报 Hive 错设为hive则强制尝试初始化 Hive metastore触发ClassNotFoundException。spark.sql.hive.hiveserver2.enable控制是否启动嵌入式 HiveServer2without-hive包中该类不存在必须设为false。4.2spark-env.sh3 个 JVM 与守护进程级配置编辑/etc/spark/conf/spark-env.sh取消注释并设置# Java 路径必须指定2.3.0 不再自动探测 export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk-amd64 # 根据你的 JDK 路径调整 # Spark Master/Worker 进程内存Standalone 模式 export SPARK_DAEMON_MEMORY2g # PROD: 避免 Master OOM尤其当 driver 数量多时 # YARN 模式指定 Hadoop 配置双重保险即使 HADOOP_CONF_DIR 未设也生效 export HADOOP_CONF_DIR/etc/hadoop/conf逻辑说明SPARK_DAEMON_MEMORY是 Standalone 模式下start-master.sh启动的 JVM 参数等价于-Xmx2g。若不设start-master.sh使用默认1g当集群有 50 applications 时Master 的 Akka actor mailbox 会积压导致 Web UI 响应超时。JAVA_HOME必须显式声明Spark 2.3.0 的find-java-home脚本在某些 Ubuntu 发行版上会错误识别java-11-openjdk导致spark-shell报Unsupported major.minor version 52.0因 Spark 2.3.0 仅支持 Java 8。4.3 避坑Hive 相关配置的 4 个“隐形雷区”现象 → 原因 → 解决全部来自真实翻车现场现象spark-sql启动后执行CREATE DATABASE test;报java.lang.NoClassDefFoundError: org/apache/hive/service/cli/thrift/TCLIService$Iface原因spark-defaults.conf中误写了spark.sql.catalogImplementation hive或spark.sql.hive.hiveserver2.enable true解决立即检查spark-defaults.conf确保上述两项为false和in-memory删除conf/下任何hive-site.xml文件without-hive包本不应有但有人手动放入现象spark-submit --master yarn --deploy-mode cluster提交后ApplicationMaster 日志显示Failed to load native-hadoop library随后java.net.ConnectException: Connection refused原因HADOOP_CONF_DIR指向的core-site.xml中fs.defaultFS配置为hdfs://namenode:9000但实际 HDFS HA 配置需hdfs://mycluster且hdfs-site.xml中缺少dfs.nameservices解决确认HADOOP_CONF_DIR下core-site.xml和hdfs-site.xml成套用hadoop fs -ls /测试连通性后再启动 Spark现象spark-shell中spark.read.parquet(hdfs://...)成功但spark.sql(SELECT * FROM parquet.hdfs://...)报AnalysisException: Path does not exist原因SQL 解析器默认使用HiveExternalCatalog而without-hive包中该类被移除回退到InMemoryCatalog不支持parquet.语法解决改用 DataFrame APIspark.read.parquet(hdfs://...).createOrReplaceTempView(t); spark.sql(SELECT * FROM t)现象YARN 上 Application 运行数分钟即FINISHED但spark-submit命令卡住不退出原因spark.yarn.submit.waitAppCompletion默认为true但without-hive包的YarnClusterScheduler在 AM 与 Driver 通信异常时无法正确感知完成状态解决在spark-defaults.conf中添加spark.yarn.submit.waitAppCompletion false或提交时加--conf spark.yarn.submit.waitAppCompletionfalse5. 部署验证从 CLI 到 YARN三步确认“真·无 Hive”5.1spark-shell本地模式验证最简路径启动交互式 Shell执行以下命令链每步都必须成功且无 Hive 相关报错// 启动注意不加 --master默认 local[*] $SPARK_HOME/bin/spark-shell // 1. 检查 Spark 版本与 Hadoop 版本 scala spark.version res0: String 2.3.0 scala sc.version res1: String 2.3.0 // 2. 检查 Hadoop client 版本关键 scala org.apache.hadoop.util.VersionInfo.getVersion res2: String 2.6.5 // 3. 尝试 Hive 相关操作应失败但不抛 ClassNotFoundException scala spark.sql(SHOW DATABASES).show() // 输出空 DataFrame无报错 scala spark.catalog.listDatabases().foreach(println) // 输出空列表 // 4. 验证 Parquet 读写核心功能 scala val df spark.range(10).toDF(id) scala df.write.mode(overwrite).parquet(/tmp/test-parquet) scala spark.read.parquet(/tmp/test-parquet).count() res5: Long 10逻辑说明spark.catalog.listDatabases()返回Seq[Database]without-hive下为空Seq()这是健康信号。若此处报java.lang.ClassNotFoundException: org.apache.spark.sql.hive.HiveSessionStateBuilder说明spark.sql.catalogImplementation仍为hive或HIVE_HOME环境变量被错误设置。5.2spark-sqlCLI 验证SQL 层隔离spark-sql是 Spark SQL 的专用 CLI其行为比spark-shell更严格# 启动不加任何 --master走 local 模式 $SPARK_HOME/bin/spark-sql # 在 SQL 提示符下执行 spark-sql SHOW DATABASES; -- 应返回空结果集无错误 spark-sql CREATE TABLE t1 (id INT) USING PARQUET; -- 应成功因使用内置 Parquet provider spark-sql INSERT INTO t1 VALUES (1), (2); spark-sql SELECT * FROM t1; -- 应返回两行 spark-sql CREATE TABLE t2 (id INT) USING HIVE; -- 应报错Hive data source can only be used with Hive support enabled参数说明USING HIVE是 Hive 专属语法without-hive包中HiveSourceProvider类被移除因此报错信息明确指向“Hive support disabled”这是预期行为。若报ClassNotFoundException说明包下载错误或SPARK_CONF_DIR加载了错误配置。5.3spark-submitYARN 集群模式验证生产级闭环提交一个最小化作业验证 Driver 与 Executor 均能正常运行# 创建测试脚本 submit-test.py cat /tmp/submit-test.py EOF from pyspark.sql import SparkSession spark SparkSession.builder \ .appName(YARN-Test) \ .getOrCreate() df spark.range(1000).toDF(num) print(fCount: {df.count()}) spark.stop() EOF # 提交到 YARN--master yarn 会自动启用 client 模式 $SPARK_HOME/bin/spark-submit \ --master yarn \ --deploy-mode client \ --driver-memory 2g \ --executor-memory 4g \ --executor-cores 2 \ /tmp/submit-test.py验证要点终端输出Count: 1000表示作业成功完成登录 YARN ResourceManager Web UIhttp://rm-host:8088找到该 Application状态为FINISHED查看 ApplicationMaster 日志UI 上点击Logs→stdout确认无ClassNotFoundException: org.apache.hive字样在 YARN UI 的Executors标签页确认 Executor 数量与--num-executors默认 2一致且每个 Executor 的JVM Metrics中Heap Memory Used波动正常。注意若使用--deploy-mode clusterDriver 运行在 YARN Container 内需通过yarn logs -applicationId app-id查看日志。without-hive包在此模式下同样稳定因所有 Hive 类均未参与类加载。6. 故障排查与长期维护从“能跑”到“稳跑”的 5 个习惯6.1 日志定位黄金法则三类日志的查看优先级当作业失败时按以下顺序查日志可节省 80% 排查时间日志类型查看方式关键线索Driver 日志spark-submit终端输出client 模式或yarn logs -applicationIdcluster 模式ClassNotFoundException、NoClassDefFoundError、StackOverflowErrorJVM 参数不足Executor 日志YARN UI → Application → Executors → 对应 Executor →stderr或stdoutOutOfMemoryError: Java heap spacespark.executor.memory不足、Connection refused网络不通Spark History Server 日志http://hs-host:18080→ 找到已完成 Application →Details→Environmentspark.sql.catalogImplementation实际值、spark.driver.extraClassPath是否误加 Hive JAR逻辑说明without-hive包的典型故障是“不该出现的 Hive 类被加载”。若Driver 日志出现ClassNotFoundException: org.apache.hive.service.cli.thrift.TCLIService$Iface说明spark.sql.catalogImplementation未生效或spark.sql.hive.hiveserver2.enable被设为true若Executor 日志出现java.lang.VerifyError: Bad type on operand stack则可能是混入了 Hadoop 3.x 的 JAR因字节码不兼容。6.2 版本锁死防护如何安全升级 Spark 或 Hadoopspark-2.3.0-bin-hadoop2-without-hive是一个“冻结快照”升级需谨慎升级 SparkSpark 2.4 已废弃without-hive构建变体改为通过--packages动态加载 Hive。若需 Hive应迁移到 Spark 3.0 并使用spark-sql --packages org.apache.hive:hive-jdbc:2.3.9若坚持无 HiveSpark 3.3 的spark-3.3.0-bin-hadoop3.tgz天然不含 Hive无需额外构建。升级 Hadoop若集群从 Hadoop 2.8 升级到 3.3without-hive包将失效。解决方案只有两个1) 降级 Hadoop client在SPARK_CONF_DIR/spark-env.sh中export HADOOP_HOME/path/to/hadoop-2.82) 升级 Spark 至 3.0 并接受其 Hadoop 3.x 兼容性。6.3 生产环境监控 checklist每日巡检我给自己定的铁律每次上线新作业前必跑JVM 参数核对ps aux | grep spark | grep -v grep确认Driver和Executor进程的-Xmx值与spark-defaults.conf一致Classpath 清洁度spark-shell --conf spark.debug.maxToStringFields100启动后执行sc.parallelize(Seq(1)).map(x System.getProperty(java.class.path)).collect()检查输出中无hive-、hcatalog-字样Catalog 状态快照spark-sql -e SET spark.sql.catalogImplementation; SHOW DATABASES;确认返回in-memory和空结果YARN 资源水位yarn node -list -states RUNNING确认 NodeManager 内存/CPU 使用率 80%避免资源争抢导致 Executor 启动失败HDFS 读写基准hadoop fs -put /dev/zero /tmp/zero-test hadoop fs -get /tmp/zero-test /dev/null排除 HDFS 层问题干扰 Spark 诊断。从那以后我每次部署spark-2.3.0-bin-hadoop2-without-hive都强制走一遍这 5 条 checklist哪怕只是本地测试。它让我少踩了至少 7 次“以为配好了上线就崩”的坑——尤其是第 2 条 Classpath 检查曾帮我揪出同事偷偷在SPARK_CLASSPATH里加的hive-jdbc-1.2.1.jar。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站