
简介这份Hadoop综述PPT面向大数据入门学习者与分布式系统初学者系统梳理Hadoop核心知识框架帮助读者建立对HDFS、MapReduce与HBase三大组件的整体认知。资源共1个文件为单个ppt演示文稿压缩包约1.03MB内容以图文提纲形式呈现便于课堂讲解或自学梳理。目前已有32人学习下载。内容围绕HDFS分布式文件系统展开涵盖设计目标、数据块机制、NameNode与DataNode基本模型、命名空间映像与修改日志、心跳机制及副本放置策略等要点同时介绍MapReduce的基础概念、数据流与工作原理并对HBase的简介、数据模型及行、列、时间戳、API等做入门说明。整体结构按三篇递进组织适合作为大数据课程复习提纲或面试前知识串讲的参考材料。1. 从一份 Hadoop 综述 PPT 说起为什么你背完组件图还是搭不起集群很多人第一次接触大数据都是从一份《Hadoop 综述.ppt》开始的。幻灯片上画着 HDFS、MapReduce、HBase 三层架构箭头从 NameNode 指向 DataNode从 JobTracker 指向 TaskTracker看起来逻辑清晰、层次分明。可一旦让你真正动手问题就来了伪分布式怎么配HDFS 的读写流程到底经过哪些节点MapReduce 的 shuffle 为什么能把磁盘打满HBase 的 RegionServer 和 HDFS 又是什么关系这份综述能告诉你“有什么”却很难告诉你“怎么跑通、怎么调、怎么不翻车”。这篇笔记就沿着这份综述的骨架把 Hadoop 生态里最核心的三块——HDFS、MapReduce、HBase——从概念落到可复现的操作上。适合两类人一是刚学完理论、准备做课程设计或综合实训的学生二是需要在测试环境快速搭一套 Hadoop 栈、验证数据链路的工程师。目标很明确读完能自己搭起伪分布式能写一个能跑的 MapReduce 作业能把 HBase 装起来并用 Java 做一次增删改查同时知道哪些参数一改就出事。2. HDFS 与 MapReduce把综述里的架构图拆成可执行的命令2.1 伪分布式搭建从零到 NameNode 启动的最小路径综述 PPT 里通常只画一个 NameNode 和多个 DataNode但真到搭建时第一步不是画图而是决定用哪种模式。本地模式只能调试伪分布式才是理解 HDFS 和 MapReduce 交互的最低成本环境。我一般会先确认三件事JDK 版本、主机名解析、SSH 免密。JDK 用 8 或 11 都行但 Hadoop 3.x 对 11 的支持更稳主机名必须能通过hostname解析到 127.0.0.1否则 DataNode 会反复连不上 NameNodeSSH 免密不是可选项是启动脚本start-dfs.sh的硬依赖。配置上核心改四个文件core-site.xml指定默认文件系统hdfs-site.xml设副本数为 1mapred-site.xml用 YARN 跑 MapReduceyarn-site.xml配 ResourceManager 地址。下面是最小可用的core-site.xml片段configuration property namefs.defaultFS/name valuehdfs://localhost:9000/value /property property namehadoop.tmp.dir/name value/opt/hadoop/tmp/value /property /configurationfs.defaultFS告诉客户端默认连哪个 NameNode端口 9000 是常见选择但如果你机器上已有服务占用改成 8020 也行。hadoop.tmp.dir必须是一个提前建好、权限给足的目录否则格式化时会报Permission denied。格式化命令只有一条hdfs namenode -format但注意这条命令只能执行一次重复执行会把集群 ID 换掉导致 DataNode 拒绝注册。启动用start-dfs.sh然后用jps确认 NameNode、DataNode、SecondaryNameNode 三个进程都在。少一个就去logs目录看对应日志九成是端口冲突或目录权限。2.2 HDFS 读写流程用一次 put 和 get 看清数据怎么走综述里常画一条“客户端 → NameNode → DataNode”的线但真实读写比这多几个关键动作。写数据时客户端先向 NameNode 请求创建文件NameNode 返回一批可用的 DataNode 列表客户端再和第一个 DataNode 建立管道由它把数据包转发给下一个直到最后一个。每个数据包都有校验和管道中任何一个节点失败客户端会重新申请节点并续传。读数据时客户端先拿块位置然后直接连最近的 DataNode 读NameNode 只负责元数据不参与数据流。验证这个流程最直接的办法是传一个文件再取回来同时观察块分布hdfs dfs -mkdir -p /user/test/input hdfs dfs -put local_sample.txt /user/test/input/ hdfs dfs -ls /user/test/input/ hdfs fsck /user/test/input/local_sample.txt -files -blocks -locations-put触发写流程-ls看文件是否落盘fsck才是关键——它会列出这个文件被切成几个块、每个块在哪些 DataNode 上。如果副本数设为 1你会看到每个块只出现一次如果某个块的位置列表为空说明 DataNode 没注册成功。读流程用-get或-cat验证但更值得看的是hdfs dfs -cat时 NameNode 日志里有没有getBlockLocations调用。这个调用就是客户端向 NameNode 要块位置的证据。常见坑是-put小文件时看起来很快但 NameNode 内存里会多一条元数据大量小文件会把 NameNode 压垮所以综述里没强调的“小文件问题”在实操里必须提前知道。2.3 MapReduce 编程实例从 WordCount 到招聘数据清洗MapReduce 的综述通常只讲 Map、Shuffle、Reduce 三个阶段但真写代码时难点在 Shuffle 的序列化和分区。先跑通官方 WordCount再改造成招聘数据清洗是课程设计里最常见的路径。WordCount 的 Map 输出word, 1Reduce 累加核心代码不超过 30 行public class WordCount { public static class TokenizerMapper extends MapperObject, Text, Text, IntWritable { private final static IntWritable one new IntWritable(1); private Text word new Text(); public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } public static class IntSumReducer extends ReducerText,IntWritable,Text,IntWritable { private IntWritable result new IntWritable(); public void reduce(Text key, IterableIntWritable values, Context context ) throws IOException, InterruptedException { int sum 0; for (IntWritable val : values) { sum val.get(); } result.set(sum); context.write(key, result); } } }Mapper的四个泛型分别是输入键、输入值、输出键、输出值。输入键通常是行偏移量输入值是整行文本。Reducer的IterableIntWritable是同一个 key 的所有 value框架已经按 key 排好序。跑的时候用hadoop jar提交输出目录必须不存在否则报FileAlreadyExistsException。招聘数据清洗的思路类似Map 阶段过滤掉字段缺失的行Reduce 阶段按公司或岗位聚合。区别在于输入可能是 CSV需要处理引号转义和空行这时候StringTokenizer就不够用了得换成split加正则。参数上mapreduce.job.reduces默认是 1数据量大时改成节点数的 0.9 倍左右但小数据集改大了反而更慢因为每个 Reduce 都要走一遍 Shuffle。3. HBase 安装与表设计从 RegionServer 到 Java API 的落地3.1 HBase 安装与配置端口清单和依赖顺序HBase 的综述往往把它画在 HDFS 之上但装的时候顺序不能反先有 HDFS再有 HBase。HBase 的hbase-site.xml里必须指定hbase.rootdir指向 HDFS 路径否则默认写到本地文件系统RegionServer 一重启数据就丢。关键配置如下configuration property namehbase.rootdir/name valuehdfs://localhost:9000/hbase/value /property property namehbase.cluster.distributed/name valuetrue/value /property property namehbase.zookeeper.quorum/name valuelocalhost/value /property /configurationhbase.cluster.distributed设为 true 表示用独立模式ZooKeeper 用 HBase 自带的即可不用单独装。启动顺序是start-hbase.sh然后用jps确认 HMaster、HRegionServer、HQuorumPeer 都在。端口方面HMaster 的 Web UI 默认 16010RegionServer 是 16030ZooKeeper 是 2181RPC 是 16000。如果 16010 打不开先查hbase-site.xml里hbase.master.info.port有没有被改过。常见翻车点是HDFS 没启动就启 HBase日志里会报Connection refused但错误信息不会直接说“HDFS 没开”得自己顺着hbase.rootdir去查。3.2 表设计与数据操作RowKey 怎么定才不热点HBase 的表设计和关系型数据库完全两回事。综述里可能只提“列族”和“RowKey”但真到用的时候RowKey 设计直接决定会不会热点。比如用时间戳做 RowKey 前缀写入会全压到一个 RegionServer 上用反转时间戳或加盐前缀才能打散。列族数量也不宜多通常 1 到 3 个因为列族在底层是分开存的太多列族会导致 flush 和 compaction 频繁。建表和插入用hbase shell最快create employee, info, salary put employee, row1, info:name, Alice put employee, row1, salary:base, 10000 scan employee, {LIMIT 5}create时列族名必须给put的坐标是表、RowKey、列族:列、值。scan加LIMIT避免全表扫。如果scan很慢先看hbase shell里status的 Region 数Region 太少说明预分区没做数据全挤在一个 Region 里。预分区用create employee, info, {SPLITS [row1,row2,row3]}但 split 点要根据 RowKey 分布来定拍脑袋设了反而更糟。3.3 Java API 操作 HBase从 Connection 到 Put 的完整链路用 Java 操作 HBase 是课程设计里高频出现的需求。核心类是Connection、Table、Put、Get、Scan。注意HBase 2.x 之后HTable已经废弃必须用ConnectionFactory创建连接。下面是一个最小插入和查询的示例Configuration conf HBaseConfiguration.create(); conf.set(hbase.zookeeper.quorum, localhost); try (Connection conn ConnectionFactory.createConnection(conf); Table table conn.getTable(TableName.valueOf(employee))) { Put put new Put(Bytes.toBytes(row2)); put.addColumn(Bytes.toBytes(info), Bytes.toBytes(name), Bytes.toBytes(Bob)); table.put(put); Get get new Get(Bytes.toBytes(row2)); Result result table.get(get); byte[] value result.getValue(Bytes.toBytes(info), Bytes.toBytes(name)); System.out.println(Bytes.toString(value)); }Connection是重量级对象不要每次操作都创建应该复用。Table不是线程安全的多线程下每个线程用自己的Table。Bytes.toBytes负责把字符串转成字节数组HBase 里所有值都是字节。如果查询返回 null先确认 RowKey 和列族名大小写是否一致HBase 是大小写敏感的。另一个坑是Connection没关会导致 ZooKeeper 会话泄漏用 try-with-resources 最稳。4. 避坑与排查Hadoop 栈里最容易翻车的 5 个地方4.1 现象DataNode 启动后立刻消失原因通常是hadoop.tmp.dir指向的目录被重复格式化或者dfs.datanode.data.dir里的 clusterID 和 NameNode 不一致。解决方法是删掉 DataNode 的数据目录重新hdfs namenode -format再启动。注意格式化会清空所有数据测试环境才能这么干。4.2 现象MapReduce 作业卡在 map 100% reduce 0%原因多半是 Reduce 阶段拿不到 Map 输出常见于mapreduce.job.reduces设得太大或者 Shuffle 端口被防火墙拦了。先看yarn-site.xml里yarn.nodemanager.aux-services是否包含mapreduce_shuffle再看 ResourceManager 日志里有没有Container killed。解决方法是把 Reduce 数降到 1 先跑通再逐步加。4.3 现象HBase shell 能连但 Java API 报 NoNode原因是 Java 客户端用的 ZooKeeper 地址和 HBase 实际注册的不一致。检查hbase-site.xml里hbase.zookeeper.quorum和客户端conf.set的值是否相同。如果 HBase 用的是内置 ZooKeeper端口默认 2181但有些环境会改成 2182客户端没跟着改就会报KeeperErrorCode NoNode。4.4 现象HDFS 写入报 Could not obtain block原因是 DataNode 磁盘满了或者副本数设成了 3 但只有一个 DataNode。伪分布式下副本数必须改成 1改hdfs-site.xml里dfs.replication为 1然后重启 HDFS。如果磁盘没满但还报这个错用hdfs fsck /看有没有损坏块有的话用-delete删掉再重新传。4.5 现象HBase 的 RegionServer 频繁挂掉原因通常是 ZooKeeper 会话超时或者hbase.regionserver.global.memstore.size设得太大导致 OOM。先看 RegionServer 日志里有没有Session expired有的话调大zookeeper.session.timeout默认 90000 毫秒可以加到 180000。如果是 OOM把 memstore 上限降到 0.4 以下并确认堆内存-Xmx没超过物理内存的 70%。5. 进阶技巧用 distcp 做集群间数据迁移以及一个验证习惯Hadoop 生态里有一个容易被综述忽略但实战很常用的工具distcp。它本质是一个 MapReduce 作业用 Map 任务并行拷贝文件比hdfs dfs -cp快得多而且能跨集群。基本用法是hadoop distcp hdfs://src-nn:9000/user/data \ hdfs://dst-nn:9000/user/data关键参数有三个-m控制 Map 数默认 20小文件多时调大到 50 左右能提速但太大反而增加 NameNode 压力-update只拷贝目标端不存在的文件适合增量同步-delete会删掉目标端多出来的文件用之前一定确认这个参数没有后悔药。如果拷贝过程中报Filesystem closed通常是源端 NameNode 的fs.defaultFS和实际地址不一致检查core-site.xml里的配置。我自己的习惯是每次搭完一套 Hadoop 栈先跑一个最小闭环——put一个文件、跑一个 WordCount、往 HBase 插一行再读出来。这三步都过了才认为环境是通的。这个习惯帮我省了很多“以为配好了其实没通”的时间。Hadoop 的组件之间依赖很深一个端口没开可能报出来的错完全不相干。所以别急着调参数先把最小链路走通再往上加东西。希望帮到你。本文还有配套的精品资源点击获取