《Hadoop生态圈与Hive基础》模拟试卷

满分:100分 | 考试时间:90分钟


一、单项选择题(每题2分,共30分)

  1. 在Hadoop集群中,负责资源管理和调度的核心组件是( )

    • A. HDFS

    • B. MapReduce
      C. YARN
      D. Hive

  2. 以下命令中,用于查看HDFS文件系统详细信息的是( )

    • A. hadoop fs -ls

    • B. hadoop fs -cat
      C. hadoop fs -du
      D. hadoop fs -tail

  3. 在Hive中,创建外部表时必须使用的关键字是( )

    • A. INTERNAL

    • B. EXTERNAL
      C. TEMPORARY
      D. MANAGED

  4. HDFS中,负责存储实际数据块(Block)的节点是( )

    • A. NameNode
      B. SecondaryNameNode
      C. DataNode
      D. ResourceManager

  5. 关于Hive分区表,下列说法正确的是( )

    • A. 分区字段可以在表的定义字段中重复出现

    • B. 分区字段的值必须在定义表中提前定义
      C. 分区字段不能出现在表定义的普通字段中

    • D. 分区表只能在创建后动态添加分区

  6. 默认情况下,Hive内部表的数据存储在( )

    • A. /user/root/

    • B. /hive/data/
      C. /user/hive/warehouse/
      D. /tmp/

  7. MapReduce中,Map阶段的输出数据经处理后进入Reducer阶段,中间这个过程称为( )

    • A. Partition
      B. Shuffle
      C. Sort
      D. Merge

  8. YARN中,ResourceManager默认的WEB UI端口号通常是( )

    • A. 50070
      B. 8088
      C. 9000
      D. 50075

  9. 在Linux系统中,将目录及其内容递归授予rwx权限的命令是( )

    • A. chmod 777 /path
      B. chmod -R 755 /path
      C. chown user:group /path
      D. chmod 755 /path/*

  10. 关于Hive内部表和外部表的区别,以下说法错误的是( )

    • A. 删除内部表会删除元数据和实际数据

    • B. 删除外部表只删除元数据,不删除实际数据

    • C. 外部表更适合作为源数据表或数据共享

    • D. 默认创建的Hive表是外部表


二、理论简答题(每题8分,共32分)

1. (8分) 请描述HDFS写数据的具体流程。
提示:涉及Pipeline机制、与NameNode/DataNode的交互。

2. (8分) 简述Hive分区表相比普通表的优缺点,并解释为什么分区字段不能在表的普通定义字段中重复出现。

3. (8分) 给定一个微型Hadoop集群(1台Master,2台Slave),请列举需要配置的关键文件,并说明如何验证集群是否正常启动。

4. (8分) MapReduce过程中,Shuffle机制在Map阶段做了哪些处理?


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

1. (8分) MapReduce计算题
给定输入数据:

text

student teacher student may can can may

请写出 Map阶段 输出的完整键值对(Key-Value pairs)形式。

2. (8分) Hive Shell命令
假设你在Hadoop本地文件系统有一个文件 /home/user/data.txt,你需要在Hive中创建一个分区表 student_2023(分区字段 year=2023),并将该本地文件的数据加载到该分区表中。
请写出完整的HQL语句。

3. (8分) Java HDFS编程
要求编写一段Java代码的核心片段,实现从本地路径 /local/data.txt 上传文件到HDFS路径 /user/hive/data/
请写出:

  • 核心类名

  • 核心代码逻辑(包括FileSystem实例化、路径设置、异常处理)


四、综合应用题(14分)

背景: 现有学生数据文件 students.txt,内容格式如下:

text

id,name,age,department,register_date
1,张三,20,计算机系,2023-09-01
2,李四,22,数学系,2022-09-01
3,王五,19,计算机系,2023-09-15
4,赵六,21,数学系,2023-10-01
5,孙七,23,英语系,2021-09-01

任务:(请分步完成)

(1) 建表与加载数据 (6分)
请写出创建一个 外部表 student_2023 的HiveQL语句。
要求:

  • 字段根据文件内容定义。

  • 字段分隔符为逗号 ,

  • 数据实际存储在 /user/hive/external/student_2023

  • 表中只保留 register_date 在 2023年及以后 的数据(提示:可通过分区或查询加载实现)。

(2) 数据统计 (4分)
请使用HiveQL统计 “每个系的学生人数”,并按照人数从大到小排序输出。

(3) 故障处理 (4分)
如果在删除该表时,你发现不小心把原始数据文件 students.txt 也删除了,请分析原因,并说明这是由内部表还是外部表造成的,如何避免?


📝 参考答案与详细解析

一、单项选择题答案

  1. C (YARN负责资源调度)

  2. A (hadoop fs -ls查看列表)

  3. B

  4. C

  5. C (分区字段不能出现在普通字段定义中,它是独立的维度)

  6. C

  7. B

  8. B (8088是ResourceManager,50070是NameNode)

  9. B (-R递归,755表示所有者rwx,组和他人rx)

  10. D (默认创建的是内部表


二、理论简答题解析

1. HDFS写数据流程(关键点):

① 客户端向NameNode发起上传请求,NameNode检查文件是否存在/权限。
② NameNode返回可写入的DataNode列表(通常按副本数)。
③ 客户端与DataNode建立Pipeline(管线)传输数据块(Block)。
④ 数据以包(Packet)为单位沿Pipe逐副本写入。
⑤ 写入完成后由DataNode返回确认(Ack),客户端收到确认后告知NameNode完成。

2. Hive分区表的优缺点:

优点:查询效率大幅提升(避免全表扫描),数据管理方便(按分区添加/删除)。
缺点:创建过多的分区可能导致元数据膨胀,影响小文件读写性能。
解释:分区字段是虚拟的维度列(如year),它在物理存储上作为目录层级,与表内实际数据字段无关,因此不能重复定义。

3. 微型集群配置与验证:

关键配置文件core-site.xmlhdfs-site.xmlmapred-site.xmlyarn-site.xmlslaves
验证方式

  • 运行 jps 命令:Master应显示NameNode, ResourceManager;Slave应显示DataNode, NodeManager。

  • 浏览器访问 http://master_ip:50070(NameNode UI);http://master_ip:8088(ResourceManager UI)。

4. Map阶段Shuffle处理:

① 分区(Partition):根据Key决定数据去往哪个Reducer。
② 排序(Sort):对Map输出的Key进行排序。
③ 溢写(Spill):内存缓冲区满后写入磁盘,可能进行合并(Merge)。
④ Fetch:Reducer从Map节点拉取数据(需要的话)。


三、程序题答案

1. Map阶段输出(按单词拆分):

text

<student, 1>
<teacher, 1>
<student, 1>
<may, 1>
<can, 1>
<can, 1>
<may, 1>

2. Hive加载本地数据到分区表:

sql

-- 第一步:建表
CREATE EXTERNAL TABLE student_2023 (
  id INT, 
  name STRING,
  age INT,
  department STRING
) PARTITIONED BY (year INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;

-- 第二步:加载本地数据到特定分区
LOAD DATA LOCAL INPATH '/home/user/data.txt' 
OVERWRITE INTO TABLE student_2023 
PARTITION (year=2023);

3. Java HDFS核心代码:

java

// 核心类名
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

// 核心代码
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
Path src = new Path("/local/data.txt");
Path dst = new Path("/user/hive/data/");
try {
    fs.copyFromLocalFile(src, dst);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    fs.close();
}

四、综合应用题答案

(1) 建表与加载

sql

-- 创建外部表
CREATE EXTERNAL TABLE student_2023 (
  id INT,
  name STRING,
  age INT,
  department STRING,
  register_date DATE
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
LOCATION '/user/hive/external/student_2023';

-- 加载数据(同时过滤2023年及以后的数据)
INSERT OVERWRITE TABLE student_2023
SELECT * FROM student_2023_source 
WHERE year(register_date) >= 2023;
-- 注:假设原始数据已加载到student_2023_source表,或者利用分区方式。

更简单的方法(若直接生成数据):

sql

LOAD DATA LOCAL INPATH '/path/students.txt' OVERWRITE INTO TABLE student_2023;
-- 然后根据register_date过滤,但一般建表时直接利用分区策略。

(2) 统计与排序

sql

SELECT department, COUNT(*) as student_num 
FROM student_2023 
GROUP BY department 
ORDER BY student_num DESC;

(3) 故障分析

原因:如果删除表时,实际数据文件被删除了,说明你创建的是 内部表
避免方法:创建表时使用关键字 CREATE EXTERNAL TABLE,删除时只会删除元数据,不会误删HDFS上的原始数据文件。

更多推荐