《Hadoop与大数据技术》模拟考试卷

考试时间:120分钟 满分:100分

题型

选择题

理论题

程序题

综合体

分值

30分

32分

24分

14分


一、选择题(每题2分,共15题,计30分)

请从四个选项中选出最合适的一项。

  1. 在Hadoop集群中,负责整个集群资源管理和作业调度的组件是( )。

    A. NameNode B. DataNode C. YARN D. SecondaryNameNode

  2. HDFS中,默认的数据块(Block)大小是( )。

    A. 64MB B. 128MB C. 256MB D. 512MB

  3. 下列哪个命令用于查看HDFS根目录下的文件列表?( )

    A. hadoop fs -cat / B. hadoop fs -ls / C. hadoop fs -mkdir / D. hadoop fs -put /

  4. Hive中,删除外部表时,以下说法正确的是( )。

    A. 元数据和实际数据都被删除

    B. 只删除元数据,不删除实际数据

    C. 只删除实际数据,不删除元数据

    D. 两者都不删除

  5. MapReduce过程中,将Map的输出按照Key进行分组、排序并传输给Reducer的机制称为( )。

    A. Split B. Shuffle C. Combine D. Partition

  6. HDFS中,存储文件元数据(如文件与数据块映射)的组件是( )。

    A. NameNode B. DataNode C. SecondaryNameNode D. JournalNode

  7. 在Linux系统中,将文件test.txt的权限设置为所有者可读写执行、组用户可读执行、其他用户可读执行的命令是( )。

    A. chmod 755 test.txt B. chmod 777 test.txt C. chmod 644 test.txt D. chmod 555 test.txt

  8. 关于Hive分区表,下列说法错误的是( )。

    A. 分区字段可以是表中已有的字段

    B. 分区可以提高查询效率

    C. 分区字段在表结构中单独列出

    D. 分区表可以同时使用多个分区字段

  9. YARN ResourceManager的默认Web UI端口是( )。

    A. 9870 B. 8088 C. 50070 D. 9000

  10. 在HDFS中,一个文件被写入成功后,NameNode会收到来自( )的块报告。

    A. 客户端 B. DataNode C. SecondaryNameNode D. ResourceManager

  11. 以下哪种Hive存储格式最适合列式存储和高压缩比?( )

    A. TEXTFILE B. SEQUENCEFILE C. ORC D. CSV

  12. 在Hadoop集群启动前,必须执行一次的命令是( )。

    A. start-all.sh B. hdfs namenode -format C. jps D. hdfs dfsadmin -report

  13. 关于HDFS副本策略,默认情况下每个数据块有几个副本?( )

    A. 1 B. 2 C. 3 D. 4

  14. 在MapReduce单词统计程序中,Map阶段的输出是( )。

    A. <单词, 出现次数> B. <单词, 1> C. <行号, 单词> D. <偏移量, 单词>

  15. 使用Shell脚本统计/data/logs目录下文件数量的命令是( )。

    A. ls /data/logs | wc -l B. ls -l /data/logs | wc -c C. find /data/logs -type f | wc -l D. count /data/logs


二、理论题(每题8分,共4题,计32分)

1. 简述HDFS的写入流程(以客户端写入一个200MB文件为例,说明与NameNode、DataNode的交互过程,以及Pipeline复制机制和确认机制)。

2. 解释Hive中内部表与外部表的区别,包括创建方式、数据存储位置、删除时的行为差异。并举例说明什么场景适合使用外部表。

3. 描述MapReduce中Shuffle机制的作用,并结合单词统计例子(输入:“hello world hello hadoop”),写出Map阶段的完整输出、Shuffle后的中间结果以及Reduce阶段的最终输出。

4. 假设你要部署一个微型Hadoop集群(1台Master,2台Slave),请列出至少三个核心配置文件名称,并简要说明格式化NameNode的时机和启动集群的关键命令。如何验证集群正常工作?


三、程序题(每题8分,共3题,计24分)

1. HiveQL操作

现有学生表结构如下:

字段名

类型

描述

stu_id

INT

学号

stu_name

STRING

姓名

dept

STRING

院系

age

INT

年龄

reg_date

STRING

注册日期

请完成以下任务:

  1. 创建一个内部表student_info,字段分隔符为逗号,存储格式为TEXTFILE。(2分)

  2. 向表中插入两条记录:(1001,'赵六','计算机系',22,'2024-09-01') 和 (1002,'钱七','数学系',21,'2024-09-02)。(2分)

  3. 查询2024年及以后注册的学生信息,并按年龄降序排列。(2分)

  4. 统计每个院系的学生人数和平均年龄。(2分)

2. Java HDFS API编程

请编写一个完整的Java程序,实现从HDFS路径/user/data/input.txt下载文件到本地路径/home/user/local/。要求:

  • 列出需要导入的主要Hadoop包(至少3个)。(2分)

  • 展示获取FileSystem实例的代码。(2分)

  • 展示核心下载代码(使用copyToLocalFile)。(2分)

  • 添加异常处理(try-catch)。(2分)

3. Shell脚本操作

请写出实现以下功能的Shell命令或脚本片段:

  1. 判断HDFS目录/user/test是否存在,若不存在则创建。(2分)

  2. 将本地当前目录下所有以data_开头的文件上传到HDFS的/user/test目录中。(2分)

  3. 递归列出HDFS目录/user/test下的所有文件和子目录。(2分)

  4. 统计本地目录/var/log下普通文件的数量(不包括子目录)。(2分)


四、综合体(共14分)

题目:HDFS读写流程与集群配置综合(共3小题,分值分别为6分、4分、4分)

某公司需要搭建一个Hadoop集群来处理日志数据,集群规模为1台NameNode(兼ResourceManager),3台DataNode(兼NodeManager)。现有一个500MB的日志文件需要上传至HDFS进行分析。

  1. (6分)​ 请详细描述客户端上传该500MB文件的完整流程,包括:

    • 客户端与NameNode的交互过程;

    • 文件如何被切分成数据块(默认128MB),并说明每个块的大小;

    • 数据块通过Pipeline复制到多个DataNode的具体过程;

    • 写入完成后NameNode如何确认并更新元数据。

  2. (4分)​ 假设你在配置该集群时,需要修改以下参数,请写出它们通常在哪个配置文件中设置,并简要说明其含义:

    • dfs.replication(副本数)

    • dfs.namenode.name.dir(NameNode元数据存储路径)

    • yarn.nodemanager.resource.memory-mb(NodeManager可用内存)

  3. (4分)​ 集群启动后,你发现无法通过Web UI访问NameNode(默认端口9870),请列举至少两种可能的故障原因及对应的排查命令或解决方法。


—— 试卷结束 ——


参考答案

一、选择题

  1. C 2. B 3. B 4. B 5. B 6. A 7. A 8. A 9. B 10. B 11. C 12. B 13. C 14. B 15. A (或C,取决于是否包含子目录,标准答案为A)

二、理论题(要点)

1. HDFS写入流程

  • 客户端向NameNode请求创建文件,NameNode检查权限、是否存在,通过后返回可写入的DataNode列表。

  • 客户端将200MB文件切分为两个Block(128MB+72MB)。

  • 对每个Block,客户端将其发送给第一个DataNode,第一个DataNode转发给第二个,第二个转发给第三个,形成Pipeline。

  • 每个DataNode写入完成后向NameNode发送块报告,客户端收到所有确认后通知NameNode,NameNode更新元数据。

2. 内部表 vs 外部表

  • 内部表:默认创建,数据存储在/user/hive/warehouse,删除时元数据和数据均删除。

  • 外部表:使用CREATE EXTERNAL TABLE,可指定LOCATION,删除时只删元数据,数据保留。

  • 场景:数据需要被多个工具共享时(如Pig、Spark)适合用外部表。

3. Shuffle机制与单词统计

  • Map输出:<hello,1>, <world,1>, <hello,1>, <hadoop,1>

  • Shuffle后(分组):<hello,[1,1]>, <world,[1]>, <hadoop,[1]>

  • Reduce输出:<hello,2>, <world,1>, <hadoop,1>

4. 集群部署

  • 配置文件:core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml,workers

  • 格式化:仅首次启动前执行hdfs namenode -format

  • 启动命令:start-dfs.shstart-yarn.sh

  • 验证:jps查看进程;访问http://master:9870http://master:8088;运行示例程序。

三、程序题

1. HiveQL

sql

-- (1) 建表 CREATE TABLE student_info ( stu_id INT, stu_name STRING, dept STRING, age INT, reg_date STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; -- (2) 插入数据 INSERT INTO TABLE student_info VALUES (1001,'赵六','计算机系',22,'2024-09-01'), (1002,'钱七','数学系',21,'2024-09-02'); -- (3) 查询2024年及以后,按年龄降序 SELECT * FROM student_info WHERE reg_date >= '2024-01-01' ORDER BY age DESC; -- (4) 分组统计 SELECT dept, COUNT(*) AS cnt, AVG(age) AS avg_age FROM student_info GROUP BY dept;

2. Java HDFS API

java
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import java.net.URI; public class HDFSDownload { public static void main(String[] args) { Configuration conf = new Configuration(); try { FileSystem fs = FileSystem.get(new URI("hdfs://master:9000"), conf, "hadoop"); Path src = new Path("/user/data/input.txt"); Path dst = new Path("/home/user/local/"); fs.copyToLocalFile(false, src, dst); fs.close(); System.out.println("Download success."); } catch (Exception e) { e.printStackTrace(); } } }

所需包:hadoop-common,hadoop-hdfs,hadoop-client

3. Shell脚本

bash
# 1. 判断并创建目录 hdfs dfs -test -d /user/test || hdfs dfs -mkdir -p /user/test # 2. 上传以data_开头的文件 hdfs dfs -put ./data_* /user/test/ # 3. 递归列出目录 hdfs dfs -ls -R /user/test # 4. 统计本地普通文件数量(不含子目录) find /var/log -maxdepth 1 -type f | wc -l # 或 ls -l /var/log | grep "^-" | wc -l

四、综合体

1. 写入流程

  • 客户端请求NameNode创建文件,NameNode检查后返回可写入的DataNode列表(例如DN1、DN2、DN3)。

  • 500MB文件被切分为4个Block:128MB、128MB、128MB、116MB。

  • 对于每个Block,客户端将其发送给DN1,DN1边收边转发给DN2,DN2转发给DN3,形成Pipeline。数据以packet为单位传输。

  • 每个DataNode写入完成后向NameNode发送块报告,客户端收到所有DN确认后通知NameNode,NameNode更新元数据。

2. 配置文件

  • dfs.replicationhdfs-site.xml,设置副本数。

  • dfs.namenode.name.dirhdfs-site.xml,设置NameNode元数据存储路径。

  • yarn.nodemanager.resource.memory-mbyarn-site.xml,设置NodeManager可用物理内存。

3. 故障排查

  • 可能原因1:NameNode进程未启动。→ 使用jps查看是否有NameNode进程,若无则执行hdfs namenode启动。

  • 可能原因2:防火墙阻止了9870端口。→ 使用systemctl stop firewalld临时关闭防火墙,或开放端口。

  • 可能原因3:配置文件hdfs-site.xmldfs.http.address未正确设置。→ 检查并重启服务。

  • 可能原因4:浏览器访问地址错误。→ 确认主机名/IP正确,使用curl http://localhost:9870测试。