《Hadoop生态圈与Hive基础》模拟试卷
《Hadoop生态圈与Hive基础》模拟试卷
满分:100分 | 考试时间:90分钟
一、单项选择题(每题2分,共30分)
-
在Hadoop集群中,负责资源管理和调度的核心组件是( )
-
A. HDFS
-
B. MapReduce
C. YARN
D. Hive
-
-
以下命令中,用于查看HDFS文件系统详细信息的是( )
-
A.
hadoop fs -ls -
B.
hadoop fs -cat
C.hadoop fs -du
D.hadoop fs -tail
-
-
在Hive中,创建外部表时必须使用的关键字是( )
-
A.
INTERNAL -
B.
EXTERNAL
C.TEMPORARY
D.MANAGED
-
-
HDFS中,负责存储实际数据块(Block)的节点是( )
-
A. NameNode
B. SecondaryNameNode
C. DataNode
D. ResourceManager
-
-
关于Hive分区表,下列说法正确的是( )
-
A. 分区字段可以在表的定义字段中重复出现
-
B. 分区字段的值必须在定义表中提前定义
C. 分区字段不能出现在表定义的普通字段中 -
D. 分区表只能在创建后动态添加分区
-
-
默认情况下,Hive内部表的数据存储在( )
-
A.
/user/root/ -
B.
/hive/data/
C./user/hive/warehouse/
D./tmp/
-
-
MapReduce中,Map阶段的输出数据经处理后进入Reducer阶段,中间这个过程称为( )
-
A. Partition
B. Shuffle
C. Sort
D. Merge
-
-
YARN中,ResourceManager默认的WEB UI端口号通常是( )
-
A. 50070
B. 8088
C. 9000
D. 50075
-
-
在Linux系统中,将目录及其内容递归授予
rwx权限的命令是( )-
A.
chmod 777 /path
B.chmod -R 755 /path
C.chown user:group /path
D.chmod 755 /path/*
-
-
关于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 也删除了,请分析原因,并说明这是由内部表还是外部表造成的,如何避免?
📝 参考答案与详细解析
一、单项选择题答案
-
C (YARN负责资源调度)
-
A (
hadoop fs -ls查看列表) -
B
-
C
-
C (分区字段不能出现在普通字段定义中,它是独立的维度)
-
C
-
B
-
B (8088是ResourceManager,50070是NameNode)
-
B (
-R递归,755表示所有者rwx,组和他人rx) -
D (默认创建的是内部表)
二、理论简答题解析
1. HDFS写数据流程(关键点):
① 客户端向NameNode发起上传请求,NameNode检查文件是否存在/权限。
② NameNode返回可写入的DataNode列表(通常按副本数)。
③ 客户端与DataNode建立Pipeline(管线)传输数据块(Block)。
④ 数据以包(Packet)为单位沿Pipe逐副本写入。
⑤ 写入完成后由DataNode返回确认(Ack),客户端收到确认后告知NameNode完成。
2. Hive分区表的优缺点:
优点:查询效率大幅提升(避免全表扫描),数据管理方便(按分区添加/删除)。
缺点:创建过多的分区可能导致元数据膨胀,影响小文件读写性能。
解释:分区字段是虚拟的维度列(如year),它在物理存储上作为目录层级,与表内实际数据字段无关,因此不能重复定义。
3. 微型集群配置与验证:
关键配置文件:
core-site.xml,hdfs-site.xml,mapred-site.xml,yarn-site.xml,slaves。
验证方式:
运行
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上的原始数据文件。
更多推荐
所有评论(0)