大数据课程期末模拟试卷

考试时间:120分钟  满分:100分


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

  1. 在Linux系统中,以下哪个命令可以递归删除目录及其所有子目录和文件?
    A. rmdir B. rm -r C. rm -f D. del -r

  2. Hadoop伪分布式模式下,hdfs-site.xmldfs.replication属性一般设置为以下哪个值?
    A. 0 B. 1 C. 2 D. 3

  3. 以下哪个Hadoop守护进程属于YARN框架?
    A. NameNode B. DataNode C. ResourceManager D. SecondaryNameNode

  4. 在Hive中,以下哪个SQL语句用于查看表的结构(字段名、类型、注释)?
    A. SHOW TABLES; B. DESC 表名; C. SHOW CREATE TABLE 表名; D. SELECT * FROM 表名 LIMIT 1;

  5. 执行命令chmod 600 ~/.ssh/authorized_keys后,该文件的权限是:
    A. 自己读写,组员读写,其他人只读 B. 自己读写,组员和其他人无任何权限 C. 自己只读,组员只读,其他人无权限 D. 自己读写执行,组员只读,其他人只读

  6. Sqoop将MySQL数据导入Hive时,若报错ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,最可能的原因是:
    A. MySQL驱动未复制到Sqoop的lib目录 B. Hive服务未启动 C. Sqoop的lib目录缺少Hive的jar包(如hive-common) D. Hadoop未启动

  7. 以下哪个参数用于Sqoop导入时指定并行度(Map任务数)?
    A. --num-mappers B. -m C. 以上两者都可以 D. --parallel

  8. Hive中创建分区表时,使用的关键字是:
    A. PARTITION B. PARTITIONED BY C. CLUSTERED BY D. DISTRIBUTE BY

  9. Hadoop集群启动后,在master节点使用jps命令,以下哪个进程不属于master节点应有的进程?
    A. NameNode B. DataNode C. SecondaryNameNode D. ResourceManager

  10. 使用LOAD DATA LOCAL INPATH '/home/user1/data.txt' OVERWRITE INTO TABLE student PARTITION(city='xiamen');语句时,OVERWRITE关键字的作用是:
    A. 追加数据到现有分区 B. 覆盖目标分区中的原有数据 C. 忽略重复数据 D. 删除表后重建


二、填空题(共5题,每空2分,共10分)

  1. 在Linux中,查看当前主机名的命令是 ________,修改主机名的命令是 ________

  2. Hadoop配置文件 core-site.xml 中,用于配置HDFS默认文件系统地址的属性名称是 ________

  3. Hive中,将本地文件 data.txt 加载到表 student(非分区表)的SQL语句是:
    LOAD DATA LOCAL INPATH '/home/user1/data.txt' ________ TABLE student;

  4. Sqoop导入数据时,如果要仅导入MySQL表中的指定列,需要使用 ________ 参数。

  5. 在HDFS Web界面中,默认访问端口是 ________;YARN ResourceManager Web界面的默认端口是 ________


三、简答题(共4题,每题5分,共20分)

  1. 简述Hadoop伪分布式模式下需要修改哪些配置文件,并分别说明core-site.xmlhdfs-site.xml中最核心的配置项(各写出两个)。

  2. Hive中的分区表有什么优点?请结合课程中的例子,写出创建单字段静态分区表(分区字段为city)的HQL语句,以及向指定分区加载数据的语句。

  3. Sqoop导入数据时,--delete-target-dir参数的作用是什么?为什么在多次导入同一张表时建议使用该参数?

  4. 在Hadoop完全分布式集群中,master节点和slave节点的hdfs-site.xml配置有何主要区别?请说明原因。


四、操作/命令题(共3题,每题6分,共18分)

  1. 请按顺序写出在Ubuntu系统中安装JDK并配置环境变量的完整命令(从复制压缩包到验证成功,至少包含5条命令)。

  2. 写出启动Hadoop集群和关闭Hadoop集群的命令(至少两种方式)。然后写出用jps命令检查进程时,master节点和slave节点分别应该看到哪些进程。

  3. 在Hive中,已存在数据库agentmanager,其中有一张分区表agentinformation,分区字段为provincecity。现在需要将本地文件/home/user1/fujian_xiamen_new.txt中的数据覆盖加载到province='fujian', city='xiamen'分区中。请写出完整的HQL语句。


五、故障排除题(共1题,共12分)

问题描述
某同学在执行以下Sqoop命令将MySQL数据导入Hive时,收到了错误信息(见下方)。

bash

./bin/sqoop import \
--connect jdbc:mysql://master:3306/erp?serverTimezone=UTC \
--username zeng --password 123456 \
--table emp \
--where "esalary > 4000" \
--delete-target-dir \
--hive-import --hive-table emp_salary \
-m 3

错误信息(部分)

text

ERROR hive.HiveConfig: Could not load org.apache.hadoop.hive.conf.HiveConf. Make sure HIVE_CONF_DIR is set correctly.
ERROR tool.ImportTool: Import failed: java.io.IOException: java.lang.ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf

请回答:

  1. (3分)分析该错误的最可能原因。

  2. (6分)写出完整的解决步骤(包括具体命令)。

  3. (3分)解决后,重新运行上述Sqoop命令,数据将被导入到Hive的哪个数据库的哪张表中?数据在HDFS上的默认存储路径是什么?


六、综合应用题(共1题,共20分)

背景
某电商公司使用MySQL存储订单数据,订单表orders的结构如下:

sql

CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_name VARCHAR(100),
  product_name VARCHAR(200),
  amount DECIMAL(10,2),
  order_date DATE
);

表中已有大量数据。公司希望将2024年1月1日之后的订单数据导入到Hive中,并且按年份月份进行分区(例如分区字段为yearmonth),以提高按时间查询的效率。

任务

  1. (6分)写出Sqoop命令,将符合条件的订单数据从MySQL直接导入到Hive(先导入到一个临时非分区表,表名暂定为orders_temp)。假设MySQL连接信息:master:3306,数据库名ecommerce,用户名zeng,密码123456

  2. (6分)在Hive中,写出创建目标分区表orders_partitioned的HQL语句,该表包含与原订单表相同的字段(order_idcustomer_nameproduct_nameamountorder_date),并按照year(INT)和month(INT)进行分区,行格式字段终止符为','

  3. (8分)写出将orders_temp表中的数据插入到分区表orders_partitioned中的HQL语句。要求使用动态分区,并根据order_date自动生成yearmonth分区字段值。同时请说明在执行动态分区插入前需要设置哪个Hive参数。


参考答案

一、单项选择题

  1. B 2. B 3. C 4. B 5. B 6. C 7. C 8. B 9. B 10. B

二、填空题

  1. hostnamehostnamectl set-hostname

  2. fs.defaultFS

  3. INTO

  4. --columns

  5. 500708088

三、简答题

1. 简述Hadoop伪分布式模式下需要修改哪些配置文件,并分别说明core-site.xmlhdfs-site.xml中最核心的配置项(各写出两个)。
参考答案
需要修改的配置文件:hadoop-env.shcore-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xml

  • core-site.xmlfs.defaultFS(指定HDFS的NameNode地址),hadoop.tmp.dir(指定Hadoop临时目录)。

  • hdfs-site.xmldfs.replication(副本数,伪分布式设为1),dfs.namenode.name.dir(NameNode存储目录)。

2. Hive中的分区表有什么优点?请结合课程中的例子,写出创建单字段静态分区表(分区字段为city)的HQL语句,以及向指定分区加载数据的语句。
参考答案
优点:提高查询效率,避免全表扫描;便于数据管理,可以按分区进行删除或备份。
创建语句:

sql

CREATE TABLE cityperson (
  id string, name string, age int
)
PARTITIONED BY (city string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

加载数据:

sql

LOAD DATA LOCAL INPATH '/home/user1/citydataForxiamen.txt' 
INTO TABLE cityperson PARTITION(city='xiamen');

3. Sqoop导入数据时,--delete-target-dir参数的作用是什么?为什么在多次导入同一张表时建议使用该参数?
参考答案
作用:如果HDFS上目标目录已经存在,则先删除该目录再导入。
原因:Sqoop导入时会自动创建目标目录,如果目录已存在(例如之前导入过),会报错“目录已存在”。使用该参数可以避免手动删除目录的麻烦,确保导入顺利进行。

4. 在Hadoop完全分布式集群中,master节点和slave节点的hdfs-site.xml配置有何主要区别?请说明原因。
参考答案

  • master节点:保留NameNode相关配置(如dfs.namenode.name.dir),注释或删除DataNode配置(dfs.datanode.data.dir)。

  • slave节点:保留DataNode相关配置(dfs.datanode.data.dir),注释或删除NameNode配置。
    原因:master节点作为NameNode,只负责管理元数据,不存储实际数据块;slave节点作为DataNode,只负责存储数据块,不应承担NameNode的角色。二者职责分离,避免冲突。

四、操作/命令题

1. 请按顺序写出在Ubuntu系统中安装JDK并配置环境变量的完整命令(从复制压缩包到验证成功,至少包含5条命令)。
参考答案

bash

sudo cp jdk-8u161-linux-x64.tar.gz /opt
cd /opt
sudo tar -zxvf jdk-8u161-linux-x64.tar.gz
sudo vim /etc/profile   # 添加JAVA_HOME等
source /etc/profile
java -version

2. 写出启动Hadoop集群和关闭Hadoop集群的命令(至少两种方式)。然后写出用jps命令检查进程时,master节点和slave节点分别应该看到哪些进程。
参考答案
启动:start-all.sh 或 start-dfs.sh + start-yarn.sh
关闭:stop-all.sh 或 stop-dfs.sh + stop-yarn.sh
master节点进程:NameNode, SecondaryNameNode, ResourceManager, NodeManager
slave节点进程:DataNode, NodeManager

3. 写出HQL语句:覆盖加载数据到分区表agentinformation(province='fujian', city='xiamen')分区。
参考答案

sql

LOAD DATA LOCAL INPATH '/home/user1/fujian_xiamen_new.txt' 
OVERWRITE INTO TABLE agentinformation 
PARTITION(province='fujian', city='xiamen');

五、故障排除题

1. 原因:Sqoop运行环境中缺少Hive的依赖库,具体是hive-common-*.jar没有被加载。

2. 解决步骤

  • ① 找到Hive安装目录下的hive-common-3.1.1.jar(通常在/opt/apache-hive-3.1.1-bin/lib/)。

  • ② 将该jar包复制到Sqoop的lib目录:

    bash

    sudo cp /opt/apache-hive-3.1.1-bin/lib/hive-common-3.1.1.jar /opt/sqoop-1.4.7.bin__hadoop-2.6.0/lib/
  • ③ 重新执行Sqoop导入命令。

3. 导入后的位置

  • Hive数据库:default(因为命令中没有指定库,默认使用default库)。

  • Hive表名:emp_salary

  • HDFS存储路径:hdfs://master:9000/user/hive/warehouse/emp_salary(Hive默认仓库目录下)。

六、综合应用题

1. Sqoop命令(导入到临时非分区表):

bash

./bin/sqoop import \
--connect jdbc:mysql://master:3306/ecommerce?serverTimezone=UTC \
--username zeng --password 123456 \
--table orders \
--where "order_date > '2024-01-01'" \
--delete-target-dir \
--hive-import --hive-table orders_temp \
-m 3

2. 创建分区表HQL语句:

sql

CREATE TABLE orders_partitioned (
  order_id INT,
  customer_name STRING,
  product_name STRING,
  amount DECIMAL(10,2),
  order_date DATE
)
PARTITIONED BY (year INT, month INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

3. 动态分区插入数据HQL语句:

sql

-- 设置动态分区为非严格模式
SET hive.exec.dynamic.partition.mode=nonstrict;

INSERT INTO TABLE orders_partitioned PARTITION(year, month)
SELECT 
  order_id, 
  customer_name, 
  product_name, 
  amount, 
  order_date,
  YEAR(order_date) AS year,
  MONTH(order_date) AS month
FROM orders_temp;

说明:需要设置的参数是hive.exec.dynamic.partition.mode=nonstrict,否则Hive默认不允许使用动态分区(要求至少有一个静态分区列)。

更多推荐