《Hadoop生态圈与Hive基础》模拟试卷(卷二)
满分:100分 | 考试时间:90分钟
一、单项选择题(每题2分,共30分)
-
在使用 HDFS 上传文件时,数据以哪种单位进行传输?( )
-
A. 字节 (Byte)
-
B. 块 (Block)
C. 包 (Packet)
-
D. 文件 (File)
-
-
以下哪个配置文件用于指定 HDFS 的 NameNode 和 DataNode 存储目录?( )
-
A.
core-site.xml -
B.
hdfs-site.xmlC.
mapred-site.xml -
D.
yarn-site.xml
-
-
Hive 中,删除外部表后,以下说法正确的是( )
-
A. 元数据和实际数据都被删除
-
B. 元数据被删除,实际数据保留
C. 元数据保留,实际数据被删除
-
D. 元数据和实际数据都保留
-
-
MapReduce 程序中,Reducer 阶段的输入数据类型是( )
-
A.
<Key, Value>形式的键值对 -
B.
<Key, List<Value>>形式的键值对集合C. 单个值
-
D. 整个文件内容
-
-
在 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;
-
-
YARN 中,ResourceManager 和 NodeManager 的关系是( )
-
A. 主从关系
-
B. 对等关系
C. 流水线关系
-
D. 无直接关系
-
-
HDFS 默认副本数量通常配置为( )
-
A. 1
-
B. 2
C. 3
-
D. 5
-
-
在 Linux 中,生成 SSH 免密登录密钥的命令是( )
-
A.
ssh-keygen -t rsa -
B.
ssh-copy-id -
C.
ssh-add -
D.
ssh -o
-
-
Hive 中,向已有分区表插入数据时,若未指定分区,将会( )
-
A. 插入到默认分区
-
B. 报错
-
C. 插入到最新创建的分区
-
D. 忽略该操作
-
-
以下哪个组件负责 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 上完成以下操作,请写出对应的命令:
-
创建一个目录
/user/test/data -
将本地文件
/local/data.txt上传到该目录 -
查看该目录下文件的详细信息
-
将该目录的所有者权限设置为可读可写可执行
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_id 和 action 两个维度过滤,请提出两种优化方案。(可结合分区、分桶、存储格式等)
📝 参考答案与详细解析(卷二)
一、单项选择题答案
-
C (数据以 packet 为单位沿 pipeline 传输)
-
B (
dfs.namenode.name.dir和dfs.datanode.data.dir在 hdfs-site.xml 中配置) -
B (外部表只删元数据)
-
B (Reducer 输入是 Map 输出按 key 聚合后的
List<Value>) -
B (本地文件必须加
LOCAL;路径写完整) -
A (ResourceManager 管理 NodeManager)
-
C (默认 3 副本,可配置
dfs.replication) -
A (
ssh-keygen生成密钥,ssh-copy-id分发) -
B (插入分区表必须指定分区,否则报错)
-
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改为ORC或PARQUET,并启用压缩。ORC 格式支持谓词下推(Predicate Pushdown),能在读取时提前过滤user_id和action等条件,大幅减少 I/O。方案三:多级分区
在
log_date之外再增加user_id的分区前缀(例如user_id_prefix),但需注意分区数量过多可能导致元数据膨胀。