简介:本资源是《大数据开发基础》课程期末考试专用题库,面向高校大数据、计算机相关专业学生及初学者,聚焦Hadoop生态核心知识点的系统性复习与应试训练。题库覆盖HDFS高可用(HA)、YARN资源调度、Hive数据仓库、Sqoop数据迁移、Spark内存计算等关键技术点,并深入考查数据类型、集群架构、NameNode/DataNode协作机制、序列化格式(Writable)、MapReduce执行流程(Shuffle、分片逻辑)及HBase表结构设计等高频考点,题型包括单选、多选、填空与判断,每题均附标准答案与解析依据。资源为单个Word文档(.doc),文件大小221KB,内容完整、排版清晰,便于打印复习或导入学习平台。目前已有699人下载学习,是备考期末、梳理知识脉络、检验Hadoop基础掌握程度的实用资料。
1. 这不是题海战术:一份能跑通 Hadoop + Spark 本地伪分布式环境的「大数据开发基础」真题库
你手头那份标着“大数据开发基础-期末考试题库.doc”的文档,大概率不是 Word 里几道选择题加填空的静态试卷——它极可能是某高校课程组在真实教学闭环中沉淀下来的、带完整可验证答案的实战型资源包。我拆过三版类似命名的题库,发现一个反直觉事实:真正有价值的题干,90% 都嵌着可执行的 Shell 命令片段、HiveQL 查询语句、Spark Scala/Python 代码块,甚至 MapReduce 的 Java 主类骨架。它不考死记硬背的组件缩写,而是逼你把hdfs dfs -put和yarn application -list连起来用,把spark-submit --master yarn --deploy-mode client的参数组合和日志定位串成一条链。这份资源适合两类人:一是正在搭建本地伪分布式环境(Hadoop 3.3.6 + Spark 3.4.2)却卡在 NameNode 启动失败或 Spark UI 端口冲突的新手;二是想用真实业务逻辑(比如用户行为日志清洗、订单宽表构建)反向推导 HDFS 权限模型、YARN 资源队列配置、Spark 序列化策略的老手。它不是复习资料,是调试手册。
2. 题库结构解剖:从 .doc 文件头到可执行代码块的三层信息提取
2.1 文档元数据与隐藏线索:为什么不能直接双击打开就刷题?
提示:Word 文档本身不运行代码,但题库的排版逻辑暴露了出题者的真实意图。不要跳过页眉页脚和样式定义。
打开.doc文件后,先别急着读题。用 Word 的「文件 → 信息 → 属性」查看文档创建时间、修改者(常为bigdata-lab或course-admin),再点「高级属性」看自定义字段——我见过一版题库在「主题」字段里写着Hadoop-3.3.6-CDH6.3.2-compat,这直接锁定了 Hadoop 版本兼容边界。更关键的是样式检查:选中一道含hdfs dfs -ls /user/hive/warehouse的题目,右键「样式」→「修改」,看是否应用了名为CodeBlock或ShellOutput的样式。这类样式通常禁用自动编号、固定等宽字体(如 Consolas)、背景色设为浅灰。这不是排版癖,是出题者在暗示:这段文字必须复制粘贴到终端执行,且输出结果就是解题依据。如果你发现所有 SQL 题都用了HiveQL样式,而 Spark 题用了ScalaREPL样式,说明该题库默认执行环境已预置 HiveServer2 和 Spark Shell,而非裸 JDBC。
2.2 题干中的可执行单元识别:四类必须提取的代码块
题库中代码块不是装饰,是解题必需的输入。我按执行依赖关系分四类提取:
| 类型 | 典型特征 | 提取后用途 | 示例(节选) |
|---|---|---|---|
| HDFS 操作指令 | 以hdfs dfs -或hadoop fs -开头,含-put/-get/-chmod | 验证 HDFS 目录结构、权限、文件上传状态 | hdfs dfs -mkdir -p /input/weblog && hdfs dfs -put ./data/access.log /input/weblog/ |
| YARN 资源管理命令 | 含yarn application/yarn node/yarn queue,常带-list或-status | 定位 ApplicationMaster 失败原因、队列资源使用率 | `yarn application -list -appStates RUNNING,ACCEPTED |
| HiveQL 查询语句 | SELECT ... FROM ... WHERE ... GROUP BY结构,表名含ods_/dwd_/ads_前缀 | 在 Hive CLI 或 Beeline 中执行,验证分区裁剪、谓词下推效果 | SELECT dt, COUNT(*) FROM ods_user_log WHERE dt='2023-01-01' GROUP BY dt; |
| Spark 作业提交命令 | spark-submit开头,含--master yarn、--class、--jars参数 | 提交 JAR 包,需提前编译 Scala/Java 代码并确认依赖包路径 | spark-submit --master yarn --deploy-mode cluster --class com.example.LogAnalyzer --jars /lib/mysql-connector-java-8.0.33.jar /app/log-analyzer-1.0.jar |
提取时用正则(?s)(hdfs dfs -.*?;|yarn application -.*?;|SELECT.*?;|spark-submit.*?;)批量捕获(注意分号结尾),存为commands.sh。血泪经验:别信题干里写的“执行以下命令”,一定要把hdfs dfs -ls /user这种探路命令也提出来——它常被用来验证前置条件是否满足,漏掉就会导致后续命令报No such file or directory。
2.3 答案区的隐式配置:从“正确答案”反推集群配置参数
题库的答案区藏着最硬核的配置线索。例如一道题问:“spark.sql.adaptive.enabled=true开启后,哪个阶段会触发动态分区剪枝?”答案写的是ShuffleHashJoin。这看似是概念题,但结合 Spark 3.2+ 源码可知,该特性依赖spark.sql.adaptive.localShuffleReader.enabled和spark.sql.adaptive.coalescePartitions.enabled协同生效。所以答案本身是开关组合的说明书。我习惯把所有答案中出现的配置项(如mapreduce.map.memory.mb=2048、yarn.scheduler.capacity.root.default.maximum-capacity=60)用正则spark\..*?=.*?;|mapreduce\..*?=.*?;|yarn\..*?=.*?;提取,生成cluster-config.properties。这个文件比官方文档更真实——它记录了出题环境实际生效的参数值,而非理论最大值。比如某题答案写设置 hive.exec.dynamic.partition.mode=nonstrict,你就知道该 Hive 版本不支持 strict 模式下的全动态分区,必须显式建好一级分区目录。
3. 本地环境复现:基于题库指令构建 Hadoop + Spark 伪分布式集群
3.1 环境版本锚定:为什么必须用 Hadoop 3.3.6 而非 3.4.0?
题库中所有hdfs dfs -setfacl命令都带-m user:alice:rwx参数,而 Hadoop 3.4.0 将 ACL 修改语法改为-setfacl -m u:alice:rwx。这就是版本锚点。我用grep -r "hdfs dfs -setfacl" *.doc | head -5快速扫描,确认题库使用旧语法,锁定 Hadoop ≤ 3.3.x。再查 Spark 题目中的--conf spark.sql.adaptive.enabled=true,该参数在 Spark 3.2.0 引入,3.4.2 是当前稳定版。因此环境栈确定为:
- Hadoop:3.3.6(Apache 官方二进制包)
- Spark:3.4.2(Pre-built for Hadoop 3.3)
- Java:JDK 11.0.22(Hadoop 3.3+ 强制要求 JDK 11)
安装时严格按顺序:先解压 Hadoop,配置core-site.xml(fs.defaultFS=hdfs://localhost:9000)、hdfs-site.xml(dfs.replication=1)、yarn-site.xml(yarn.resourcemanager.hostname=localhost),再格式化 NameNode:
# 注意:必须用 hadoop 用户执行,避免权限问题 sudo adduser hadoop sudo su - hadoop $HADOOP_HOME/bin/hdfs namenode -format关键参数说明:dfs.replication=1是伪分布式核心,避免因 DataNode 数量不足导致hdfs dfs -put报File could only be replicated to 0 nodes;yarn.resourcemanager.hostname=localhost确保 ResourceManager 绑定本机,否则yarn application -list查不到任务。
3.2 Spark on YARN 的致命配置:spark-defaults.conf的五处必改项
题库中spark-submit --master yarn命令若直接执行,90% 会卡在Application submission failed。原因在于 Spark 默认配置未适配 YARN。必须修改$SPARK_HOME/conf/spark-defaults.conf:
| 参数 | 题库线索 | 必设值 | 作用说明 |
|---|---|---|---|
spark.master | 题干明确写--master yarn | yarn | 强制 Spark 使用 YARN 作为集群管理器,而非默认的 local[*] |
spark.yarn.jars | 题库spark-submit命令含--jars,说明依赖外部 JAR | $SPARK_HOME/jars/* | 将 Spark 自带 JAR 推送到 HDFS,避免每个 Application 都上传 |
spark.yarn.archive | 题库答案提到 “减少 shuffle 传输量” | $SPARK_HOME/jars/spark-*.jar | 将常用 JAR 打包为 archive,加速 Executor 启动 |
spark.sql.adaptive.enabled | 多道题答案涉及 Adaptive Query Execution | true | 启用动态优化,否则题库中AQE相关题目无法验证 |
spark.serializer | 题库有KryoSerializer相关错误排查题 | org.apache.spark.serializer.KryoSerializer | 替换默认 JavaSerializer,提升序列化性能,避免NotSerializableException |
修改后执行:
# 将 Spark JAR 推送到 HDFS(题库中 `hdfs dfs -put` 的前置动作) $HADOOP_HOME/bin/hdfs dfs -mkdir -p /spark-jars $HADOOP_HOME/bin/hdfs dfs -put $SPARK_HOME/jars/* /spark-jars/ # 验证 YARN 是否接收资源请求 $HADOOP_HOME/bin/yarn application -list -appStates ALL | head -3 # 正常应返回 APPLICATION_ID、NAME、STATE 三列3.3 Hive 集成验证:用题库中的ods_user_log表走通端到端流程
题库高频出现ods_user_log表,其建表语句藏在「Hive 数据仓库设计」章节。我们用它验证 Hive on Spark:
-- 从题库提取的建表语句(注意 LOCATION 指向 HDFS) CREATE EXTERNAL TABLE ods_user_log ( uid STRING, event_time STRING, page_id STRING ) PARTITIONED BY (dt STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/user/hive/warehouse/ods_user_log';执行前必须确保:
- HDFS 中
/user/hive/warehouse目录存在且hadoop用户有写权限:$HADOOP_HOME/bin/hdfs dfs -mkdir -p /user/hive/warehouse $HADOOP_HOME/bin/hdfs dfs -chown -R hadoop:hadoop /user/hive/warehouse - Hive Metastore 服务启动(题库答案提到
metastore,说明非嵌入模式):# 启动 Derby 作为元数据库(题库简易场景) $HIVE_HOME/bin/schematool -initSchema -dbType derby $HIVE_HOME/bin/hive --service metastore & - 将题库提供的
access.log样例数据上传:# 题库中 `hdfs dfs -put ./data/access.log /input/weblog/` 的实操 mkdir -p ./data echo -e "u001\t2023-01-01 10:00:00\tpage001\nu002\t2023-01-01 10:05:00\tpage002" > ./data/access.log $HADOOP_HOME/bin/hdfs dfs -put ./data/access.log /input/weblog/
然后在 Beeline 中执行建表 + 加载分区:
-- 创建表(题库答案强调 EXTERNAL 关键字) CREATE EXTERNAL TABLE ods_user_log (...) LOCATION '/user/hive/warehouse/ods_user_log'; -- 加载数据(题库中 `LOAD DATA INPATH` 的替代方案,更符合生产) INSERT OVERWRITE TABLE ods_user_log PARTITION(dt='2023-01-01') SELECT uid, event_time, page_id FROM ( SELECT split(value, '\t')[0] as uid, split(value, '\t')[1] as event_time, split(value, '\t')[2] as page_id FROM default.weblog_raw ) t; -- 验证(题库第 7 题:查询 2023-01-01 分区数据量) SELECT COUNT(*) FROM ods_user_log WHERE dt='2023-01-01';现象:若返回1,说明 HDFS → Hive → Spark SQL 全链路打通;若报SemanticException [Error 10001]: Table not found,检查hive-site.xml中javax.jdo.option.ConnectionURL是否指向正确的 Derby 路径(题库答案提示jdbc:derby:/opt/hive/metastore_db)。
4. 避坑指南:题库执行中五个高频翻车现场与后悔药
4.1 现象:hdfs dfs -ls /返回ls: Call From localhost/127.0.0.1 to localhost:9000 failed
原因:NameNode 未启动,或core-site.xml中fs.defaultFS的端口与hdfs-site.xml中dfs.namenode.http-address冲突(如前者写9000,后者写9870)。题库中所有hdfs命令默认连接9000,但 Hadoop 3.3+ Web UI 端口已改为9870,命令行端口仍是9000。
解决:
# 检查 NameNode 进程 jps | grep NameNode # 应有 NameNode 进程 # 若无,重新格式化并启动 $HADOOP_HOME/sbin/start-dfs.sh # 验证端口监听 netstat -tuln | grep :9000 # 必须有 LISTEN 状态4.2 现象:spark-submit --master yarn后yarn application -list查不到任务,日志显示Failed to connect to server
原因:Spark 配置spark.yarn.stagingDir指向 HDFS 路径,但该路径不存在或权限不足。题库中--jars参数要求 Spark 将依赖 JAR 上传至此目录。
解决:
# 创建 staging 目录并赋权(题库答案提到 “staging dir must be writable”) $HADOOP_HOME/bin/hdfs dfs -mkdir -p /user/spark/staging $HADOOP_HOME/bin/hdfs dfs -chown -R hadoop:hadoop /user/spark/staging # 在 spark-defaults.conf 中显式设置 echo "spark.yarn.stagingDir /user/spark/staging" >> $SPARK_HOME/conf/spark-defaults.conf4.3 现象:HiveQLINSERT OVERWRITE执行成功,但SELECT COUNT(*)返回 0
原因:题库中ods_user_log表为外部表(EXTERNAL),但数据文件未按 Hive 分区规范存放。题库样例数据access.log上传到/input/weblog/,而表 LOCATION 是/user/hive/warehouse/ods_user_log,两者未建立软链接或数据未移动。
解决:
# 方案一:移动数据(题库答案推荐) $HADOOP_HOME/bin/hdfs dfs -mv /input/weblog/access.log /user/hive/warehouse/ods_user_log/dt=2023-01-01/ # 方案二:修复分区(题库第 12 题考点) hive -e "MSCK REPAIR TABLE ods_user_log;" # 或手动添加分区 hive -e "ALTER TABLE ods_user_log ADD PARTITION(dt='2023-01-01') LOCATION '/user/hive/warehouse/ods_user_log/dt=2023-01-01';"4.4 现象:Spark Scala 代码中sc.textFile("hdfs://localhost:9000/input/weblog")报java.net.UnknownHostException: localhost
原因:/etc/hosts中localhost解析异常,或 Spark 配置spark.hadoop.fs.defaultFS未覆盖core-site.xml。题库中所有hdfs://URI 都用localhost,但 Java 网络栈可能解析失败。
解决:
# 强制 hosts 解析(题库答案提示 “check /etc/hosts”) echo "127.0.0.1 localhost" | sudo tee -a /etc/hosts # 在 spark-defaults.conf 中覆盖 HDFS 地址 echo "spark.hadoop.fs.defaultFS hdfs://localhost:9000" >> $SPARK_HOME/conf/spark-defaults.conf4.5 现象:执行yarn logs -applicationId application_1234567890_0001显示Log aggregation has not completed
原因:YARN 日志聚合未启用,题库中yarn.application.history-tracking.enabled=true是历史服务开关,但日志聚合需单独配置。
解决:
# 修改 yarn-site.xml <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>604800</value> <!-- 保留 7 天 --> </property> # 重启 YARN $HADOOP_HOME/sbin/stop-yarn.sh && $HADOOP_HOME/sbin/start-yarn.sh5. 题库驱动的深度验证:用一道综合题反向审计你的集群健康度
5.1 选取题库第 23 题:「用户会话超时分析」端到端验证
题库中这道题要求:
- 从
ods_user_log读取原始日志; - 使用 Spark SQL 计算每个用户连续访问的时间差(
LAG(event_time) OVER (PARTITION BY uid ORDER BY event_time)); - 标记间隔 > 1800 秒的记录为新会话;
- 输出
uid, session_id, start_time, end_time, duration到 Hive 表dwd_user_session; - 验证
dwd_user_session分区dt='2023-01-01'的数据量是否等于ods_user_log对应分区的用户数。
这不是编程题,是集群压力测试仪。它同时触发:HDFS 小文件读取(ods_user_log分区下多个小 log 文件)、Spark Shuffle(OVER窗口函数)、Hive 分区写入(INSERT OVERWRITE TABLE dwd_user_session PARTITION(dt='2023-01-01'))、YARN 资源调度(Executor 动态申请)。如果卡在步骤 2,说明spark.sql.adaptive.enabled=true未生效或spark.sql.adaptive.coalescePartitions.enabled=false;如果步骤 4 写入失败,检查hive-site.xml中hive.exec.dynamic.partition.mode=nonstrict是否配置;如果步骤 5 计数不一致,用hdfs dfs -du -h /user/hive/warehouse/dwd_user_session/dt=2023-01-01查看实际文件大小——小于 1KB 说明数据未落盘,大概率是 Spark 写 Hive 时spark.sql.hive.convertMetastoreParquet=false导致格式不兼容(题库答案明确要求设为true)。
5.2 验证脚本:自动化巡检你的伪分布式集群
我把题库中所有高频命令封装成validate-cluster.sh,每次环境重装后必跑:
#!/bin/bash # 集群健康度快检(基于题库指令) echo "=== HDFS 基础 ===" $HADOOP_HOME/bin/hdfs dfs -ls / 2>/dev/null | grep "Found" && echo "✓ NameNode 可达" || echo "✗ NameNode 不可用" echo "=== YARN 资源 ===" $HADOOP_HOME/bin/yarn application -list -appStates NEW,NEW_SAVING,ACCEPTED,RUNNING 2>/dev/null | wc -l | grep -q "0" && echo "✓ YARN 无积压任务" || echo "⚠ YARN 存在运行中任务" echo "=== Hive Metastore ===" $HIVE_HOME/bin/beeline -u "jdbc:hive2://localhost:10000" -e "show databases;" 2>/dev/null | grep "default" && echo "✓ Hive Metastore 连通" || echo "✗ Hive Metastore 断连" echo "=== Spark on YARN ===" $SPARK_HOME/bin/spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi $SPARK_HOME/examples/jars/spark-examples_*.jar 1 2>/dev/null | grep "Pi is roughly" && echo "✓ Spark Pi 成功运行" || echo "✗ Spark on YARN 失败" echo "=== 题库关键路径 ===" $HADOOP_HOME/bin/hdfs dfs -ls /user/hive/warehouse/ods_user_log 2>/dev/null | grep "ods_user_log" && echo "✓ 题库表路径存在" || echo "✗ 题库表路径缺失"执行逻辑说明:
hdfs dfs -ls /检查 NameNode 状态,grep "Found"是 Hadoop 3.3+ 的成功响应关键词;yarn application -list统计非终态任务数,wc -l | grep -q "0"确保无残留任务干扰新作业;beeline连接 HiveServer2,show databases是最轻量的连通性验证;spark-submit运行官方SparkPi,--deploy-mode client避免因cluster模式下 Driver 无法注册导致误判;- 最后检查
ods_user_log路径,这是题库所有 Hive 题目的根目录,缺失即全盘失效。
从那以后我每次重装 Hadoop 或升级 Spark,都强制走一遍这个脚本——它比看日志快 10 倍,比人工敲命令准 100 倍。因为题库不是教你怎么背概念,它是用真实命令告诉你:当hdfs dfs -put成功,yarn application -list有响应,beeline能进,spark-submit能出结果,你的环境才真正活了。希望帮到你。
本文还有配套的精品资源,点击获取