Hadoop 大数据入门实战:从环境搭建到 HDFS、Hive、Spark 与 Flink 链路验证
简介这是一份面向大数据初学者与转行开发者的系统入门资料包围绕Hadoop、Hive、Spark、Storm、Flink、HBase、Kafka、Zookeeper、Flume等主流组件展开覆盖学习路线、技术栈思维导图、常用软件安装指南以及环境搭建、命令实操、集群资源管理、分区、视图与数据查询等核心知识点帮助读者从零建立完整的大数据知识体系。资源共629个文件以380张png截图、101篇md笔记、69个java源码、25个xml配置及24张jpg图示为主另含scala、properties、parquet、orc、xmind等文件压缩包约20.75MB目录结构清晰便于按模块检索学习。目前已有155人学习下载。读者可借助图文笔记与源码示例快速完成各组件环境部署理解集群运行机制并通过配套练习巩固查询与资源管理能力适合作为入门阶段的参考手册与实操索引。1. 从一堆 Java 文件和 dept.csv 说起这套大数据入门资源到底能跑通什么很多人第一次搭 Hadoop 集群卡住的地方不是概念而是环境。JDK 版本对不上、core-site.xml 里 fs.defaultFS 写错端口、HDFS 格式化完 DataNode 起不来这些事在教程里往往一笔带过但真到自己动手每一步都是坑。这套大数据入门指南覆盖了 Hadoop、Hive、Spark、Storm、Flink、HBase、Kafka、Zookeeper、Flume 九大组件从学习路线、思维导图到环境搭建、命令实操、集群资源管理都有涉及。资源包里能看到 dept.csv 这种测试数据、mysql-connector-java-5.1.47.jar 驱动、HBaseUtils.java、HdfsUtils.java、HdfsTest.java、BasicOperation.java 这些工具类和测试类说明它不是纯文档堆砌而是带着可运行的代码骨架。适合谁刚转大数据方向、需要一套能照着敲的环境搭建流程和代码模板的人也适合已经会一两个组件、想补齐 Kafka 加 Flink 这条实时链路认知的开发者。具体目录和技术细节在 README.md 里正文不重复文件清单直接讲怎么用、参数怎么设、哪里容易翻车。2. 环境搭建与集群配置从伪分布式到多节点2.1 选伪分布式还是全分布式先看手头机器Hadoop 安装与配置这件事第一个决策不是改哪个配置文件而是选部署模式。伪分布式Pseudo-Distributed把 NameNode、DataNode、ResourceManager、NodeManager 全塞在一台机器上每个守护进程独立 JVM能完整跑通 HDFS 和 YARN 的读写与调度逻辑。全分布式则把角色拆到多台机器适合验证网络通信、数据本地性和真正的资源隔离。我一般建议手头只有一台 8GB 内存的笔记本或虚拟机先走伪分布式。原因很直接——全分布式至少三台节点每台给 NameNode 和 ResourceManager 留 2GBDataNode 和 NodeManager 各 1GB加起来内存就吃紧了还没算 Hive 和 Spark 的开销。伪分布式能让你把配置项、启动顺序、日志排查这些基本功练熟后面加机器只是复制配置和改主机名。常见做法是拿 VMware 或 VirtualBox 开一台 CentOS 7 或 Ubuntu 20.04内存给 4GB 以上磁盘 50GB。网络模式选 NAT 或桥接都行关键是 hostname 和 /etc/hosts 要配好不然后面 Hive 连 MySQL 元数据库、Spark 连 HDFS 都会因为解析不到主机名而超时。2.2 配置文件改哪几处参数含义逐个说Hadoop 的核心配置文件就四个core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml。下面这段是伪分布式的典型配置我按参数逐个解释。!-- core-site.xml定义 HDFS 的默认文件系统和临时目录 -- configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value !-- 这是 NameNode 的 RPC 地址端口 9000 是惯例不是强制 -- /property property namehadoop.tmp.dir/name value/opt/module/hadoop-3.1.3/data/tmp/value !-- 所有运行时临时数据放这里格式化前确保目录存在且权限对 -- /property /configuration!-- hdfs-site.xml副本数和 NameNode/DataNode 数据目录 -- configuration property namedfs.replication/name value1/value !-- 伪分布式只有一台 DataNode副本数必须为 1否则永远处于副本不足状态 -- /property property namedfs.namenode.name.dir/name valuefile:///opt/module/hadoop-3.1.3/data/namenode/value /property property namedfs.datanode.data.dir/name valuefile:///opt/module/hadoop-3.1.3/data/datanode/value /property /configuration!-- mapred-site.xml指定 MapReduce 跑在 YARN 上 -- configuration property namemapreduce.framework.name/name valueyarn/value /property /configuration!-- yarn-site.xmlNodeManager 的辅助服务缺了它 MapReduce 会卡在 ACCEPTED -- configuration property nameyarn.nodemanager.aux-services/name valuemapreduce_shuffle/value /property property nameyarn.resourcemanager.hostname/name valuelocalhost/value /property /configuration改完配置格式化 NameNode 并启动# 格式化前确认 dfs.namenode.name.dir 指向的目录是空的或不存在 hdfs namenode -format # 启动 HDFS 和 YARN start-dfs.sh start-yarn.sh # 验证进程应该看到 NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager jps逻辑说明hdfs namenode -format会生成集群 ID 并写入 NameNode 目录如果重复格式化且 DataNode 目录没清会出现 clusterID 不一致导致 DataNode 拒绝启动。start-dfs.sh读取的是 etc/hadoop 下的配置文件所以改完配置不用重启系统但必须重新执行启动脚本。jps是排查的第一道命令少哪个进程就去 logs 目录看对应日志。2.3 Hive 与 MySQL 元数据库的对接Hive 的安装与配置绕不开元数据库。默认的 Derby 只能单会话一开第二个客户端就锁死所以生产或学习环境都换成 MySQL。资源包里带了 mysql-connector-java-5.1.47.jar说明作者走的就是这条路。步骤是先在 MySQL 里建 hive 库和用户然后把驱动 jar 放到 Hive 的 lib 目录再配 hive-site.xml。-- 在 MySQL 中执行 CREATE DATABASE hive; CREATE USER hive% IDENTIFIED BY hive; GRANT ALL PRIVILEGES ON hive.* TO hive%; FLUSH PRIVILEGES;!-- hive-site.xml 关键项 -- configuration property namejavax.jdo.option.ConnectionURL/name valuejdbc:mysql://localhost:3306/hive?createDatabaseIfNotExisttrueamp;useSSLfalse/value /property property namejavax.jdo.option.ConnectionDriverName/name valuecom.mysql.jdbc.Driver/value /property property namejavax.jdo.option.ConnectionUserName/name valuehive/value /property property namejavax.jdo.option.ConnectionPassword/name valuehive/value /property /configuration参数说明createDatabaseIfNotExisttrue让 Hive 自动建库省一步手动操作useSSLfalse是因为 MySQL 5.7 默认开启 SSL 而老驱动不一定兼容关掉省心。驱动类名com.mysql.jdbc.Driver对应 5.1.x 版本如果换成 8.x 驱动类名要改成com.mysql.cj.jdbc.DriverURL 还要加时区参数。初始化元数据库用schematool -dbType mysql -initSchema这一步失败通常是驱动没放对位置或 MySQL 用户权限不够。2.4 Spark 集群搭建与 Hive 集成Spark 的安装与使用有两种模式Local 模式和 Standalone 集群。学习阶段 Local 模式够用但要看资源调度和分布式执行Standalone 更直观。Spark 连 Hive 的关键是把 hive-site.xml 复制到 Spark 的 conf 目录再把 MySQL 驱动放到 Spark 的 jars 目录。# 复制 Hive 配置到 Spark cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/ # 复制 MySQL 驱动 cp mysql-connector-java-5.1.47.jar $SPARK_HOME/jars/ # 启动 Spark SQL 并测试 Hive 表 spark-sql进入 spark-sql 后执行show databases;如果能看到 Hive 里的库说明集成成功。这里有个常见坑Spark 的日志级别默认是 INFO刷屏严重改 conf/log4j.properties 把 rootCategory 设为 WARN 会清爽很多。另外 Spark 内存参数spark.executor.memory和spark.driver.memory在 Local 模式下只影响 driver别指望它能把单机内存变多。3. HDFS 与 HBase 的 Java API 实操工具类怎么调、参数怎么传3.1 HdfsUtils 的封装思路与调用资源包里的 HdfsUtils.java 和 HdfsTest.java 是一对典型的工具类加测试类组合。HdfsUtils 一般封装了获取 FileSystem 对象、上传、下载、删除、列目录这些操作。核心是 Configuration 对象的构造和 FileSystem 的获取方式。// HdfsUtils.java 关键片段 public class HdfsUtils { private static Configuration conf; private static FileSystem fs; static { conf new Configuration(); // 指定 NameNode 地址覆盖配置文件里的值 conf.set(fs.defaultFS, hdfs://localhost:9000); try { fs FileSystem.get(conf); } catch (IOException e) { e.printStackTrace(); } } public static void upload(String local, String remote) throws IOException { // 本地路径 - HDFS 路径copyFromLocalFile 会覆盖目标 fs.copyFromLocalFile(new Path(local), new Path(remote)); } public static void download(String remote, String local) throws IOException { // HDFS - 本地第二个参数 false 表示不删除源文件 fs.copyToLocalFile(false, new Path(remote), new Path(local), true); } }逻辑说明静态代码块在类加载时执行一次适合单例式的 FileSystem 获取。conf.set(fs.defaultFS, ...)是硬编码方式好处是测试时不用依赖环境变量坏处是换集群要改代码。更灵活的做法是把地址放到外部配置文件或通过-D参数传入。copyToLocalFile的第三个参数useRawLocalFileSystem设为 true 可以避免生成 crc 校验文件调试时常用。调用时// HdfsTest.java public class HdfsTest { public static void main(String[] args) throws IOException { HdfsUtils.upload(/home/data/dept.csv, /input/dept.csv); HdfsUtils.download(/output/result.txt, /home/data/result.txt); } }参数说明上传的本地路径必须是绝对路径或相对于执行目录的正确路径HDFS 路径如果父目录不存在copyFromLocalFile会自动创建。下载时如果本地文件已存在默认会覆盖不想覆盖就先判断fs.exists()。3.2 HBaseUtils 与 dept.csv 的入库路径HBaseUtils.java 和 HBaseUtilsTest.java 对应的是 HBase 的 Java API 操作。HBase 的写入核心是 Put 对象和 Table 对象。资源包里的 dept.csv 很可能是用来做 HBase 入库测试的部门数据。// HBaseUtils.java 关键片段 public class HBaseUtils { private static Connection connection; static { Configuration conf HBaseConfiguration.create(); conf.set(hbase.zookeeper.quorum, localhost); conf.set(hbase.zookeeper.property.clientPort, 2181); try { connection ConnectionFactory.createConnection(conf); } catch (IOException e) { e.printStackTrace(); } } public static void putData(String tableName, String rowKey, String family, String qualifier, String value) throws IOException { Table table connection.getTable(TableName.valueOf(tableName)); Put put new Put(Bytes.toBytes(rowKey)); put.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier), Bytes.toBytes(value)); table.put(put); table.close(); } }逻辑说明HBase 1.x 之后用 ConnectionFactory 替代了 HTablePoolConnection 是重量级对象应该复用而不是每次新建。hbase.zookeeper.quorum指向 Zookeeper 地址HBase 依赖 Zookeeper 做集群协调所以 Zookeeper 必须先起来。rowKey 设计是 HBase 最核心的事dept.csv 如果按部门编号做 rowKey要注意避免热点比如编号连续且递增会导致写入集中在单个 Region。调用示例// HBaseUtilsTest.java public class HBaseUtilsTest { public static void main(String[] args) throws IOException { // 假设表 dept 已存在列族为 info HBaseUtils.putData(dept, 10, info, dname, ACCOUNTING); HBaseUtils.putData(dept, 10, info, loc, NEW YORK); } }参数说明表名和列族必须提前在 HBase shell 里创建Java API 不会自动建表。put.addColumn的 qualifier 是列限定符同一个列族下可以有多个 qualifier。如果写入报TableNotFoundException先去 shell 执行list确认表存在。3.3 BasicOperation 里的 Hive 基本查询操作BasicOperation.java 从命名看是 Hive 或 Spark SQL 的基础操作封装。Hive 基本查询操作二这类热词说明很多人卡在 group by、join、分区这些点上。用 JDBC 连 Hive 的方式如下// BasicOperation.java 关键片段 public class BasicOperation { public static void main(String[] args) throws Exception { Class.forName(org.apache.hive.jdbc.HiveDriver); Connection conn DriverManager.getConnection( jdbc:hive2://localhost:10000/default, root, ); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT deptno, COUNT(*) FROM emp GROUP BY deptno); while (rs.next()) { System.out.println(rs.getInt(1) \t rs.getInt(2)); } rs.close(); stmt.close(); conn.close(); } }逻辑说明Hive JDBC 连接需要 HiveServer2 先启动默认端口 10000。Class.forName加载驱动Hive 的驱动类名是org.apache.hive.jdbc.HiveDriver。查询走的是 MapReduce 或 Tez 引擎小数据量也会有几秒延迟这是正常的不是卡死。如果报连接拒绝检查hiveserver2进程是否在跑以及hive.server2.thrift.port配置。4. Kafka、Flume、Flink 实时链路数据从哪来到哪去4.1 Kafka 与 Zookeeper 的整合要点Hadoop 和 Zookeeper 整合实战这个热词背后其实是 Kafka 依赖 Zookeeper 做元数据管理。Kafka 2.8 之前必须外置 Zookeeper之后可以走 KRaft 模式但学习资源大多还是老版本。启动顺序必须是先 Zookeeper 后 Kafka。# 启动 Zookeeper zkServer.sh start # 启动 Kafka kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties # 创建 topic kafka-topics.sh --create --topic dept-topic \ --bootstrap-server localhost:9092 \ --partitions 3 --replication-factor 1参数说明--partitions 3决定并行度--replication-factor 1在单机环境只能为 1。--bootstrap-server是新版客户端的写法老版本用--zookeeper。如果创建 topic 报Replication factor: 1 larger than available brokers: 0说明 Kafka broker 没起来或没注册到 Zookeeper。4.2 Flume 采集 dept.csv 到 HDFSFlume 的定位是日志采集但用来把 dept.csv 这类文件搬到 HDFS 也合适。配置一个 spooldir source 加 hdfs sink# flume-hdfs.conf a1.sources r1 a1.sinks k1 a1.channels c1 a1.sources.r1.type spooldir a1.sources.r1.spoolDir /home/data/flume-spool a1.sources.r1.fileSuffix .done a1.sinks.k1.type hdfs a1.sinks.k1.hdfs.path hdfs://localhost:9000/flume/dept/%Y%m%d a1.sinks.k1.hdfs.filePrefix dept a1.sinks.k1.hdfs.fileType DataStream a1.sinks.k1.hdfs.writeFormat Text a1.sinks.k1.hdfs.rollInterval 0 a1.sinks.k1.hdfs.rollSize 134217728 a1.sinks.k1.hdfs.rollCount 0 a1.channels.c1.type memory a1.channels.c1.capacity 1000 a1.channels.c1.transactionCapacity 100 a1.sources.r1.channels c1 a1.sinks.k1.channel c1逻辑说明spooldir监控目录新文件出现就读取读完加.done后缀。rollInterval0和rollCount0表示不按时间和条数滚动只按rollSize128MB 滚动避免生成大量小文件——Hive 优化小文件是个高频问题从采集端控制比事后合并更省事。fileTypeDataStream不压缩方便直接查看。启动flume-ng agent --conf $FLUME_HOME/conf \ --conf-file flume-hdfs.conf \ --name a1 -Dflume.root.loggerINFO,console4.3 Flink 安装配置到部署以及 sink hive 表数据不入表的排查Flink 安装配置到部署这条链路学习阶段用 Local 模式最快。下载解压后直接./bin/start-cluster.shWeb UI 在 8081 端口。Flink sink hive 表数据不入表是个经典问题原因通常有三个一是没开 Hive 集成缺flink-sql-connector-hive依赖二是 checkpoint 没配Hive sink 依赖 checkpoint 提交分区三是 Hive 表是事务表而 Flink 写入模式不匹配。-- Flink SQL 写入 Hive 的典型语句 CREATE CATALOG hive_catalog WITH ( type hive, default-database default, hive-conf-dir /opt/module/hive/conf ); USE CATALOG hive_catalog; INSERT INTO dept_result SELECT deptno, COUNT(*) AS cnt FROM kafka_dept GROUP BY deptno;参数说明hive-conf-dir必须指向包含 hive-site.xml 的目录否则连不上元数据库。写入不生效时先看 Flink 日志里有没有Checkpoint expired或HiveConf相关报错。另一个隐蔽点是 Hive 表的存储格式TextFile 格式支持直接写入ORC 和 Parquet 需要对应的 writer版本不匹配会静默失败。Flink 的 JDBC 连接器异常也常出现在这里比如 MySQL 驱动版本和 Flink 自带的不一致报No suitable driver found。解决办法是把驱动放到 Flink 的 lib 目录而不是靠-C参数临时加载。5. 避坑与排查那些让我重装过集群的瞬间5.1 现象DataNode 启动后立刻消失jps 里看不到原因重复执行hdfs namenode -format导致 NameNode 的 clusterID 和 DataNode 的 clusterID 不一致DataNode 拒绝加入。或者hadoop.tmp.dir指向的目录权限不对DataNode 无法写入。解决停掉所有进程删除 NameNode 和 DataNode 的数据目录重新格式化一次然后只启动一次。权限问题用chown -R hadoop:hadoop /opt/module/hadoop-3.1.3/data修正。记住格式化是初始化操作不是重启操作。5.2 现象Hive 启动报MetaException或连不上 MySQL原因mysql-connector-java 驱动没放到$HIVE_HOME/lib或者驱动版本和 MySQL 服务端不匹配。另一个常见原因是 MySQL 用户没有从当前主机连接的权限hive用户只允许localhost而 Hive 配置里写的是主机名。解决确认 jar 在 lib 目录且权限可读用mysql -uhive -phive -h 主机名手动测试连接授权时用hive%而不是hivelocalhost。初始化元数据库失败时先手动在 MySQL 里DROP DATABASE hive; CREATE DATABASE hive;再重试schematool -initSchema。5.3 现象Spark 连 Hive 后show databases报Table not found原因hive-site.xml 没复制到 Spark 的 conf 目录或者复制了但 Spark 的 classpath 没加载到。也可能是 MySQL 驱动缺失Spark 找不到元数据库。解决确认$SPARK_HOME/conf/hive-site.xml存在且内容与 Hive 的一致把 MySQL 驱动放到$SPARK_HOME/jars/启动 spark-sql 时加--driver-class-path显式指定驱动路径。如果还不行看 Spark 日志里Caused by后面的具体异常通常是java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。5.4 现象Kafka 生产者发送消息报TimeoutException原因advertised.listeners配置的是 localhost而客户端从远程连接时拿到的是 localhost 地址解析不到。或者防火墙没放行 9092 端口。解决在 server.properties 里把advertised.listeners设为PLAINTEXT://实际主机名:9092确保客户端能解析该主机名。单机测试时用 localhost 没问题一旦跨机器就必须改。防火墙用firewall-cmd --add-port9092/tcp --permanent放行。5.5 现象Flume 采集文件后 HDFS 上全是小文件原因rollInterval默认 30 秒rollCount默认 10 条文件还没写多少就滚动一次导致大量小文件。Hive 查询时每个小文件一个 map 任务性能急剧下降。解决把rollInterval设为 0rollCount设为 0只保留rollSize控制滚动比如 128MB。同时hdfs.batchSize可以调大默认 100 太小。如果已经产生小文件用 Hive 的ALTER TABLE ... CONCATENATE或 Spark 的coalesce合并。6. 进阶技巧用 dept.csv 串起一条从 HDFS 到 Hive 到 Spark SQL 的验证链路资源包里那个 dept.csv 别只拿来当测试文件它可以串起整条链路验证每个组件是否真的通了。我的习惯是先把 dept.csv 传到 HDFS再用 Hive 外部表指向它然后用 Spark SQL 读 Hive 表做聚合最后把结果写回 HDFS。这一套走通说明 HDFS、Hive 元数据库、Spark 集成都没问题。第一步上传并建 Hive 外部表hdfs dfs -mkdir -p /input/dept hdfs dfs -put dept.csv /input/dept/-- Hive 中执行 CREATE EXTERNAL TABLE dept_ext ( deptno INT, dname STRING, loc STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY , STORED AS TEXTFILE LOCATION /input/dept; SELECT * FROM dept_ext;参数说明EXTERNAL表删除时只删元数据不删数据适合这种验证场景。FIELDS TERMINATED BY ,要和 csv 实际分隔符一致如果 csv 带表头加TBLPROPERTIES (skip.header.line.count1)。第二步Spark SQL 读 Hive 表并聚合// spark-sql 或 spark-shell 中执行 spark.sql(USE default) val df spark.sql(SELECT loc, COUNT(*) AS cnt FROM dept_ext GROUP BY loc) df.show() df.write.mode(overwrite).csv(hdfs://localhost:9000/output/dept_count)逻辑说明spark.sql直接复用 Hive 元数据不用重新定义 schema。write.mode(overwrite)覆盖已有输出避免path already exists报错。写 csv 会生成多个 part 文件这是 Spark 的并行写特性不是错误。第三步验证输出hdfs dfs -ls /output/dept_count hdfs dfs -cat /output/dept_count/part-*.csv如果这一步能看到按 loc 分组的计数结果说明整条链路是通的。我一般还会故意把 dept.csv 里某行的分隔符改成制表符看 Hive 查询时该行是否变成 NULL以此确认分隔符配置真的生效——这种反向验证比正向跑通更能暴露配置问题。从那以后我每次搭完新集群都强制走一遍这个 dept.csv 链路不看到 part 文件里的计数结果不往下做。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →