大数据技术——预测题目
一、选择题(每题2-3分)
-
在Linux系统中,以下哪个命令用于查看当前工作目录的完整路径?
A.lsB.pwdC.cdD.cat-
答案:B
-
-
使用
chmod 700 ~/.ssh命令后,~/.ssh目录的权限是?-
A. 自己读写执行,组员和其他人无任何权限
-
B. 自己读写,组员只读,其他人无权限
-
C. 自己读执行,组员读写,其他人只读
-
D. 所有人完全控制
答案:A(7=rwx,0=---,0=---)
-
-
在Hadoop伪分布式模式下,
hdfs-site.xml中dfs.replication的值通常设置为?-
A. 0 B. 1 C. 2 D. 3
答案:B(伪分布式只有一个DataNode,副本数必须为1)
-
-
Hive中,以下哪个关键字用于创建分区表?
-
A.
PARTITIONB.PARTITIONED BYC.DISTRIBUTE BYD.CLUSTERED BY
答案:B
-
-
Sqoop将MySQL数据导入Hive时,若报错
ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,最可能的原因是?-
A. MySQL驱动未复制到Sqoop lib目录
-
B. Hive服务未启动
-
C. 缺少Hive的jar包(如hive-common)
-
D. Hadoop未启动
答案:C
-
-
以下哪个Hadoop守护进程属于YARN框架?
-
A. NameNode B. DataNode C. ResourceManager D. SecondaryNameNode
答案:C
-
二、填空题(每空1-2分)
-
在Linux中,修改主机名的命令是
________。
答案:hostnamectl set-hostname -
Hadoop配置文件
core-site.xml中,配置HDFS名称节点地址的属性是________。
答案:fs.defaultFS -
Hive中,查看表结构(字段名、类型、注释)的命令是
________。
答案:DESC 表名 -
将本地文件加载到Hive分区表的分区
city='xiamen'中的SQL语句是:
LOAD DATA LOCAL INPATH '/path/file.txt' INTO TABLE 表名 PARTITION(________);
答案:city='xiamen' -
Sqoop导入数据时,指定并行度(Map任务数)的参数是
________。
答案:-m或--num-mappers
三、简答题(每题5-8分)
-
简述Hadoop伪分布式模式下需要修改哪些配置文件,并说明各自的核心配置项。
参考答案:-
hadoop-env.sh:设置JAVA_HOME。 -
core-site.xml:fs.defaultFS指定HDFS地址(如hdfs://master:9000),hadoop.tmp.dir指定临时目录。 -
hdfs-site.xml:dfs.replication设为1,配置NameNode和DataNode的数据存储目录。 -
yarn-site.xml:yarn.resourcemanager.hostname指定ResourceManager节点,yarn.nodemanager.aux-services设为mapreduce_shuffle。 -
mapred-site.xml:mapreduce.framework.name设为yarn。
-
-
Hive中的分区表有什么作用?请结合课程中的例子说明如何创建静态分区表并加载数据。
参考答案:
分区表可以提高查询效率,避免全表扫描。它通过将数据按照指定字段的值分目录存储,查询时只扫描相关分区。
创建示例: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');
-
Sqoop导入数据时,如果希望只导入MySQL表中薪资大于4000的员工记录,并且直接导入到Hive,请写出完整的Sqoop命令。
参考答案:bash
./bin/sqoop import \ --connect jdbc:mysql://master:3306/erp?serverTimezone=UTC \ --username zeng --password 123456 \ --table emp \ --columns ename,eaddress,esalary \ --where "esalary > 4000" \ --delete-target-dir \ --hive-import --hive-table esalary \ -m 3
-
在搭建Hadoop完全分布式集群时,master节点和slave节点的
hdfs-site.xml配置有何不同?
参考答案:-
master节点:保留NameNode相关配置(
dfs.namenode.name.dir),注释掉DataNode配置(dfs.datanode.data.dir)。 -
slave节点:保留DataNode配置(
dfs.datanode.data.dir),注释掉NameNode配置。 -
其他如
dfs.replication、dfs.http.address等可保持一致。
-
四、操作/命令题(每题6-10分)
-
请按顺序写出在Ubuntu中安装JDK并配置环境变量的主要命令(从复制压缩包到验证成功)。
参考答案: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
-
某次启动Hadoop后,使用
jps命令发现master节点只有NameNode、ResourceManager、Jps,缺少SecondaryNameNode和DataNode。请分析可能的原因及解决步骤。
参考答案:-
原因1:
/etc/hosts中主机名映射不正确(如master的IP对应了多个名称或无法解析)。 -
原因2:SecondaryNameNode启动失败(配置文件
hdfs-site.xml中未指定或网络问题)。 -
原因3:之前格式化过多次,导致临时目录混乱。
解决步骤:
① 检查/etc/hosts,确保127.0.0.1 localhost和实际IP master正确。
② 检查hdfs-site.xml中dfs.namenode.secondary.http-address是否配置(可选)。
③ 停止集群(stop-all.sh),删除临时目录(datanode_1_dir和hadoop_data下的内容),重新格式化(hdfs namenode -format),再启动。
④ 查看日志文件($HADOOP_HOME/logs/)获取详细错误信息。
-
-
在Hive中,已创建分区表
agentinformation(分区字段province和city)。现在需要将本地文件/home/user1/new_fujian_xiamen.txt中的数据覆盖加载到province='fujian', city='xiamen'分区,请写出HQL语句。
参考答案:sql
LOAD DATA LOCAL INPATH '/home/user1/new_fujian_xiamen.txt' OVERWRITE INTO TABLE agentinformation PARTITION(province='fujian', city='xiamen');
五、故障分析/排错题(10分)
题目:
用户执行以下Sqoop命令将MySQL数据导入Hive,但收到ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf错误。
bash
./bin/sqoop import --connect jdbc:mysql://master:3306/erp?serverTimezone=UTC -username zeng -password 123456 --table emp --hive-import --hive-table esalary -m 1
请分析错误原因,并给出完整的解决方案(包括具体操作命令)。
参考答案:
原因:Sqoop运行环境中缺少Hive的依赖库,特别是hive-common-*.jar。
解决方案:
-
找到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导入命令,即可正常导入。
六、综合应用题(15-20分)
题目:
某公司需要将MySQL中erp数据库的emp表(字段:eid, ename, eaddress, esalary)中薪资高于4000的员工数据导入到Hive中,并按照薪资进行分区(例如分区字段为salary_range,分为high(>5000)和medium(4000~5000))。请完成以下任务:
-
写出Sqoop导入命令(假设MySQL连接信息:master:3306,用户名zeng,密码123456)。
-
说明导入成功后,Hive中会自动创建的表名称和存储位置。
-
如果希望将导入的数据重新组织为分区表(按薪资范围分区),请写出创建分区表的HQL语句,以及将数据插入该分区表的HQL语句。
参考答案:
-
Sqoop导入命令:
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_high_medium \ -m 3
注:此处直接导入到Hive表
emp_high_medium,该表为非分区表。 -
导入结果:
-
Hive表名:
emp_high_medium(默认在default数据库中,除非指定了其他库)。 -
存储位置:
hdfs://master:9000/user/hive/warehouse/emp_high_medium。 -
表结构与MySQL的
emp表相同,数据为薪资>4000的记录。
-
-
创建分区表并插入数据:
sql
-- 1. 创建按薪资范围分区的表 CREATE TABLE emp_partitioned ( eid INT, ename STRING, eaddress STRING, esalary INT ) PARTITIONED BY (salary_range STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 2. 将导入的数据插入到分区表 -- 设置动态分区模式(非严格模式) SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE emp_partitioned PARTITION(salary_range) SELECT eid, ename, eaddress, esalary, CASE WHEN esalary > 5000 THEN 'high' ELSE 'medium' END AS salary_range FROM emp_high_medium;或者使用静态分区分别插入:
sql
INSERT INTO TABLE emp_partitioned PARTITION(salary_range='high') SELECT eid, ename, eaddress, esalary FROM emp_high_medium WHERE esalary > 5000; INSERT INTO TABLE emp_partitioned PARTITION(salary_range='medium') SELECT eid, ename, eaddress, esalary FROM emp_high_medium WHERE esalary BETWEEN 4001 AND 5000;
七、论述/概念题(可能作为附加题)
题目:请阐述Hadoop HDFS中NameNode和DataNode各自的作用,以及在完全分布式集群中NameNode节点故障时,如何恢复数据?(简要说明)
参考答案:
-
NameNode:管理文件系统的命名空间,维护整个文件系统的目录树和文件元数据(包括文件与数据块的映射关系、数据块与DataNode的映射关系等)。
-
DataNode:负责实际存储数据块,执行数据块的读写操作,并定期向NameNode报告自身存储的块列表。
-
NameNode故障恢复:
-
如果配置了SecondaryNameNode,可以从其检查点恢复部分元数据(但不是实时备份)。
-
生产环境中通常使用高可用架构(HA),即两个NameNode(Active/Standby)共享一个JournalNode集群,当Active故障时,Standby自动接管。
-
若无HA,可通过备份的
fsimage和edits log手动恢复,然后重启NameNode。一、选择题(每题2-3分)
-
在Linux系统中,以下哪个命令用于查看当前工作目录的完整路径?
-
A.
lsB.pwdC.cdD.cat
答案:B
-
-
使用
chmod 700 ~/.ssh命令后,~/.ssh目录的权限是?-
A. 自己读写执行,组员和其他人无任何权限
-
B. 自己读写,组员只读,其他人无权限
-
C. 自己读执行,组员读写,其他人只读
-
D. 所有人完全控制
答案:A(7=rwx,0=---,0=---)
-
-
在Hadoop伪分布式模式下,
hdfs-site.xml中dfs.replication的值通常设置为?-
A. 0 B. 1 C. 2 D. 3
答案:B(伪分布式只有一个DataNode,副本数必须为1)
-
-
Hive中,以下哪个关键字用于创建分区表?
-
A.
PARTITIONB.PARTITIONED BYC.DISTRIBUTE BYD.CLUSTERED BY
答案:B
-
-
Sqoop将MySQL数据导入Hive时,若报错
ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,最可能的原因是?-
A. MySQL驱动未复制到Sqoop lib目录
-
B. Hive服务未启动
-
C. 缺少Hive的jar包(如hive-common)
-
D. Hadoop未启动
答案:C
-
-
以下哪个Hadoop守护进程属于YARN框架?
-
A. NameNode B. DataNode C. ResourceManager D. SecondaryNameNode
答案:C
-
-
二、填空题(每空1-2分)
-
在Linux中,修改主机名的命令是
________。
答案:hostnamectl set-hostname -
Hadoop配置文件
core-site.xml中,配置HDFS名称节点地址的属性是________。
答案:fs.defaultFS -
Hive中,查看表结构(字段名、类型、注释)的命令是
________。
答案:DESC 表名 -
将本地文件加载到Hive分区表的分区
city='xiamen'中的SQL语句是:
LOAD DATA LOCAL INPATH '/path/file.txt' INTO TABLE 表名 PARTITION(________);
答案:city='xiamen' -
Sqoop导入数据时,指定并行度(Map任务数)的参数是
________。
答案:-m或--num-mappers -
三、简答题(每题5-8分)
-
简述Hadoop伪分布式模式下需要修改哪些配置文件,并说明各自的核心配置项。
参考答案:-
hadoop-env.sh:设置JAVA_HOME。 -
core-site.xml:fs.defaultFS指定HDFS地址(如hdfs://master:9000),hadoop.tmp.dir指定临时目录。 -
hdfs-site.xml:dfs.replication设为1,配置NameNode和DataNode的数据存储目录。 -
yarn-site.xml:yarn.resourcemanager.hostname指定ResourceManager节点,yarn.nodemanager.aux-services设为mapreduce_shuffle。 -
mapred-site.xml:mapreduce.framework.name设为yarn。
-
-
Hive中的分区表有什么作用?请结合课程中的例子说明如何创建静态分区表并加载数据。
参考答案:
分区表可以提高查询效率,避免全表扫描。它通过将数据按照指定字段的值分目录存储,查询时只扫描相关分区。
创建示例: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');
-
Sqoop导入数据时,如果希望只导入MySQL表中薪资大于4000的员工记录,并且直接导入到Hive,请写出完整的Sqoop命令。
参考答案:bash
./bin/sqoop import \ --connect jdbc:mysql://master:3306/erp?serverTimezone=UTC \ --username zeng --password 123456 \ --table emp \ --columns ename,eaddress,esalary \ --where "esalary > 4000" \ --delete-target-dir \ --hive-import --hive-table esalary \ -m 3
-
在搭建Hadoop完全分布式集群时,master节点和slave节点的
hdfs-site.xml配置有何不同?
参考答案:-
master节点:保留NameNode相关配置(
dfs.namenode.name.dir),注释掉DataNode配置(dfs.datanode.data.dir)。 -
slave节点:保留DataNode配置(
dfs.datanode.data.dir),注释掉NameNode配置。 -
其他如
dfs.replication、dfs.http.address等可保持一致。
-
-
四、操作/命令题(每题6-10分)
-
请按顺序写出在Ubuntu中安装JDK并配置环境变量的主要命令(从复制压缩包到验证成功)。
参考答案: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
-
某次启动Hadoop后,使用
jps命令发现master节点只有NameNode、ResourceManager、Jps,缺少SecondaryNameNode和DataNode。请分析可能的原因及解决步骤。
参考答案:-
原因1:
/etc/hosts中主机名映射不正确(如master的IP对应了多个名称或无法解析)。 -
原因2:SecondaryNameNode启动失败(配置文件
hdfs-site.xml中未指定或网络问题)。 -
原因3:之前格式化过多次,导致临时目录混乱。
解决步骤:
① 检查/etc/hosts,确保127.0.0.1 localhost和实际IP master正确。
② 检查hdfs-site.xml中dfs.namenode.secondary.http-address是否配置(可选)。
③ 停止集群(stop-all.sh),删除临时目录(datanode_1_dir和hadoop_data下的内容),重新格式化(hdfs namenode -format),再启动。
④ 查看日志文件($HADOOP_HOME/logs/)获取详细错误信息。
-
-
在Hive中,已创建分区表
agentinformation(分区字段province和city)。现在需要将本地文件/home/user1/new_fujian_xiamen.txt中的数据覆盖加载到province='fujian', city='xiamen'分区,请写出HQL语句。
参考答案:sql
LOAD DATA LOCAL INPATH '/home/user1/new_fujian_xiamen.txt' OVERWRITE INTO TABLE agentinformation PARTITION(province='fujian', city='xiamen');
-
./bin/sqoop import --connect jdbc:mysql://master:3306/erp?serverTimezone=UTC -username zeng -password 123456 --table emp --hive-import --hive-table esalary -m 1
请分析错误原因,并给出完整的解决方案(包括具体操作命令)。
参考答案:
原因:Sqoop运行环境中缺少Hive的依赖库,特别是hive-common-*.jar。
解决方案: -
找到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导入命令,即可正常导入。
-
六、综合应用题(15-20分)
题目:
某公司需要将MySQL中erp数据库的emp表(字段:eid, ename, eaddress, esalary)中薪资高于4000的员工数据导入到Hive中,并按照薪资进行分区(例如分区字段为salary_range,分为high(>5000)和medium(4000~5000))。请完成以下任务: -
写出Sqoop导入命令(假设MySQL连接信息:master:3306,用户名zeng,密码123456)。
-
说明导入成功后,Hive中会自动创建的表名称和存储位置。
-
如果希望将导入的数据重新组织为分区表(按薪资范围分区),请写出创建分区表的HQL语句,以及将数据插入该分区表的HQL语句。
-
参考答案:
-
Sqoop导入命令:
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_high_medium \ -m 3
注:此处直接导入到Hive表
emp_high_medium,该表为非分区表。 -
导入结果:
-
Hive表名:
emp_high_medium(默认在default数据库中,除非指定了其他库)。 -
存储位置:
hdfs://master:9000/user/hive/warehouse/emp_high_medium。 -
表结构与MySQL的
emp表相同,数据为薪资>4000的记录。
-
-
创建分区表并插入数据:
sql
-- 1. 创建按薪资范围分区的表 CREATE TABLE emp_partitioned ( eid INT, ename STRING, eaddress STRING, esalary INT ) PARTITIONED BY (salary_range STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','; -- 2. 将导入的数据插入到分区表 -- 设置动态分区模式(非严格模式) SET hive.exec.dynamic.partition.mode=nonstrict; INSERT INTO TABLE emp_partitioned PARTITION(salary_range) SELECT eid, ename, eaddress, esalary, CASE WHEN esalary > 5000 THEN 'high' ELSE 'medium' END AS salary_range FROM emp_high_medium;或者使用静态分区分别插入:
sql
INSERT INTO TABLE emp_partitioned PARTITION(salary_range='high') SELECT eid, ename, eaddress, esalary FROM emp_high_medium WHERE esalary > 5000; INSERT INTO TABLE emp_partitioned PARTITION(salary_range='medium') SELECT eid, ename, eaddress, esalary FROM emp_high_medium WHERE esalary BETWEEN 4001 AND 5000;
-
七、论述/概念题(可能作为附加题)
题目:请阐述Hadoop HDFS中NameNode和DataNode各自的作用,以及在完全分布式集群中NameNode节点故障时,如何恢复数据?(简要说明)
参考答案:
-
NameNode:管理文件系统的命名空间,维护整个文件系统的目录树和文件元数据(包括文件与数据块的映射关系、数据块与DataNode的映射关系等)。
-
DataNode:负责实际存储数据块,执行数据块的读写操作,并定期向NameNode报告自身存储的块列表。
-
NameNode故障恢复:
-
如果配置了SecondaryNameNode,可以从其检查点恢复部分元数据(但不是实时备份)。
-
生产环境中通常使用高可用架构(HA),即两个NameNode(Active/Standby)共享一个JournalNode集群,当Active故障时,Standby自动接管。
-
若无HA,可通过备份的
fsimage和edits log手动恢复,然后重启NameNode。
-
-
五、故障分析/排错题(10分)
题目:
用户执行以下Sqoop命令将MySQL数据导入Hive,但收到ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf错误。bash
-
更多推荐
所有评论(0)