《Hadoop与大数据技术》模拟考试卷
考试时间:120分钟 满分:100分
|
题型 |
选择题 |
理论题 |
程序题 |
综合体 |
|---|---|---|---|---|
|
分值 |
30分 |
32分 |
24分 |
14分 |
一、选择题(每题2分,共15题,计30分)
请从四个选项中选出最合适的一项。
-
在Hadoop集群中,负责整个集群资源管理和作业调度的组件是( )。
A. NameNode B. DataNode C. YARN D. SecondaryNameNode
-
HDFS中,默认的数据块(Block)大小是( )。
A. 64MB B. 128MB C. 256MB D. 512MB
-
下列哪个命令用于查看HDFS根目录下的文件列表?( )
A. hadoop fs -cat / B. hadoop fs -ls / C. hadoop fs -mkdir / D. hadoop fs -put /
-
Hive中,删除外部表时,以下说法正确的是( )。
A. 元数据和实际数据都被删除
B. 只删除元数据,不删除实际数据
C. 只删除实际数据,不删除元数据
D. 两者都不删除
-
MapReduce过程中,将Map的输出按照Key进行分组、排序并传输给Reducer的机制称为( )。
A. Split B. Shuffle C. Combine D. Partition
-
HDFS中,存储文件元数据(如文件与数据块映射)的组件是( )。
A. NameNode B. DataNode C. SecondaryNameNode D. JournalNode
-
在Linux系统中,将文件
test.txt的权限设置为所有者可读写执行、组用户可读执行、其他用户可读执行的命令是( )。A. chmod 755 test.txt B. chmod 777 test.txt C. chmod 644 test.txt D. chmod 555 test.txt
-
关于Hive分区表,下列说法错误的是( )。
A. 分区字段可以是表中已有的字段
B. 分区可以提高查询效率
C. 分区字段在表结构中单独列出
D. 分区表可以同时使用多个分区字段
-
YARN ResourceManager的默认Web UI端口是( )。
A. 9870 B. 8088 C. 50070 D. 9000
-
在HDFS中,一个文件被写入成功后,NameNode会收到来自( )的块报告。
A. 客户端 B. DataNode C. SecondaryNameNode D. ResourceManager
-
以下哪种Hive存储格式最适合列式存储和高压缩比?( )
A. TEXTFILE B. SEQUENCEFILE C. ORC D. CSV
-
在Hadoop集群启动前,必须执行一次的命令是( )。
A. start-all.sh B. hdfs namenode -format C. jps D. hdfs dfsadmin -report
-
关于HDFS副本策略,默认情况下每个数据块有几个副本?( )
A. 1 B. 2 C. 3 D. 4
-
在MapReduce单词统计程序中,Map阶段的输出是( )。
A. <单词, 出现次数> B. <单词, 1> C. <行号, 单词> D. <偏移量, 单词>
-
使用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 |
注册日期 |
请完成以下任务:
-
创建一个内部表
student_info,字段分隔符为逗号,存储格式为TEXTFILE。(2分) -
向表中插入两条记录:(1001,'赵六','计算机系',22,'2024-09-01') 和 (1002,'钱七','数学系',21,'2024-09-02)。(2分)
-
查询2024年及以后注册的学生信息,并按年龄降序排列。(2分)
-
统计每个院系的学生人数和平均年龄。(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命令或脚本片段:
-
判断HDFS目录
/user/test是否存在,若不存在则创建。(2分) -
将本地当前目录下所有以
data_开头的文件上传到HDFS的/user/test目录中。(2分) -
递归列出HDFS目录
/user/test下的所有文件和子目录。(2分) -
统计本地目录
/var/log下普通文件的数量(不包括子目录)。(2分)
四、综合体(共14分)
题目:HDFS读写流程与集群配置综合(共3小题,分值分别为6分、4分、4分)
某公司需要搭建一个Hadoop集群来处理日志数据,集群规模为1台NameNode(兼ResourceManager),3台DataNode(兼NodeManager)。现有一个500MB的日志文件需要上传至HDFS进行分析。
-
(6分) 请详细描述客户端上传该500MB文件的完整流程,包括:
-
客户端与NameNode的交互过程;
-
文件如何被切分成数据块(默认128MB),并说明每个块的大小;
-
数据块通过Pipeline复制到多个DataNode的具体过程;
-
写入完成后NameNode如何确认并更新元数据。
-
-
(4分) 假设你在配置该集群时,需要修改以下参数,请写出它们通常在哪个配置文件中设置,并简要说明其含义:
-
dfs.replication(副本数) -
dfs.namenode.name.dir(NameNode元数据存储路径) -
yarn.nodemanager.resource.memory-mb(NodeManager可用内存)
-
-
(4分) 集群启动后,你发现无法通过Web UI访问NameNode(默认端口9870),请列举至少两种可能的故障原因及对应的排查命令或解决方法。
—— 试卷结束 ——
参考答案
一、选择题
-
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.sh和start-yarn.sh。 -
验证:
jps查看进程;访问http://master:9870和http://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.replication→hdfs-site.xml,设置副本数。 -
dfs.namenode.name.dir→hdfs-site.xml,设置NameNode元数据存储路径。 -
yarn.nodemanager.resource.memory-mb→yarn-site.xml,设置NodeManager可用物理内存。
3. 故障排查
-
可能原因1:NameNode进程未启动。→ 使用
jps查看是否有NameNode进程,若无则执行hdfs namenode启动。 -
可能原因2:防火墙阻止了9870端口。→ 使用
systemctl stop firewalld临时关闭防火墙,或开放端口。 -
可能原因3:配置文件
hdfs-site.xml中dfs.http.address未正确设置。→ 检查并重启服务。 -
可能原因4:浏览器访问地址错误。→ 确认主机名/IP正确,使用
curl http://localhost:9870测试。
更多推荐
所有评论(0)