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

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

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


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

  1. 在使用 HDFS 上传文件时,数据以哪种单位进行传输?( )

    • A. 字节 (Byte)

    • B. 块 (Block)

      C. 包 (Packet)

    • D. 文件 (File)

  2. 以下哪个配置文件用于指定 HDFS 的 NameNode 和 DataNode 存储目录?( )

    • A. core-site.xml

    • B. hdfs-site.xml

      C. mapred-site.xml

    • D. yarn-site.xml

  3. Hive 中,删除外部表后,以下说法正确的是( )

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

    • B. 元数据被删除,实际数据保留

      C. 元数据保留,实际数据被删除

    • D. 元数据和实际数据都保留

  4. MapReduce 程序中,Reducer 阶段的输入数据类型是( )

    • A. <Key, Value> 形式的键值对

    • B. <Key, List<Value>> 形式的键值对集合

      C. 单个值

    • D. 整个文件内容

  5. 在 Hive 中,加载本地文件到分区表的正确语句是( )

    • A. LOAD DATA INPATH '/local/file' INTO TABLE tbl PARTITION (dt='2023');

    • B. LOAD DATA LOCAL INPATH '/local/file' INTO TABLE tbl PARTITION (dt='2023');

    • C. INSERT INTO TABLE tbl PARTITION (dt='2023') FROM LOCAL '/local/file';

    • D. LOAD DATA LOCAL FROM '/local/file' OVERWRITE TABLE tbl;

  6. YARN 中,ResourceManager 和 NodeManager 的关系是( )

    • A. 主从关系

    • B. 对等关系

      C. 流水线关系

    • D. 无直接关系

  7. HDFS 默认副本数量通常配置为( )

    • A. 1

    • B. 2

      C. 3

    • D. 5

  8. 在 Linux 中,生成 SSH 免密登录密钥的命令是( )

    • A. ssh-keygen -t rsa

    • B. ssh-copy-id

    • C. ssh-add

    • D. ssh -o

  9. Hive 中,向已有分区表插入数据时,若未指定分区,将会( )

    • A. 插入到默认分区

    • B. 报错

    • C. 插入到最新创建的分区

    • D. 忽略该操作

  10. 以下哪个组件负责 HDFS 中的元数据管理?( )

    • A. DataNode

    • B. NameNode

    • C. SecondaryNameNode

    • D. ResourceManager


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

1.(8分)简述 HDFS 读取文件的过程,包括客户端与 NameNode、DataNode 的交互流程。

2.(8分)Hive 中内部表和外部表的应用场景分别是什么?为什么说外部表更适合数据共享场景?

3.(8分)给定一个 Hadoop 集群场景(1台 Master,2台 Slave),请列出从格式化到启动完整的命令操作步骤,并说明如何验证集群启动成功。

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


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

1.(8分)Hive SQL 编程

假设有一张 Hive 表 employee,结构如下:

text

复制代码
emp_id INT, emp_name STRING, dept STRING, salary INT

请写出 HQL 语句,查询每个部门薪资最高的员工信息。

2.(8分)HDFS Shell 命令操作

假设你需要在 HDFS 上完成以下操作,请写出对应的命令:

  1. 创建一个目录 /user/test/data

  2. 将本地文件 /local/data.txt 上传到该目录

  3. 查看该目录下文件的详细信息

  4. 将该目录的所有者权限设置为可读可写可执行

3.(8分)MapReduce 编程逻辑

给定数据:apple banana apple orange banana apple

请写出 MapReduce 中 Map 阶段Reduce 阶段 分别输出的结果格式。


四、综合应用题(14分)

背景: 某公司使用 Hive 进行日志分析。日志数据格式如下:

text

复制代码
log_id, user_id, action, duration, timestamp
1,1001,login,5,2023-10-01 10:00:00
2,1002,login,3,2023-10-01 10:05:00
3,1001,logout,2,2023-10-01 10:10:00
4,1003,purchase,30,2023-10-01 10:20:00
5,1001,purchase,15,2023-10-01 10:30:00

任务:

(1) 建表与加载 (6分)

要求创建一个 Hive 分区表 log_2023,以 log_date(由 timestamp 提取)作为分区字段,并加载以上数据到分区 log_date='2023-10-01'

(2) 数据分析 (4分)

统计每个 user_id 的总访问时长(sum of duration),并按照时长降序输出。

(3) 优化与故障处理 (4分)

若上述日志数据量极大(如每天几亿条),且查询经常按 user_idaction 两个维度过滤,请提出两种优化方案。(可结合分区、分桶、存储格式等)


📝 参考答案与详细解析(卷二)

一、单项选择题答案

  1. C (数据以 packet 为单位沿 pipeline 传输)

  2. Bdfs.namenode.name.dirdfs.datanode.data.dir 在 hdfs-site.xml 中配置)

  3. B (外部表只删元数据)

  4. B (Reducer 输入是 Map 输出按 key 聚合后的 List<Value>

  5. B (本地文件必须加 LOCAL;路径写完整)

  6. A (ResourceManager 管理 NodeManager)

  7. C (默认 3 副本,可配置 dfs.replication

  8. Assh-keygen 生成密钥,ssh-copy-id 分发)

  9. B (插入分区表必须指定分区,否则报错)

  10. B (NameNode 管理元数据,DataNode 存储数据)


二、理论简答题解析

1. HDFS 读取流程(关键点):

① 客户端向 NameNode 请求读取文件。

② NameNode 返回该文件存储的数据块位置(DataNode 列表)。

③ 客户端直接与最近的一个 DataNode 建立连接读取数据块。

④ 若该 DataNode 故障,客户端自动切换到下一个副本节点继续读取。

2. 内部表 vs 外部表应用场景:

内部表 :适用于临时数据、中间结果、生命周期与 Hive 绑定(删表即删数据)。

外部表 :适用于原始数据、共享数据、长期保留数据(删表只删元数据)。

为什么更适合共享?

因为多个 Hive 表或不同用户可以基于同一份 HDFS 数据建立外部表,无需拷贝数据。修改源数据后所有外部表即时可见。

3. 集群启动与验证步骤:

启动操作命令:

hdfs namenode -format (仅首次启动需格式化)

start-dfs.sh (启动 HDFS)

start-yarn.sh (启动 YARN)

验证集群正常启动:

① 执行 jps 查看进程:Master 应有 NameNode、ResourceManager;Slave 应有 DataNode、NodeManager。

② 浏览器访问 http://master:50070(HDFS 管理页面)。

③ 浏览器访问 http://master:8088(YARN 管理页面)。

4. Reduce 阶段 Shuffle 处理:

Fetch(拉取) :Reduce 任务从多个 Map 节点拉取属于自己分区的数据。

Merge(合并) :将拉取到的多组 Map 输出合并为一个大文件。

Sort(排序) :对 key 进行排序(若未在 Map 阶段排序完成)。

Group(分组) :将相同 key 的 value 收集为 List,然后交给 reduce() 函数处理。


三、程序题答案

1. Hive 查询每个部门薪资最高员工:

sql

复制代码
SELECT e.dept, e.emp_name, e.salary
FROM employee e
JOIN (
    SELECT dept, MAX(salary) AS max_salary
    FROM employee
    GROUP BY dept
) m ON e.dept = m.dept AND e.salary = m.max_salary;
-- 或者使用窗口函数(Hive 0.11+)
SELECT dept, emp_name, salary
FROM (
    SELECT *, RANK() OVER(PARTITION BY dept ORDER BY salary DESC) as r
    FROM employee
) t WHERE t.r = 1;

2. HDFS 命令操作:

bash

复制代码
1) hdfs dfs -mkdir -p /user/test/data
2) hdfs dfs -put /local/data.txt /user/test/data/
3) hdfs dfs -ls /user/test/data/
4) hdfs dfs -chmod 700 /user/test/data/

3. MapReduce 输出格式:

Map 输出:

<apple, 1>, <banana, 1>, <apple, 1>, <orange, 1>, <banana, 1>, <apple, 1>

Reduce 输出:

<apple, 3>, <banana, 2>, <orange, 1>


四、综合应用题解析

(1) 建表与加载数据

sql

复制代码
-- 建表(提取 log_date 作为分区)
CREATE TABLE log_2023 (
    log_id INT,
    user_id INT,
    action STRING,
    duration INT,
    timestamp STRING
)
PARTITIONED BY (log_date STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

-- 加载数据(假设数据在本地文件)
LOAD DATA LOCAL INPATH '/path/log_data.txt' 
OVERWRITE INTO TABLE log_2023 
PARTITION (log_date='2023-10-01');

(2) 统计用户总时长

sql

复制代码
SELECT user_id, SUM(duration) as total_duration
FROM log_2023
WHERE log_date='2023-10-01'
GROUP BY user_id
ORDER BY total_duration DESC;

(3) 优化方案(二选一即可)

方案一:分桶(Bucketing)

user_id 字段进行哈希分桶(例如分 16 个桶),查询按 user_id 过滤时能快速定位到对应桶,减少全表扫描。

方案二:选择高效列式存储格式

将存储格式从 TEXTFILE 改为 ORCPARQUET,并启用压缩。ORC 格式支持谓词下推(Predicate Pushdown),能在读取时提前过滤 user_idaction 等条件,大幅减少 I/O。

方案三:多级分区

log_date 之外再增加 user_id 的分区前缀(例如 user_id_prefix),但需注意分区数量过多可能导致元数据膨胀。