一、选择题(每题2-3分)

  1. 在Linux系统中,以下哪个命令用于查看当前工作目录的完整路径?

    A. ls B. pwd C. cd D. cat
    • 答案:B

  2. 使用chmod 700 ~/.ssh命令后,~/.ssh目录的权限是?

    • A. 自己读写执行,组员和其他人无任何权限

    • B. 自己读写,组员只读,其他人无权限

    • C. 自己读执行,组员读写,其他人只读

    • D. 所有人完全控制
      答案:A(7=rwx,0=---,0=---)

  3. 在Hadoop伪分布式模式下,hdfs-site.xmldfs.replication的值通常设置为?

    • A. 0 B. 1 C. 2 D. 3
      答案:B(伪分布式只有一个DataNode,副本数必须为1)

  4. Hive中,以下哪个关键字用于创建分区表?

    • A. PARTITION B. PARTITIONED BY C. DISTRIBUTE BY D. CLUSTERED BY
      答案:B

  5. Sqoop将MySQL数据导入Hive时,若报错ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,最可能的原因是?

    • A. MySQL驱动未复制到Sqoop lib目录

    • B. Hive服务未启动

    • C. 缺少Hive的jar包(如hive-common)

    • D. Hadoop未启动
      答案:C

  6. 以下哪个Hadoop守护进程属于YARN框架?

    • A. NameNode B. DataNode C. ResourceManager D. SecondaryNameNode
      答案:C


二、填空题(每空1-2分)

  1. 在Linux中,修改主机名的命令是 ________
    答案:hostnamectl set-hostname

  2. Hadoop配置文件 core-site.xml 中,配置HDFS名称节点地址的属性是 ________
    答案:fs.defaultFS

  3. Hive中,查看表结构(字段名、类型、注释)的命令是 ________
    答案:DESC 表名

  4. 将本地文件加载到Hive分区表的分区city='xiamen'中的SQL语句是:
    LOAD DATA LOCAL INPATH '/path/file.txt' INTO TABLE 表名 PARTITION(________);
    答案:city='xiamen'

  5. Sqoop导入数据时,指定并行度(Map任务数)的参数是 ________
    答案:-m 或 --num-mappers


三、简答题(每题5-8分)

  1. 简述Hadoop伪分布式模式下需要修改哪些配置文件,并说明各自的核心配置项。
    参考答案

    • hadoop-env.sh:设置 JAVA_HOME

    • core-site.xmlfs.defaultFS 指定HDFS地址(如hdfs://master:9000),hadoop.tmp.dir 指定临时目录。

    • hdfs-site.xmldfs.replication 设为1,配置NameNode和DataNode的数据存储目录。

    • yarn-site.xmlyarn.resourcemanager.hostname 指定ResourceManager节点,yarn.nodemanager.aux-services 设为mapreduce_shuffle

    • mapred-site.xmlmapreduce.framework.name 设为yarn

  2. 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');
  3. 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
  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配置。

    • 其他如dfs.replicationdfs.http.address等可保持一致。


四、操作/命令题(每题6-10分)

  1. 请按顺序写出在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
  2. 某次启动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.xmldfs.namenode.secondary.http-address是否配置(可选)。
      ③ 停止集群(stop-all.sh),删除临时目录(datanode_1_dirhadoop_data下的内容),重新格式化(hdfs namenode -format),再启动。
      ④ 查看日志文件($HADOOP_HOME/logs/)获取详细错误信息。

  3. 在Hive中,已创建分区表agentinformation(分区字段provincecity)。现在需要将本地文件/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
解决方案

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

  2. 将该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/
  3. 重新执行Sqoop导入命令,即可正常导入。


六、综合应用题(15-20分)

题目
某公司需要将MySQL中erp数据库的emp表(字段:eid, ename, eaddress, esalary)中薪资高于4000的员工数据导入到Hive中,并按照薪资进行分区(例如分区字段为salary_range,分为high(>5000)和medium(4000~5000))。请完成以下任务:

  1. 写出Sqoop导入命令(假设MySQL连接信息:master:3306,用户名zeng,密码123456)。

  2. 说明导入成功后,Hive中会自动创建的表名称和存储位置。

  3. 如果希望将导入的数据重新组织为分区表(按薪资范围分区),请写出创建分区表的HQL语句,以及将数据插入该分区表的HQL语句。

参考答案

  1. 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,该表为非分区表。

  2. 导入结果

    • Hive表名:emp_high_medium(默认在default数据库中,除非指定了其他库)。

    • 存储位置:hdfs://master:9000/user/hive/warehouse/emp_high_medium

    • 表结构与MySQL的emp表相同,数据为薪资>4000的记录。

  3. 创建分区表并插入数据

    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故障恢复

    1. 如果配置了SecondaryNameNode,可以从其检查点恢复部分元数据(但不是实时备份)。

    2. 生产环境中通常使用高可用架构(HA),即两个NameNode(Active/Standby)共享一个JournalNode集群,当Active故障时,Standby自动接管。

    3. 若无HA,可通过备份的fsimageedits log手动恢复,然后重启NameNode。

      一、选择题(每题2-3分)

    4. 在Linux系统中,以下哪个命令用于查看当前工作目录的完整路径?

      • A. ls B. pwd C. cd D. cat
        答案:B

    5. 使用chmod 700 ~/.ssh命令后,~/.ssh目录的权限是?

      • A. 自己读写执行,组员和其他人无任何权限

      • B. 自己读写,组员只读,其他人无权限

      • C. 自己读执行,组员读写,其他人只读

      • D. 所有人完全控制
        答案:A(7=rwx,0=---,0=---)

    6. 在Hadoop伪分布式模式下,hdfs-site.xmldfs.replication的值通常设置为?

      • A. 0 B. 1 C. 2 D. 3
        答案:B(伪分布式只有一个DataNode,副本数必须为1)

    7. Hive中,以下哪个关键字用于创建分区表?

      • A. PARTITION B. PARTITIONED BY C. DISTRIBUTE BY D. CLUSTERED BY
        答案:B

    8. Sqoop将MySQL数据导入Hive时,若报错ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf,最可能的原因是?

      • A. MySQL驱动未复制到Sqoop lib目录

      • B. Hive服务未启动

      • C. 缺少Hive的jar包(如hive-common)

      • D. Hadoop未启动
        答案:C

    9. 以下哪个Hadoop守护进程属于YARN框架?

      • A. NameNode B. DataNode C. ResourceManager D. SecondaryNameNode
        答案:C


    10. 二、填空题(每空1-2分)

    11. 在Linux中,修改主机名的命令是 ________
      答案:hostnamectl set-hostname

    12. Hadoop配置文件 core-site.xml 中,配置HDFS名称节点地址的属性是 ________
      答案:fs.defaultFS

    13. Hive中,查看表结构(字段名、类型、注释)的命令是 ________
      答案:DESC 表名

    14. 将本地文件加载到Hive分区表的分区city='xiamen'中的SQL语句是:
      LOAD DATA LOCAL INPATH '/path/file.txt' INTO TABLE 表名 PARTITION(________);
      答案:city='xiamen'

    15. Sqoop导入数据时,指定并行度(Map任务数)的参数是 ________
      答案:-m 或 --num-mappers


    16. 三、简答题(每题5-8分)

    17. 简述Hadoop伪分布式模式下需要修改哪些配置文件,并说明各自的核心配置项。
      参考答案

      • hadoop-env.sh:设置 JAVA_HOME

      • core-site.xmlfs.defaultFS 指定HDFS地址(如hdfs://master:9000),hadoop.tmp.dir 指定临时目录。

      • hdfs-site.xmldfs.replication 设为1,配置NameNode和DataNode的数据存储目录。

      • yarn-site.xmlyarn.resourcemanager.hostname 指定ResourceManager节点,yarn.nodemanager.aux-services 设为mapreduce_shuffle

      • mapred-site.xmlmapreduce.framework.name 设为yarn

    18. 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');
    19. 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
    20. 在搭建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.replicationdfs.http.address等可保持一致。


    21. 四、操作/命令题(每题6-10分)

    22. 请按顺序写出在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
    23. 某次启动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.xmldfs.namenode.secondary.http-address是否配置(可选)。
        ③ 停止集群(stop-all.sh),删除临时目录(datanode_1_dirhadoop_data下的内容),重新格式化(hdfs namenode -format),再启动。
        ④ 查看日志文件($HADOOP_HOME/logs/)获取详细错误信息。

    24. 在Hive中,已创建分区表agentinformation(分区字段provincecity)。现在需要将本地文件/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');
    25. ./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
      解决方案

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

    27. 将该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/
    28. 重新执行Sqoop导入命令,即可正常导入。


    29. 六、综合应用题(15-20分)

      题目
      某公司需要将MySQL中erp数据库的emp表(字段:eid, ename, eaddress, esalary)中薪资高于4000的员工数据导入到Hive中,并按照薪资进行分区(例如分区字段为salary_range,分为high(>5000)和medium(4000~5000))。请完成以下任务:

    30. 写出Sqoop导入命令(假设MySQL连接信息:master:3306,用户名zeng,密码123456)。

    31. 说明导入成功后,Hive中会自动创建的表名称和存储位置。

    32. 如果希望将导入的数据重新组织为分区表(按薪资范围分区),请写出创建分区表的HQL语句,以及将数据插入该分区表的HQL语句。

    33. 参考答案

    34. 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,该表为非分区表。

    35. 导入结果

      • Hive表名:emp_high_medium(默认在default数据库中,除非指定了其他库)。

      • 存储位置:hdfs://master:9000/user/hive/warehouse/emp_high_medium

      • 表结构与MySQL的emp表相同,数据为薪资>4000的记录。

    36. 创建分区表并插入数据

      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;

    37. 七、论述/概念题(可能作为附加题)

      题目:请阐述Hadoop HDFS中NameNode和DataNode各自的作用,以及在完全分布式集群中NameNode节点故障时,如何恢复数据?(简要说明)

      参考答案

    38. NameNode:管理文件系统的命名空间,维护整个文件系统的目录树和文件元数据(包括文件与数据块的映射关系、数据块与DataNode的映射关系等)。

    39. DataNode:负责实际存储数据块,执行数据块的读写操作,并定期向NameNode报告自身存储的块列表。

    40. NameNode故障恢复

      1. 如果配置了SecondaryNameNode,可以从其检查点恢复部分元数据(但不是实时备份)。

      2. 生产环境中通常使用高可用架构(HA),即两个NameNode(Active/Standby)共享一个JournalNode集群,当Active故障时,Standby自动接管。

      3. 若无HA,可通过备份的fsimageedits log手动恢复,然后重启NameNode。


    41. 五、故障分析/排错题(10分)

      题目
      用户执行以下Sqoop命令将MySQL数据导入Hive,但收到ClassNotFoundException: org.apache.hadoop.hive.conf.HiveConf错误。

      bash

更多推荐