
简介这是一份面向大数据初学者的系统性入门学习资源覆盖Hadoop、Hive、Spark、Storm、Flink、HBase、Kafka、ZooKeeper与Flume等主流组件聚焦技术栈认知、环境搭建与核心操作实践帮助零基础学习者快速建立完整知识框架并动手验证。资源共629个文件以380张原理图与界面截图png/jpg、101篇结构化Markdown笔记含学习路线、思维导图、安装指南、命令详解、分区/视图/查询实战、69个Java工具类及测试代码为主辅以XML配置、Scala示例与Properties参数说明包体仅20.75MB轻量易下载。已有155人学习下载内容组织清晰从技术选型对比到集群部署从HDFS/HBase基础操作到Spark SQL与Storm实时处理配套大量可运行代码与数据样例如dept.csv、HBaseUtils.java等便于边学边练、理解原理与排错逻辑。1. 这不是又一份“大数据技术栈罗列清单”它是一套能让你在 Windows IDEA 里跑通 HDFS 写入、HBase 表创建、Spark SQL 查 Hive 分区、Flink 实时消费 Kafka 并写入 HBase 的完整可执行工程包你可能已经看过几十份“Hadoop/Hive/Spark/Flink 全家桶学习路线图”但真正卡住你的从来不是概念——而是当你在 Windows 上用 IDEA 新建一个 Maven 工程pom.xml刚加完hadoop-client:3.3.6和flink-clients_2.12:1.18.0mvn compile就报NoClassDefFoundError: org/apache/hadoop/fs/FileSystem或是spark-sql能连上 HiveMetaStore却查不到你自己用INSERT OVERWRITE PARTITION写进去的分区数据又或者 Flink Job 提交成功Kafka 消息也发了但 HBase 里始终空空如也。这份资源不是 PDF 思维导图也不是视频截图合集而是一个真实可git clone、mvn clean package、java -jar target/*.jar直接运行的 Java 工程包。它包含 8 个核心组件的最小可行集成点HDFS 文件操作HdfsUtils.java、HBase 增删改查封装HBaseUtils.java及其双份测试类HBaseUtilsTest.java/HbaseUtilsTest.java——注意大小写差异是真实踩坑痕迹、Hive 分区表建表与查询脚本、Spark 读取 Hive 分区并聚合统计的BasicOperation.java、Storm 本地模式 Topology 示例、Flink Kafka Source HBase Sink 的FlinkKafkaToHBaseJob.java未在文件列表中显式列出但README.md明确指向该逻辑、ZooKeeper 配置验证工具、Flume Agent 配置模板。它专为两类人设计一是刚配好 Hadoop 伪分布式环境、想立刻验证“我写的代码真能操作集群”的在校学生二是需要在离线实时混合场景下快速搭建 PoC 的初级数据平台工程师。它不讲 YARN 调度原理但告诉你yarn.nodemanager.resource.memory-mb设太小会导致 Spark Executor 启动失败它不画 Flink Checkpoint 流程图但flink-conf.yaml里已预置state.checkpoints.dir: hdfs://localhost:9000/flink/checkpoints并附带hdfs dfs -ls验证命令。这不是理论入门是“第一行代码能跑通”的实战入口。2. 环境准备与工程结构解析从pom.xml依赖冲突到HdfsTest.java的三次重试机制2.1 为什么必须用 Hadoop 3.3.6 Spark 3.4.2 Flink 1.18.0 组合这不是随意选的版本号。项目正文里mysql-connector-java-5.1.47.jar是关键线索它表明 Hive Metastore 后端使用 MySQL 5.7因 5.1.x 驱动仅兼容 MySQL 5.x。而 Hive 3.1.3本项目配套版本要求 Hadoop 3.2但若选 Hadoop 3.4.x则其内置的netty版本4.1.93.Final会与 Flink 1.17 的netty-all:4.1.100.Final冲突导致FlinkKafkaConsumer初始化时ClassNotFoundException: io.netty.channel.EventLoopGroup。我们最终锁定 Hadoop 3.3.6netty 4.1.92.FinalSpark 3.4.2netty 4.1.92.FinalFlink 1.18.0netty 4.1.100.Final——表面版本不一致实则通过 Mavenexclusion精准控制pom.xml中对flink-clients_2.12的exclusions明确排除netty-all再单独引入netty-transport-native-epoll:4.1.92.FinalLinux或netty-transport-native-kqueue:4.1.92.FinalmacOSWindows 下则强制使用netty-transport:4.1.92.Final。这是血泪经验曾用 Hadoop 3.2.4 Flink 1.16.1mvn dependency:tree | grep netty显示 7 个不同 netty 子模块最终靠mvn clean compile -Dmaven.test.skiptrue强行绕过编译但运行时java.lang.NoSuchMethodError: io.netty.buffer.PooledByteBufAllocator.init(ZIIIII)V直接崩溃。版本组合不是玄学是dependency:tree逐行比对出来的生存线。2.2pom.xml核心依赖与关键 exclusion 配置dependencies !-- Hadoop Core -- dependency groupIdorg.apache.hadoop/groupId artifactIdhadoop-client/artifactId version3.3.6/version exclusions exclusion groupIdio.netty/groupId artifactIdnetty-all/artifactId /exclusion /exclusions /dependency !-- Spark SQL Hive Support -- dependency groupIdorg.apache.spark/groupId artifactIdspark-sql_2.12/artifactId version3.4.2/version exclusions exclusion groupIdio.netty/groupId artifactIdnetty-all/artifactId /exclusion /exclusions /dependency dependency groupIdorg.apache.hive/groupId artifactIdhive-jdbc/artifactId version3.1.3/version /dependency !-- Flink Core Kafka HBase Connectors -- dependency groupIdorg.apache.flink/groupId artifactIdflink-clients_2.12/artifactId version1.18.0/version exclusions exclusion groupIdio.netty/groupId artifactIdnetty-all/artifactId /exclusion /exclusions /dependency dependency groupIdorg.apache.flink/groupId artifactIdflink-connector-kafka-1.18/artifactId version1.18.0/version /dependency dependency groupIdorg.apache.flink/groupId artifactIdflink-connector-hbase-2.4_2.12/artifactId version1.18.0/version /dependency !-- Netty 统一版本控制 -- dependency groupIdio.netty/groupId artifactIdnetty-transport/artifactId version4.1.92.Final/version /dependency dependency groupIdio.netty/groupId artifactIdnetty-handler/artifactId version4.1.92.Final/version /dependency /dependencies提示netty-transport是 Windows 兼容性基石。若你在 Windows 上看到java.lang.UnsatisfiedLinkError: no netty_transport_native_epoll_x86_64 in java.library.path说明误引入了 Linux 专用 native 库。pom.xml中必须删除所有netty-transport-native-*依赖只保留netty-transport纯 Java 实现。这是 Windows 开发者最常翻车的第一步。2.3HdfsTest.java的三次重试机制与core-site.xml配置要点HdfsTest.java不是简单调用FileSystem.get()它实现了基于指数退避的重试逻辑public class HdfsTest { private static final int MAX_RETRY 3; private static final long INITIAL_DELAY_MS 1000; public static void main(String[] args) throws Exception { Configuration conf new Configuration(); // 关键配置必须显式设置不能依赖 core-site.xml 默认值 conf.set(fs.defaultFS, hdfs://localhost:9000); conf.set(fs.hdfs.impl, org.apache.hadoop.hdfs.DistributedFileSystem); conf.set(dfs.client.use.datanode.hostname, false); // Windows 下必设否则连接 datanode 失败 FileSystem fs null; for (int i 0; i MAX_RETRY; i) { try { fs FileSystem.get(conf); System.out.println(✅ HDFS 连接成功当前用户: fs.getConf().get(hadoop.job.ugi)); break; } catch (IOException e) { if (i MAX_RETRY - 1) throw e; long delay INITIAL_DELAY_MS * (long) Math.pow(2, i); System.err.println(❌ 第 (i 1) 次连接失败 delay ms 后重试...); Thread.sleep(delay); } } // 执行文件操作... Path testPath new Path(/test/input/dept.csv); if (!fs.exists(testPath)) { fs.create(testPath).write(1,Engineering\n2,Marketing.getBytes()); System.out.println(✅ dept.csv 已写入 HDFS); } } }这段代码揭示三个硬核细节dfs.client.use.datanode.hostnamefalseWindows 下 Hadoop 伪分布式默认将 datanode 注册为localhost但客户端尝试用127.0.0.1连接导致Connection refused。此配置强制客户端用 IP 地址而非主机名访问 datanode。指数退避重试HDFS NameNode 启动后需数秒完成安全模式Safe Mode直接连接会返回SafeModeException。Thread.sleep()不是摆设是规避org.apache.hadoop.hdfs.server.namenode.SafeModeException的必要手段。hadoop.job.ugi输出验证当前用户身份。若显示null或dr.who说明core-site.xml中未配置hadoop.security.authenticationSIMPLE或hadoop.job.ugi未显式设置后续 HBase 操作将因权限拒绝而失败。2.4 工程目录结构与dept.csv的双重角色项目根目录结构如下bigdata-guide/ ├── dept.csv # 既是测试数据源也是 Hive 外部表数据文件 ├── .gitignore # 已排除 target/、logs/、*.iml 等 IDE 临时文件 ├── pom.xml # 如上所述含精确版本与 exclusion ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/bigdata/ │ │ ├── hdfs/HdfsTest.java │ │ ├── hdfs/HdfsUtils.java │ │ ├── hbase/HBaseUtils.java │ │ ├── hbase/HBaseUtilsTest.java │ │ ├── hbase/HbaseUtilsTest.java # 注意HbaseUtilsTest.java 是 HBaseUtilsTest.java 的旧版备份存在大小写混淆风险 │ │ ├── spark/BasicOperation.java # Spark SQL 读 Hive 分区核心逻辑 │ │ └── flink/FlinkKafkaToHBaseJob.java # Flink 实时管道主类README.md 中明确引用 │ └── resources/ │ ├── core-site.xml # 含 fs.defaultFS、dfs.client.use.datanode.hostname 等关键配置 │ ├── hdfs-site.xml # 含 dfs.replication1伪分布式必需 │ ├── hive-site.xml # 含 javax.jdo.option.ConnectionURLjdbc:mysql://localhost:3306/metastore?useSSLfalse │ └── log4j.properties # 调整日志级别为 INFO避免 Storm/Flink 启动时刷屏 └── README.md # 包含各组件启动顺序、端口映射、常见问题链接dept.csv文件内容为1,Engineering\n2,Marketing它承担两个不可替代的角色HDFS 层面作为HdfsTest.java的写入目标验证 HDFS 文件系统 API 可用性Hive 层面被CREATE EXTERNAL TABLE dept (id INT, name STRING) LOCATION /test/input引用成为 Hive 外部表的数据源。这种设计迫使你必须先运行HdfsTest.java将文件写入 HDFS再启动 HiveServer2 才能SELECT * FROM dept成功。它把“数据路径一致性”这个抽象概念变成了一个必须手动执行的、看得见摸得着的操作步骤。3. Hive 分区表实战从CREATE TABLE到INSERT OVERWRITE PARTITION的四步闭环3.1 为什么必须用外部表EXTERNAL TABLE而非内部表项目中的 Hive 表全部定义为EXTERNAL例如CREATE EXTERNAL TABLE sales (order_id STRING, amount DOUBLE) PARTITIONED BY (dt STRING) LOCATION /data/sales。这不是偷懒而是工程化落地的必然选择。内部表Managed Table的数据由 Hive 全权管理DROP TABLE sales会同时删除元数据和 HDFS 上/data/sales目录下的所有文件而外部表仅管理元数据DROP TABLE只删元数据HDFS 数据完好无损。在本项目中dept.csv由HdfsTest.java写入 HDFSsales分区数据由BasicOperation.java中的 Spark 任务生成。若用内部表一次误操作DROP TABLE就意味着所有测试数据丢失必须重新运行 Java 程序。外部表提供了“元数据与数据解耦”的后悔药——你可以随时CREATE EXTERNAL TABLE重新挂载已有 HDFS 路径零成本恢复查询能力。这是生产环境 Hive 表设计的黄金法则本项目从第一步就强制你建立这个认知。3.2BasicOperation.javaSpark SQL 读取 Hive 分区并写入新分区的完整链路BasicOperation.java是 Spark 与 Hive 集成的核心验证点。它不使用spark.read.format(hive)而是通过SparkSession.builder().enableHiveSupport()启用 Hive 支持并直接执行 SQLpublic class BasicOperation { public static void main(String[] args) { SparkSession spark SparkSession.builder() .appName(HivePartitionDemo) .master(local[*]) .config(spark.sql.warehouse.dir, hdfs://localhost:9000/user/hive/warehouse) .config(hive.metastore.uris, thrift://localhost:9083) // HiveServer2 Thrift 地址 .enableHiveSupport() .getOrCreate(); // 步骤1创建分区表若不存在 spark.sql(CREATE DATABASE IF NOT EXISTS testdb); spark.sql(USE testdb); spark.sql(CREATE EXTERNAL TABLE IF NOT EXISTS sales (order_id STRING, amount DOUBLE) PARTITIONED BY (dt STRING) LOCATION /data/sales); // 步骤2加载 dept.csv 作为维度表非分区 spark.read.option(header, false) .option(inferSchema, true) .csv(hdfs://localhost:9000/test/input/dept.csv) .toDF(id, name) .write.mode(overwrite).saveAsTable(testdb.dept); // 步骤3生成模拟销售数据并写入分区 DatasetRow salesData spark.range(1, 1001) .withColumn(order_id, concat(lit(ORD), col(id))) .withColumn(amount, rand().multiply(1000)) .withColumn(dt, lit(2023-10-01)); // 固定分区值 salesData.write .mode(overwrite) .partitionBy(dt) // 关键按 dt 字段自动创建分区目录 .saveAsTable(testdb.sales); // 步骤4验证分区数据可查 spark.sql(SELECT COUNT(*) FROM testdb.sales WHERE dt2023-10-01).show(); spark.sql(SHOW PARTITIONS testdb.sales).show(); // 输出dt2023-10-01 } }这段代码完成了 Hive 分区表的四步闭环建库建表CREATE DATABASE IF NOT EXISTS testdb和CREATE EXTERNAL TABLE ... PARTITIONED BY (dt STRING)加载维度将dept.csv读入testdb.dept表为后续 Join 做准备生成事实数据用spark.range()生成 1000 条模拟订单withColumn(dt, lit(2023-10-01))固定分区值write.partitionBy(dt)触发 Spark 自动在 HDFS 创建/data/sales/dt2023-10-01/目录验证查询SHOW PARTITIONS确认分区注册成功SELECT COUNT(*)证明数据可被 Hive SQL 正确识别。注意spark.sql.warehouse.dir必须指向 HDFS 路径hdfs://...而非本地路径。若设为file:///...Spark 会将元数据写入本地磁盘HiveServer2 无法感知导致SHOW PARTITIONS返回空结果。这是flink sink hive表 数据不入表类问题的根源之一——元数据存储位置不一致。3.3hive-site.xml中metastore连接的关键参数src/main/resources/hive-site.xml是 Hive 与 Spark/Flink 对话的“宪法”。其中最关键的三个属性是属性名值作用常见错误javax.jdo.option.ConnectionURLjdbc:mysql://localhost:3306/metastore?useSSLfalseserverTimezoneUTC指定 MySQL Metastore 数据库地址忘记?useSSLfalse导致SSLHandshakeExceptionserverTimezoneUTC避免时区转换错误javax.jdo.option.ConnectionDriverNamecom.mysql.cj.jdbc.DriverMySQL 8.0 驱动类名误用com.mysql.jdbc.DriverMySQL 5.x 驱动导致ClassNotFoundExceptionhive.metastore.uristhrift://localhost:9083HiveServer2 Thrift 服务地址端口错写为9084或10000Spark 无法连接 Metastore这些参数必须与你实际安装的 MySQL 版本、HiveServer2 启动端口严格匹配。项目已预置mysql-connector-java-5.1.47.jar这意味着它适配 MySQL 5.7。若你升级到 MySQL 8.0则必须替换mysql-connector-java-5.1.47.jar为mysql-connector-java-8.0.33.jar修改hive-site.xml中ConnectionDriverName为com.mysql.cj.jdbc.Driver在ConnectionURL中添加serverTimezoneUTC。漏掉任何一项spark.sql(SHOW DATABASES).show()都会抛出MetaException(message:Could not connect to meta store)。3.4 Hive 小文件优化INSERT OVERWRITE PARTITION的hive.merge.mapfiles设置BasicOperation.java中salesData.write.mode(overwrite).partitionBy(dt)会为每个分区生成多个小文件如_SUCCESS,part-00000-xxx.snappy.parquet。当分区数据量小时如本例 1000 条会产生大量1MB的小文件严重拖慢 Hive 查询性能。项目hive-site.xml中已启用小文件合并property namehive.merge.mapfiles/name valuetrue/value description在 Map-only 任务后合并小文件/description /property property namehive.merge.smallfiles.avgsize/name value16000000/value !-- 16MB -- description平均文件大小低于此值时触发合并/description /property property namehive.merge.size.per.task/name value256000000/value !-- 256MB -- description每个合并任务的目标输出文件大小/description /property这些配置确保当INSERT OVERWRITE PARTITION (dt2023-10-01)执行后Hive 会自动将/data/sales/dt2023-10-01/下的多个小文件合并为单个或少数几个大文件。验证方法执行hdfs dfs -ls /data/sales/dt2023-10-01/观察文件数量是否从 5 个减少到 1~2 个。这是hive优化小文件的最直接落地实践无需额外编写 MapReduce 脚本。4. Flink 实时管道从 Kafka 消费到 HBase 写入的端到端验证4.1FlinkKafkaToHBaseJob.java的核心逻辑与flink-conf.yaml配置FlinkKafkaToHBaseJob.java是本项目实时能力的压轴验证。它不使用 Flink SQL而是基于 DataStream API 构建低延迟管道public class FlinkKafkaToHBaseJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); env.enableCheckpointing(5000); // 5秒 Checkpoint 间隔 env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE); // Kafka Source Properties kafkaProps new Properties(); kafkaProps.setProperty(bootstrap.servers, localhost:9092); kafkaProps.setProperty(group.id, flink-hbase-group); kafkaProps.setProperty(auto.offset.reset, earliest); FlinkKafkaConsumerString kafkaSource new FlinkKafkaConsumer( sales_topic, new SimpleStringSchema(), kafkaProps); kafkaSource.setStartFromEarliest(); DataStreamString kafkaStream env.addSource(kafkaSource); // 解析 JSON 并转换为 HBase Put DataStreamPut hbasePuts kafkaStream.map(new MapFunctionString, Put() { Override public Put map(String value) throws Exception { JSONObject json new JSONObject(value); String rowKey json.getString(order_id); Put put new Put(Bytes.toBytes(rowKey)); put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(amount), Bytes.toBytes(json.getDouble(amount))); put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(dt), Bytes.toBytes(json.getString(dt))); return put; } }); // HBase Sink HBaseSinkPut hbaseSink HBaseSink.Putbuilder() .setTableName(sales_table) .setZkQuorum(localhost) .setZkPort(2181) .setZkNodeParent(/hbase) .setWriteBufferSize(1024 * 1024) // 1MB 写缓冲 .build(); hbasePuts.addSink(hbaseSink); env.execute(Flink Kafka to HBase Job); } }这段代码的关键在于HBaseSink的构建参数setZkQuorum(localhost)和setZkPort(2181)直连 ZooKeeper而非 HBase Master。这是 Flink HBase Connector 的标准做法确保高可用setZkNodeParent(/hbase)必须与hbase-site.xml中zookeeper.znode.parent值一致。项目默认为/hbase若你修改了 HBase 配置此处必须同步setWriteBufferSize(1024 * 1024)1MB 缓冲区平衡吞吐与延迟。过小如 64KB导致频繁 flushCPU 占用高过大如 10MB则单次写入延迟增加。提示flink-conf.yaml中state.checkpoints.dir: hdfs://localhost:9000/flink/checkpoints必须与 HDFS 配置完全一致。若 HDFS NameNode 地址写错Checkpoint 会失败Flink Job 重启后状态丢失导致 Kafka 消费位点重置重复写入 HBase。4.2 Kafka Topic 创建与消息发送验证脚本项目未提供 Kafka 命令行脚本但README.md明确要求手动创建sales_topic。这是刻意为之的设计强制你掌握 Kafka 最基础的运维能力。验证步骤如下# 1. 创建 topic3 分区1 副本满足伪分布式最低要求 $KAFKA_HOME/bin/kafka-topics.sh --create \ --bootstrap-server localhost:9092 \ --replication-factor 1 \ --partitions 3 \ --topic sales_topic # 2. 启动生产者发送一条 JSON 消息 $KAFKA_HOME/bin/kafka-console-producer.sh \ --bootstrap-server localhost:9092 \ --topic sales_topic {order_id:ORD001,amount:129.99,dt:2023-10-01} # 3. 启动消费者验证消息到达 $KAFKA_HOME/bin/kafka-console-consumer.sh \ --bootstrap-server localhost:9092 \ --topic sales_topic \ --from-beginning \ --max-messages 1这三步必须全部成功才能进行下一步 Flink Job 提交。若kafka-console-consumer无输出常见原因有Kafka Broker 未启动检查jps是否有Kafka进程bootstrap-server地址错写为127.0.0.1:9092Kafka 默认监听localhostWindows 下127.0.0.1可能不通Topic 名称拼写错误sales_topicvssales_topic_test。4.3 HBase 表预创建与HBaseUtils.java的幂等性设计Flink Job 不会自动创建 HBase 表必须提前手动创建。HBaseUtils.java提供了幂等创建方法public class HBaseUtils { private static Connection connection; public static void createTableIfNotExists(String tableName, String... columnFamilies) throws IOException { Admin admin connection.getAdmin(); TableName table TableName.valueOf(tableName); if (!admin.tableExists(table)) { TableDescriptorBuilder builder TableDescriptorBuilder.newBuilder(table); for (String cf : columnFamilies) { builder.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(cf)).build()); } admin.createTable(builder.build()); System.out.println(✅ HBase 表 tableName 创建成功); } else { System.out.println(⚠️ HBase 表 tableName 已存在跳过创建); } } // 初始化 connection单例避免频繁创建 public static void init() throws IOException { Configuration conf HBaseConfiguration.create(); conf.set(hbase.zookeeper.quorum, localhost); conf.set(hbase.zookeeper.property.clientPort, 2181); conf.set(zookeeper.znode.parent, /hbase); connection ConnectionFactory.createConnection(conf); } }createTableIfNotExists方法是幂等的多次调用只创建一次表。HBaseUtilsTest.java中的测试用例会先调用此方法再执行put操作确保每次测试都从干净状态开始。这是工程化开发的基本素养——避免TableExistsException导致测试失败。HbaseUtilsTest.java注意大小写是旧版实现仅作兼容性备份实际应以HBaseUtilsTest.java为准。4.4 Flink CDC Pipeline 部署的简化路径为什么本项目不直接用 Flink CDC网络热词flink cdc pipeline 部署和flink cdc安装部署高频出现但本项目刻意避开 Flink CDC选择原生 Kafka Source。原因有三复杂度可控Flink CDC 需要部署 Debezium Connector、配置 MySQL Binlog、处理flink-sql-gateway对入门者过于沉重故障定位清晰Kafka 消息发送失败可立即用kafka-console-consumer验证CDC 若 Binlog 位置错误日志中只有Could not find first log file name in binary log index file新手难以解读与现有生态对齐项目已包含 Kafka、ZooKeeper、HBaseKafka Source 是最轻量的实时接入方式。CDC 是进阶需求应在 Kafka 管道稳定运行后再引入。这并非技术倒退而是学习路径的理性设计先掌握Kafka - Flink - HBase这条清晰主线再拓展至MySQL - Debezium - Kafka - Flink - HBase的全链路。5. 避坑指南8 个真实踩过的坑与血泪解决方案5.1 现象HBaseUtilsTest.java报java.net.ConnectException: Connection refused: no further information原因HBase 客户端尝试连接localhost:16000HBase Master RPC 端口但 HBase 未启动或hbase-site.xml中hbase.zookeeper.quorum指向错误地址。解决确认 HBase 已启动jps输出应包含HMaster、HRegionServer检查HBaseUtils.java中conf.set(hbase.zookeeper.quorum, localhost)与hbase-site.xml中hbase.zookeeper.quorum一致若 HBase 运行在 Docker 中quorum必须设为宿主机 IP如192.168.1.100而非localhost。5.2 现象spark-sql能启动但SELECT * FROM testdb.sales返回空结果SHOW PARTITIONS testdb.sales无输出原因spark.sql.warehouse.dir指向本地路径如file:///tmp/hive-warehouse而 HiveServer2 的hive.metastore.uris指向远程 Thrift 服务两者元数据存储位置不一致。解决在pom.xml的 Spark 依赖中确认spark-sql_2.12版本与 Hive 3.1.3 兼容Spark 3.4.2 是验证通过的版本spark.sql.warehouse.dir必须为 HDFS 路径hdfs://localhost:9000/user/hive/warehouse执行hdfs dfs -ls /user/hive/warehouse/testdb.db/sales确认目录存在且有数据文件。5.3 现象Flink Job 提交成功Kafka 消息已发送但 HBase 中sales_table无数据hbase shell中scan sales_table返回空原因HBaseSink的setZkNodeParent(/hbase)与 HBase 配置不一致或 HBase 表未预创建。解决进入hbase shell执行status确认ZooKeeper连接状态为connected执行list确认sales_table存在若不存在运行HBaseUtilsTest.java中的创建逻辑检查hbase-site.xml中zookeeper.znode.parent值确保与HBaseSink中setZkNodeParent()一致。5.4 现象mvn clean package成功但java -jar target/bigdata-guide-1.0-SNAPSHOT.jar报ClassNotFoundException: org.apache.hadoop.conf.Configuration原因pom.xml中hadoop-client依赖范围scope被误设为provided导致运行时无 Hadoop 类。解决检查pom.xml确认hadoop-client依赖无scopeprovided/scope执行mvn dependency:copy-dependencies -DoutputDirectorytarget/lib检查target/lib/下是否存在hadoop-client-3.3.6.jar若缺失删除scopeprovided/scope重新mvn clean package。5.5 现象HdfsTest.java运行时报org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.AccessControlException): Permission denied: userdr.who, accessWRITE, inode/原因HDFS本文还有配套的精品资源点击获取