> 技术文档 > Hadoop习题练习

Hadoop习题练习

一、大数据以及Hadoop相关概念

大数据的4V特点:

  1. Volume大量化
  2. Variety多样化
  3. Velocity快速化
  4. Value价值密度低

Hadoop优点:

  1. 高可靠性
  2. 高扩展性
  3. 高容错性
  4. 高效性

1.
Hadoop将作业分成若干个task来执行其中包括   MapTask      和      ReduceTask       

2.
MapReduce有哪些特点()。
A.易于编程
B.良好的扩展性
C.高容错性

D.能对海量数据进行实时在线处理               离线处理

 

3.
Hadoop的关键优势之一是它的可靠性。当某个计算元素或存储单元发生故障时,会发生什么情况?
A. 数据会丢失
B. 任务会被重新分配
C. 系统会完全崩溃
D. 没有任何影响

 

4.
以下哪些论文是Google发表的?            创始人: Doug Cutting
A. The Google File System
B. MapReduce: Simplified Data Processing on Large Clusters
C. Bigtable: A Distributed Storage System for Structured Data

D. Hadoop: The Definitive Guide

 

二、Hadoop环境安装

进入master节点的命令:(在master节点执行)

docker exec -it --privileged master /bin/bash

docker exec -it --privileged master /bin/bash

启动master节点的命令:

docker start master

解压的命令:

tar -zvxf XXX.tar.gz

tar zxvf XXX.tar.gz

tar zxvf XXX.tar.gz

克隆:

scp -r root@172.18.0.2:/usr/local/java/* root@172.18.0.3:/usr/local/java/*

生成密钥对:

keygen id_rsa

ssh-keygen -t rsa

ssh-keygen -t rsa

私钥:

id_rsa

公钥:

id_rsa.pub

存放授权过的无密码登录服务器公钥(授权文件):

athorized_keys

追加:

cat XX >> YY

重命名( hadoop-3.4.0 的目录,将其重命名为 hadoop):

mv hadoop-3.4.0 hadoop

启动Hadoop,启动需要在master节点上进行,执行如下命令:

hdfs namenode -format

start-dfs.sh

start-yarn.sh

mapred --daemon start historyserver

mapred --daemon start histryserver

    1.
    格式化HDFS系统的命令是

    hdfs namenode -format

    2.
    HDFS实现机架感知的配置文件是

    core-site.xml

     

    配置文件 核心功能 workers 定义集群中所有 ** 从节点(DataNode/NodeManager)** 的主机名或 IP 地址。
    用于start-dfs.shstart-yarn.sh等脚本自动批量启动服务。 core-site.xml 配置 Hadoop 通用参数:
    - HDFS 的默认 URI(fs.defaultFS
    - 临时文件目录(hadoop.tmp.dir
    - 机架感知脚本路径(net.topology.script.file.namehdfs-site.xml 配置 HDFS 特有参数:
    - 数据块副本数(dfs.replication
    - NameNode 和 DataNode 存储路径
    - 安全模式阈值、权限控制等 mapred-site.xml 配置 MapReduce 计算框架参数:
    - 执行引擎(mapreduce.framework.name,如 YARN 或 MRv1)
    - Map/Reduce 任务内存分配
    - 作业历史服务器地址 yarn-site.xml 配置 YARN 资源管理器参数:
    - ResourceManager 和 NodeManager 的地址与端口
    - 资源调度策略(如 CapacityScheduler、FairScheduler)
    - 容器内存 / CPU 限制 hadoop-env.sh 设置 Hadoop 运行环境变量:
    - Java 路径(JAVA_HOME
    - 各服务 JVM 参数(如 NameNode 堆内存)
    - 日志目录(HADOOP_LOG_DIR

     

    3.
    一台虚拟机102、103、104,简述在Linux系统上安装Hadoop完全分布式模式的每台机器的主要组件及作用(可表格描述)

    HDFS:                                                                                                     YARN:

    NameNode : 1                                                                                      ResourceManager   :   1
    DataNode  :  n                                                                                      NadeManager   :  n    
    SecondaryNameNode   :  n

    集群部署:

    NameNode和SecondaryNameNode不要安装在同一台服务器上
    ResourceManager也很占内存,不要和NameNode和SecondaryNameNode安装到同一台服务器上

      hadoop102 hadoop103

    hadoop104

    HDFS

    NameNode

    DataNode

    SecondaryNameNode

    DataNode

    DataNode YARN NodeManager NodeManager

    ResourceManager

    NodeManager

    hadoop102主要组件及作用

    组件 作用 NameNode

    1、HDFS主节点;管理节点

    2、管理元数据,管理文件系统空间,管理HDFS名称空间,管理数据块映射信息(数据块实际存储位置信息)、配置副本策略、处理客户端读/写操作【不熟】

    DataNode

    1、HDFS从节点;存储节点

    2、存储实际数据块

    3、执行数据的读/写操作

    NodeManager

    1、YARN从节点

    2、管理容器资源,监控应用程序运行状态

    hadoop103主要组件及作用

    组件 作用 SecondaryNameNode

    1、并非NameNode的热备,在NameNode挂掉时,不能立马替代NameNode并提供服务

    2、辅助NameNode,分担其工作量,定期合并Fsimage和Edits日志,推送给NameNode,同时减小NameNode的重启时间

    3、在紧急情况下,可以辅助恢复NameNode

    DataNode

    1、HDFS从节点

    2、存储实际数据块

    3、执行数据的读/写操作

    NodeManager

    1、YARN从节点

    2、管理容器资源,监控应用程序运行状态

    hadoop104主要组件及作用

    组件 作用 DataNode

    1、HDFS从节点

    2、存储实际数据块

    3、执行数据的读/写操作

    ResourceManager

    1、YARN主节点

    2、负责整个资源的分配和调度

    NodeManager

    1、YARN从节点

    2、管理容器资源,监控程序运行状态

     

     

    HDFS:NameNode(一个)、SecondaryNameNode(一个)、DataNode(多个)

    YARN:ResourceManager(一个)、NodeManager(多个)

    集群部署
    NameNode和SecondaryNameNode不要安装到同一台服务器上
    ResourceManager也很耗内存,不要和NameNode、SecondaryNameNode安装到同一台服务器上

     

      hadoop102 hadoop103 hadoop104 HDFS

    NameNode

    DataNode

    DataNode

    DataNode

    SecondaryNameNode

    YARN NodeManager ResourceManager
    NodeManager
    NodeManager

    hadoop102

    组件 作用 NameNode HDFS主节点,管理元数据、文件系统空间及从节点的实际位置信息,处理客户端请求 DataNode HDFS从节点,存储实际数据块,执行数据读写操作 NodeManager YARN从节点,管理容器资源、监控应用程序运行状态

    hadoop103

    组件 作用 DataNode HDFS从节点,存储实际数据块,执行数据读写操作 ResourceManager YARN主节点,负责整个资源分配和调度 NodeManager YARN从节点,管理容器资源、监控应用程序运行状态

    hadoop104

    组件 作用 SecondaryNameNode 定期合并NameNode中的Edit和Fsimage,减少NameNode重启时间

    DataNode

    HDFS从节点,存储实际数据块,执行读写操作 NodeManager YARN从节点,管理容器资源、监控应用程序运行状态

    4.
    为保障Hadoop集群内部进行免密通讯需要对    ssh    进行配置

    判断题:

    5.
    每次启动Hadoop都要格式化文件系统。
    ×
     

    6.
    在/etc/ssh文件映射ip和主机名称。              /etc/hosts文件
    ×
     

    7.
    修改~/.bashrc文件保存后,修改的内容能立即生效。    source ~/.sh
    ×

    8.
    在Hadoop的配置中,以下哪些是正确的配置文件优先级顺序?(假设所有配置文件都存在)
    A. (4)客户端代码中设置的值(2)ClassPath 下的用户自定义配置文件(3)服务器的自定义配置文件 (xxx-site.xml)(1)服务器的默认配置(xxx-default.xml)
    B. (3) 客户端代码中设置的值(2)ClassPath下的用户自定义配置文件(4)服务器的自定义配置文件(xxx-site.xml)(1)服务器的默认配置(xxx-default.xml)
    C. (1)客户端代码中设置的值(2)ClassPath下的用户自定义配置文件(3)服务器的自定义配置文件 (xxx-site.xml)(4)服务器的默认配置(xxx-default.xml)
    D. (4) 客户端代码中设置的值(2)ClassPath 下的用户自定义配置文件(1)服务器的自定义配置文件 (xxx-site.xml) (3)服务器的默认配置 (xxx-default.xml)

    C

    1. 客户端代码中设置的值
    2. ClassPath下用户自定义的配置文件
    3. 服务器的自定义配置文件(XXX-site.xml)
    4. 服务器的默认配置文件(XXX-default.xml)

     

     

    1. 客户端代码设置的值
    2. ClassPath下的用户自定义配置文件
    3. 服务器的自定义配置文件(XXX-site.xml)
    4. 服务器的默认配置文件(XXX-default.xml)

    10.
    在.ssh文件夹中,某些文件用于存放SSH密钥和授权信息。请选出存放公钥的文件是:
    A. known_host
    B. id_rsa
    C. id_rsa.pub
    D. authorized_keys

     

    11.
    Hadoop 环境配置搭建时,配置项fs.defaultFS在     core-site.xml     文件中进行配置,
    而副本数在    hdfs-site.xml       文件中进行配置

    12.
    HDFS NameNode 对用户的查询端口是  9870     
    YARN 查看任务运行情况的端口是   8088      

    三、HDFS

    使用命令查看/dataoutput文件的块信息

    hdfs fsck /dataoutput -files -blocks -locations

    hdfs fsck /dataoutput -files -blocks -locations

    HDFS的优点:

    1. 高容错性
    2. 处理大数据
    3. 可构建在廉价机器上

    1.
    HDFS的NameNode主要负责什么?
    A. 存储实际数据块       
    B. 管理文件系统的元数据(如文件目录结构)
    C. 处理MapReduce任务        
    D. 监控DataNode状态

    2.
    HDFS默认的副本数量是多少?
    A. 1
    B. 2
    C. 3
    D. 4

    3.
    HDFS不适合以下哪种场景?
    A. 存储大量小文件
    B. 流式读取大文件
    C. 高容错需求
    D. 离线批处理

     

    4.
    HDFS写操作的正确流程?
    A. 客户端切分文件— NameNode分配DataNode 一 管道写入一确认队列
    B. NameNode分配DataNode 一客户端切分文件一管道写入一确认队列
    C.管道写入一 客户端切分文件— NameNode分配DataNode 一 确认队列
    D. 客户端切分文件一管道写入一 NameNode分DataNode 一确认队列

     

    5.
    SecondaryNameNode的作用是?
    A. 实时备份NameNode数据     
    B. 合并Fslmage和EditLog以减小NameNode重启时间
    C. 替代故障的NameNode
    D. 存储数据块的校验和     

     

    6.多选(重点)
    HDFS的高可用性(HA)实现依赖以下那些组件?
    A. JournalNode
    B. ZooKeeper
    C. Active NameNode 和 Standby NameNode

    D. Secondary NameNode
     

    7.
    以下哪些是DataNode的职责?
    A. 存储实际数据块
    B. 定期向NameNode发送心跳和块报告

    C. 执行MapReduce任务         
    D. 管理文件系统命名空间      

     

    8.
    HDFS默认的块的大小在Hadoop 2.x版本中是     128MB     

    9.
    HDFS进入安全模式的命令是   
    hdfs dfsadmin -safemode enter
    hdfs dfsadmin -safemode enter

    10.
    HDFS默认的副本存储策略中,第一个副本存放在        客户端      所在节点

    11.
    HDFS 中负责管理元数据的守护进程是      NameNode      

    12.
    HDFS支持存储单个文件的大小超过PB级别。(判断题)                       

    13.HDFS的写入操作需要向客户端直接与DataNode通信完成数据块传输
    现本地的/zhangsan目录下有data.txt文件,请使用shell命令完成以下要求:
    1) 在hdfs的根目录下创建test目录。

    • hadoop fs -mkdir /test
    • hdfs dfs -mkdir -p /test

    2) 将本地/zhanjian/data.txt文件拷贝到hdfs的/test目录下。[上传]

    • hdfs dfs -copyFromLocal /zhanjian/data.txt /test
    • hdfs dfs -put /zhanjian/data.txt /test

    3) 在hdfs的/test目录下创建test.xml文件。hdfs dfs -touchz /test/test.xml

    hdfs dfs -touchz /test/test.xml

    4)将hdfs 的 /test/test.xml 下载到 Linux本地的当前目录。

    • hdfs dfs -copyToLocal /test/test.xml ./
    • hdfs dfs -put /test/test.xml ./

    5) 查看hdfs的 /test/test.xml文件内容。

    hdfs dfs -cat /test/test.xml

    part-r-00000

    14.
    HDFS默认Block Size的大小是    128MB       

    15.
    查看Hadoop集群各台服务器节点进程启动状况的命令       jps      

    16.
    HDFS的 edits 文件和 fsimage 文件中,      Edits文件      体现了HDFS最新状态

     

    17.
    数据节点(DataNode)负责存储数据,一个数据块会在多个DataNode 中进行冗余备份,HDFS 默认存储      3   

    18.
    格式化HDFS 系统的命令是     hdfs namenode -format    

    19.
    在 Maven 项目中 pom.xml 作用是记录项目的日志信息。(判断)

    ×

     

    20.编程

    ^返回目录下所有子文件和子目录的详细信息

    @Test
            
        public void testFileFiles() throws IOException {
              RemoteIterator    <  LocatedFileStatus   > listFiles = fs.  listFile  (new Path(\"/youxiuderen\"),   true   );
            while (listFiles.    hasNext()       ){
                    LocatedFileStatus      status = listFiles.next();

                //打印文件名字
                System.out.println(status. getPath().getName()    );
                //打印文件长度
                System.out.println(status.getLen());
                //打印文件权限
                System.out.println(status.    getPermission()   );
                //打印文件的分组
                System.out.println(status.getGroup());

                System.out.println(\"---------------beautiful------------\");
                BlockLocation[] blockLocations = status.    getBlockLocations()   ;

          
                for (BlockLocation blockLocation : blockLocations){
                    String[] hosts = blockLocation.  getHosts  ();
                    for (String host : hosts){
                        System.out.println(host);
                    }
                }
                System.out.println(\"-------------*****-------------\");
            }

        }

     

    @Test
        public void testListStatus() throws IOException {
                 FileStatus[]    listStatus = fs.   listStatus  (new Path(\"/\"));
            for (FileStatus fileStatus : listStatus){
                if (fileStatus.    isFile()    ){
                    System.out.println(\"file: \"+fileStatus.     getPath().getName()       );
                }else {
                    System.out.println(\"dirc: \"+fileStatus.getPath().getName());
                }
            }
        }

     

    下面是JAVA将HDFS上sunwukong.txt文件下载到用户电脑D盘,用户名为 atguigu,请在横线上填出缺少的部分
    (1)
    @Test
    public void testCopyToLocal() throws IOException,InterruptedException,URISyntaxException{
           Configuration configuration = new Configuration();
           FileSystem fs = FileSystem.get(new URI(  \"hdfs://172.18.0.2:9000\"    ),configuration,   \"atguigu\"    );
           fs.   copyToLocalFile  (false,new Path(\"/xiyou/huaguoshan/sunwukong.txt\"),new Path(\"    D:/sunwukong.txt           \"),true);
           fs.  close    ();
    }

    (2)

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.junit.Test;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    public class hadsClient {
        @Test
        public void testmkdir() throws URISyntaxException, IOException, InterruptedException {
            URI uri = new URI(\"   hdfs://172.18.0.2:9000    \");
            //创建一个配置文件
            Configuration configuration = new Configuration();
            //登录用户
            String user = \"     root     \";
            //获取客户端
            FileSystem fs = FileSystem.get(uri, configuration, user);
            fs.    mkdirs    (new Path(\"/youxiuderen\"));
            fs.    close()    ;
        }
    }
     

    (3)

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.*;
    import java.io.IOException;
    public class HDFSUploader{
        public static void uploadToHDFS(String localPath,String hdfsDir){
            Configuration conf = new Configuration();  
            //设置 HDFS 的默认文件系统地址(Eg. hdfs://namenode:8020) 
            conf.   set   (\"       fs.defaultFS      \",\"   hdfs://namenode:8020  \");
            try(FileSystem fs = FileSystem. get  (   conf    )){
               Path hdfsDirPath = new Path(   hdfsDir    );
               //检查 HDFS 目录是否存在
               if(       !fs.exists(hdfsDirPath)      ){
                  //创建目录(要求返回布尔值表示是否成功)
                  boolean success = fs.    mkdirs   (hdfsDirPath);
                  if(!success)
                  {
                      throw new IOException(\"Failed to create HDFS directory\");
                  }
               }
               //本地文件路径对象
               Path localFilePath = new Path(   localPath   );
               //上传文件到 HDFS
               fs.copyFromLocalFile( false,false,    localFilePath,hdfaDirPath    );
               System.out.println(\"File uploaded successfully!\");
            }catch(IOException e){
               e.         printStackTrace         ;
            }
        }

        public static void main(String[] args){
             //用户将data.txt上传到input目录下
             uploadToHDFS(\"/home/user/data.txt\",\"/user/hadoop/input\");
        }
    }

    21.
    简述 HDFS 里 NameNode、SecondaryNameNode、DataNode的功能

     

      功能 NameNode

    1、HDFS主节点;管理节点

    2、管理元数据,管理文件系统空间,管理HDFS名称空间,管理数据块映射信息(数据块实际存储位置)

    2、配置副本策略

    3、处理客户端读/写操作

    SecondaryNode

    1、并非NamNode的热备,当NameNode挂掉时,不能立马替代NameNode并提供服务

    2、辅助NameNode,分担其工作,定期合并Fsimage和Edits日志文件,并推送给NameNode,同时减小NameNode重启时间

    3、紧急情况下,可以辅助恢复NameNode

    DataNode

    1、HDFS从节点

    2、存储实际数据块

    3、执行数据的读/写操作

     

     

     

     

     

     

     

     

      功能 NameNode

    HDFS主节点、管理节点
    管理元数据、文件系统空间、名称空间

    管理数据块实际存储位置
    配置副本策略

    处理客户端读写请求

    SecondaryNode

    并非NameNode的热备,当NameNode挂掉时,并不能马上替代NameNode并提供服务

    辅助NameNode,分担其工作量,如定期合并Fsimage和Edit日志,推送给NameNode,减少NameNode的重启时间

    紧急情况下,可以辅助恢复NameNode

    DataNode

    HDFS从节点

    存储实际数据块

    执行数据的读/写操作

    22.
    在 Hadoop 的 HDFS 系统中,哪种角色负责维护和管理数据块的存储位置信息?

       NameNode    

    23.
    在 hadoop3.x 版本的 HFDFS 系统中,NameNode 为用户提供查询服务器的端口号是多少?
    A. 8020
    B. 9000
    C. 9870
    D. 50070

     

    24(多选).
    在Hadoop的分布式文件系统HDFS中,SecondaryNameNode的主要职责是什么?
    A.  存储最新的fsimage和edits日志
    В.  监控NameNode的状态
    C.  合并fsimage和edits日志生成新的镜像文件

    D.  执行数据块的分配和管理

     

    26(多选).
    HDFS上的文件数据块会保存多个副本,以提供容错和效率。以下哪些是HDFS默认的副本存放策略?
    A 副本一放在上传文件的数据节点或随机选择磁盘不太满、CPU不太忙的节点
    B.副本二放在与副本一所在机架不同的节点上
    C. 副本三放在与副本二相同机架的不同节点上

    D. 所有副本均匀分布在不同机架上的节点

     

    27.
    在HDFS的edits文件和fsimage文件中,  Edits文件      保存了 HDFS 的更新操作,
      Fsimage文件   保存HDFS的元信息。

     

    思考:

      1. 为什么块的大小不能设置太小,也不能设置太大?

     

    HDFS数据块大小的设置取决于磁盘的传输速率

    设置的太小,会增加寻址时间,导致程序一直在寻找这个数据块开始位置

    设置的太大,从磁盘的传输速率会明显大于定位这个块开始位置的时间,导致程序处理这个数据块的速度会非常慢

     

     

     

     

    HDFS块大小的设置取决于磁盘传输速率

    块设置太大,会使寻址时间增加,导致程序一直在寻找数据块开始位置

    块设置太小,从磁盘传输数据的时间明显大于定位这个数据块开始位置的时间,导致程序处理这个数据块的速度非常慢

     

        2. hdfs写数据流程

     

    1. 客户端通过DistributedFileSystem交互模块请求向NameNode上传文件,NameNode检查目标文件是否已经存在,检查文件目录和权限
    2. NameNode检查完后返回是否可以上传
    3. 客户端请求第一个Block可以上传到哪几个DataNode服务器
    4. NameNode返回三个DataNode服务器(有几个副本,就返回几个),分别是dn1,dn2,dn3
    5. 客户端通过FSDataOutputStream写入模块开始往dn1上传数据,dn1收到请求后调用dn2,dn2调用dn3,将这个通信管道逐级建立起来
    6. dn3,dn2,dn1逐级应答
    7. 客户端开始往dn1上传第一个Block(先从磁盘中读取数据,放到一个本地内存上缓存),以Packet(数据包)为单位,dn1收到一个Packet就会传给dn2,dn2再传给dn3,dn1每传一个Packet就会放入一个应答队列等待应答
    8. 当一个Block上传完之后,客户端再次请求上传第二个Block(就是第三步),若有多个Block,就重复执行3-8步,直到所有Block上传完毕

     

     

     

     

     

    1. 客户端通过DistributedFileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已经存在,检查目录结构和权限
    2. NameNode检查完后返回是否可以上传
    3. 客户端请求第一个Block可以上传到哪几个DataNode服务器
    4. NameNode返回了3个DataNode,分别是DataNode1、DataNode2、DataNode3
    5. 客户端通过FSDataOutputStream模块向DataNode1上传数据,DataNode1收到请求后调用DataNode2,DataNode2调用DataNode3,将这个通信管道逐级建立起来
    6. DataNode3,DataNode2,DataNode1逐级应答
    7. 客户端开始往DataNode1上传第一个Block,(先从磁盘读取数据放到一个本地内存上缓存),以Packet为单位,DataNode1收到一个Packet就会传给DataNode2,DataNode2传给DataNode3,DataNode1每传一个Packet就会放入一个应答队列等待应答
    8. 当一个Block传输完成后,客户端再次请求上传第二个Block(就是第三步),若有多个Block就重复3-8步,直到所有Block上传完毕

     

        3. 网络拓扑图---节点距离计数

     

    位置 Distance 相同节点 0 相同机架上的不同节点 2 相同集群上的不同机架上 4 不同集群上的节点 6

     

     

     

     

    位置 Distance 相同节点 0 相同机架上的不同节点 2 同一集群、不同机架上的节点 4 不同集群上的节点 6

     

        4. 机架感知

     

    1. 第一个副本放在客户端所在节点上,若客户端在集群外,随机选一个
    2. 第二个副本放在另一台机架上的随机节点上,不和第一个副本放在同一台机架上
    3. 第三个副本放在与第二个副本相同机架的另一个随机节点

     

     

     

     

    第一个副本放在客户端(Client)上;若客户端在集群外,随机选一个

    第二个副本放在另一台机架上的随机一个节点,不和第一个副本放在同一台机架上

    第三个副本放在与第二个副本一样的机架上的另一个随机节点

     

        5. hafs读取数据流程

    1. 客户端通过DistributedFileSystem交互模块向NameNode请求下载文件,NameNode通过查询元数据,找到目标文件所在的DataNode地址
    2. 挑选一台DataNode服务器(就近原则,然后随机)请求读取数据(按顺序读取,但存储顺序随机)
    3. DataNode开始往客户端传输数据(从磁盘读取输入流,以Packet为单位校验)
    4. 客户端以Packet为单位接收,现在本地缓存,然后写入目标文件

     

     

     

     

     

    1. 客户端通过DistributedFileSystem向NameNode请求下载文件,NameNode查询元数据,找到文件块所在的DataNode地址
    2. 挑选一台服务器(就近原则,然后随机),请求读取数据(按顺序读取,但存储的顺序随机)
    3. DataNode开始传数据给客户端(从磁盘里读取数据输入流,以Packet为单位进行校验)
    4. 客户端以Packet为单位接收,先在本地内存缓存,然后写入目标文件

     

    四、MapReduce

    MapReduce优点:

     

    1. 易于编程
    2. 良好的扩展性
    3. 高容错性
    4. 擅长对PB级别以上的海量数据进行离线处理

    MapReduce进程

     

    1. MrAppMaster:负责整个程序的过程调度和状态协调
    2. MapTask:负责Map阶段的数据处理流程
    3. ReduceTask:负责Reduce阶段的数据处理流程

    1.
    如果一个Map任务失败,MapReduce框架会如何处理?
    A. 终止整个作业
    B. 自动在其他节点重新执行该任务
    C. 仅记录错误日志
    D.由用户手动重启
    高容错机制

    2.
    以下哪个阶段不属于MapReduce任务流程?
    A. Split
    B. Merge      (Shuffle里合并操作)
    C. Shuffle
    D. Reduce
    MapReduce核心机制包括:Split、Map、Shuffle、Reduce、Output

    3.
    MapReduce的默认输入格式是?
    A. TextInputFormat
    B. KeyValueInputFormat
    C. SequenceFileInputFormat
    D. NLinelnputFormat
     

    4.
    Combiner的作用是?
    A. 合并多个Map任务的输出
    B. 在Map端本地聚合数据以减少网络传输
    C. 替代Reduce阶段
    D. 排序Map输出的键值对
     

    5.
    MapReduce的Shuffle阶段发生在?
    A. Map任务输出到Reduce任务输入之间
    B. Map任务开始之前
    C.Reduce任务输出之后
    D. 仅限Combiner阶段
     

    6.
    MapReduce作业中,以下哪些阶段由框架自动处理?
    A. 数据分片(Split)
    B. Map任务的输出排序
    C. Shuffle和Sort
    D. Reduce任务的最终输出写入
     

    7.
    以下哪些技术可以优化 MapReduce 性能 (多选)
    A 使用Combiner减少例络传输
    B.启用数据压缩(如Snappy)
    C. 增加Reduce任务数量

    D.避免使用Writable类型
     

    8.
    哪些操作可能导致 MapReduce 任务失败?(多选)
    A. Map任务抛出未捕获异常
    B. DataNode磁盘故障  (实际数据块,实际位置,默认副本数为3)
    C. Reduce任务等待 Map 任务输出超时
    D. 用户代码中调用System.exit()

    Map任务异常、Reduce超时或用户代码强制退出会导致任务失败,DataNode故障由HDFS副本机制处理,不直接影响任务(除非副本丟失)。

    9.
    Hadoop在Mapper和Reducer之间的过程叫做    Shuffle    

    10.
    MapReduce中可以通过    Counter类 ?       来创建自定义计数器。

    11.
    MapReduce默认的输入格式是      TextInputFormat      

    12.
    MapReduce中负责将Map输出进行分组排序的阶段是    Shuffle       阶段。

    13.
         Combiner     仅在Map端进行局部聚合,无法处理跨Map任务的全局聚合,最终仍需Reduce阶段完成最终结果处理。
     

    14.
         Shuffle    默认会对Map任务的输出按键进行排序

    15.
    MapReduce的Reduce任务数量必须由    用户显示指定/Partition数量    ×
    用户显式设置【job.setNumReduceTasks()】Partitioner 逻辑隐式决定 

    16.
    Map的主要工作是将多个任务的计算结果进行汇总
    ×

    17.
    下列哪些业务场景中,可以直接使用Reducer充当Combiner使用?()
    A.sum求和
    B.max求最大值
    C.count求计数

    D.avg求平均
     

    18.
       Partition    的数量决定Reduce的数量。

    19.
    WordCount案例在MapReduce中的流程是什么?
    WordCount案例:在给定的文本文件中统计每一个单词出现的总次数。请概述WordCount案例
    在遵循MapReduce编程模型下的主要执行步骤

    流程:Input阶段、Mapper阶段、Shuffle阶段、Reducer阶段、Output阶段

    1、Input阶段(输入阶段):

    • 输入数据:待处理的文本文件
    • 数据切片(Split):Hadoop将输入文件切分为多个InputSplit(默认为128MB),每一个InputSplit由一个MapTask进程处理

    2、Mapper阶段

    • 按行读取每一行记录
    • 将每行文本切分成单词
    • 生成的键值对

    3、Shuffle阶段:

    • 分区(Partitioning):
      将Mapper阶段的键值对按键的哈希值分配给不同的Reducer处理
    • 排序(sorting):
      MapTask对Mapper的输出按键排序
    • 本地聚合(Combiner):
      在 Map 端提前合并相同键的值
    • 数据传输:
      将排序后的键值对传输到对应的ReduceTask

    4、Reducer阶段:

    • 分组(Grouping):
      相同的键聚合成一个迭代器
    • 统计计数:
      遍历迭代器,累加总次数
    • 输出结果:
      输出最终键值对

    5、Output阶段:

    结果存储:ReduceTask将结果存储到HDFS文件系统

     

    Mapper阶段:

    • 用户自定义的Mapper要继承自己的父类
    • Mapper的输入类型是对的形式(KV类型可自定义)
    • Mapper的业务逻辑在map()方法里
    • Mapper的输出类型是对的形式(KV类型可自定义)
    • map()方法(MapTask进程)对每一个对调用一次

    Reducer阶段:

    • 用户自定义的Reducer要继承自己的父类
    • Reducer的输入类型是Mapper的输出类型,也是对
    • Reducer的业务逻辑在reducer()方法里
    • ReduceTask进程对每一个K相同的对调用一次reduce()方法

    Shuffle阶段:

    • 分区(Partition):根据键的哈希值将Mapper输出分配给不同的ReduceTask
    • 排序(Sort):MapTask对本地输出的键值进行排序
    • 可选本地聚合(Combiner):在Map端合并相同键的值

    Driver阶段:

    相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象

     

     

     

     

    答:WordCount程序的流程有Input阶段、Mapper阶段、shuffle阶段、Reducer阶段、Output阶段

    1. Input(输入阶段)

    • 输入数据:待处理的文本文件(如 TXT、CSV 等)。

    • 数据分片(Split):Hadoop 将输入文件切分为多个InputSplit(默认大小为 128MB),每个 Split 由一个 MapTask 处理。

    2. Map 阶段

    • 任务并行性:每个 MapTask 处理一个 InputSplit。

    • 处理逻辑

      1. 读取文本行:按行读取 Split 中的数据。

      2. 分词(Tokenize):将每行文本拆分为单词。

      3. 生成键值对:为每个单词生成的中间键值对。

    • 示例
      输入行:\"Hello world hello\" → Map 输出:[(\"Hello\", 1), (\"world\", 1), (\"hello\", 1)]

    3. Shuffle 阶段(数据洗牌)

    • 分区(Partitioning):根据键的哈希值将中间结果分配给不同的 ReduceTask(默认使用HashPartitioner)。

    • 排序(Sorting):MapTask 本地对输出键值对按键排序(如[\"apple\", \"apple\", \"banana\"])。

    • 合并(Combiner,可选):在 Map 端提前合并相同键的值(如将(\"apple\", 1), (\"apple\", 1)合并为(\"apple\", 2)),减少数据传输。

    • 数据传输:将排序后的键值对通过网络传输到对应的 ReduceTask。

    4. Reduce 阶段

    • 任务并行性:多个 ReduceTask 并行处理不同分区的数据。

    • 处理逻辑

      1. 分组(Grouping):将相同键的所有值聚合为一个迭代器(如(\"apple\", [1, 1, 1]))。

      2. 统计计数:遍历值的迭代器,累加得到总次数(如sum([1, 1, 1]) = 3)。

      3. 输出结果:生成最终键值对

    • 示例
      输入:(\"apple\", [1, 1, 1]) → Reduce 输出:(\"apple\", 3)

    5. Output(输出阶段)

    • 结果存储:ReduceTask 将最终结果写入 HDFS 或其他存储系统,默认格式为文本文件(每行一个键值对,以制表符分隔)。

    Mapper阶段:

    1. 用户自定义的Mapper类要继承自己的父类
    2. Mapper的输入数据是KV对的形式(KV类型可自定义)
    3. Mapper的业务逻辑在map()方法里
    4. Mapper的输出数据也是KV对的形式(KV类型可自定义)
    5. map()方法(MapTask进程)对每一个调用一次

    Reducer阶段:

    1. 用户自定义的Reducer类要继承自己的父类
    2. Reducer的输入数据类型就是Mapper的输出数据类型,也就是KV对
    3. Reducer的业务逻辑在reduce()方法里
    4. ReduceTask进程对每一个K相同的组调用一次reduce()方法

    Shuffle阶段:

    1. 分区(Partitioning)根据键的哈希值将中间结果分配给不同的 ReduceTask(默认使用HashPartitioner)。
    2. 排序(Sorting):MapTask 本地对输出键值对按键排序
    3. 合并(Combiner,可选):在 Map 端提前合并相同键的值(如将(\"apple\", 1), (\"apple\", 1)合并为(\"apple\", 2)),减少数据传输。

    Driver阶段:

    相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象

     

    20.
    在不指定OutputFormat的情况下,MapReduce默认使用哪种类型的OutputFommat?
    A. TextOutputFormat
    B. SequenceFileOutputFormat
    C. NullOutputFormat
    D. KeyValueOutputFormat

     

    21.
    在大数据处理中,combiner(局部聚合)和reducer(全局聚合)都是用来聚合数橱的组件。它们的主要区别在于运行位置,请问它们的区别具体是什么?
    A. 执行阶段不同
    B. 功能不同
    C. 输入格式不同
    D. 输出格式不同

     

    22.
    Hadoop MapReduce中,我们可能会遇到分区相关的问题。请根据你的理解选择正确的描述:
    A .Partitioner是一个负责实现数据分配的类
    B. 默认的分区方式是Hash分区
    C. Partition的作用之一是平衡Reduce阶段的负载

    D. Reducer的数量由Map任务的数量决定

     

    23.
    Hadoop官方示例源码WordCount程序,从结构上可以分为3个部分。请问,下列选项中哪些属于该
    程序的核心模块?
    A. Driver模块
    B. Mapper模块
    C. Reducer模块

    D. Main模块

     

    24.
    在MapReduce中,使用    Partitioner       组件实现数据的分区,使用   Combiner    组件实现数据的合并。

     

    MapReduce 编程规范(简述)共三个

    Mapper阶段:

    1. 用户自定义的Mapper类要继承自己的父类
    2. Mapper的输入数据是KV对的形式(KV类型可自定义)
    3. Mapper的业务逻辑在map()方法里
    4. Mapper的输出数据也是KV对的形式(KV类型可自定义)
    5. map()方法(MapTask进程)对每一个调用一次

    Reducer阶段:

    1. 用户自定义的Reducer类要继承自己的父类
    2. Reducer的输入数据类型就是Mapper的输出数据类型,也就是KV对
    3. Reducer的业务逻辑在reduce()方法里
    4. reduce()方法(ReduceTask进程)对每一个K相同的组调用一次

    Shuffle阶段:

    1. 分区(Partitioning)根据键的哈希值将中间结果分配给不同的 ReduceTask(默认使用HashPartitioner)。
    2. 排序(Sorting):MapTask 本地对输出键值对按键排序
    3. 合并(Combiner,可选):在 Map 端提前合并相同键的值,减少数据传输。

    Driver阶段:

    相当于YARN集群的客户端,用于提交我们整个程序到YARN集群,提交的是封装了MapReduce程序相关运行参数的job对象

    编写程序一

    (1)编写 Mapper 类

    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;

    public class WordCountMapper extends Mapper {
        Text key2 = new Text();
        IntWritable value2 = new   IntWritable(1)    ;
        @Override
        protected void map(LongWritable key1,Text value1,Context context) throws IOException, InterruptedException {
            //1.
            String data = value1.   toString()   ;
            //2.
            String[] words = data.split(\" \");
            //3.
            for (String word : words){
                  key2.set(word)            
                context.   write     (key2,value2);
            }

        }

    }
     

    (2)编写 Reducer 类

    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;

    import java.io.IOException;

    public class WordCountReducer extends Reducer {
        int tot;
        IntWritable value4 = new IntWritable();
        @Override
        protected void reduce(Text key3, Iterable values3, Context context) throws IOException, InterruptedException {
            //1、
            tot = 0 ;
            for (IntWritable v3 : values3){
                  ?模糊   tot += v3.get()     
            }
            //2、
            value4.set(tot);
            context.write(key3,value4);
        }
    }
     

    (3)编写 Driver 驱动类

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IntWritable;

    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

    import org.apache.hadoop.io.Text;
    import java.io.IOException;

    public class WordCountDriver {
        public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {
            //1.

        Configuration conf = new Configuration();         

         Job job = Job.getInstance(conf);                   

            //2.
            job.     setJarByClass         (       WordCountDriver        .class);

            //3.
            job.  setMapperClass   (  WordCountMapper.class );
            job.    setReducerClass     (WordCountReducer.class);

            //4.
            job.   setMapOutputKeyClass     (       Text.class         );
            job.     setMapOutputValueClass    (IntWritable.class);

            //5.
            job.  setOutputKeyClass   (Text.class);
            job.setOutputValueClass(IntWritable.class);

            //6.

       FileInputFormat.setInputPaths(job,new Path(args[0]));  

       FileOutputFormat.setOutputPath(job,new Path(args[1]));   

            //7.
            boolean result =          job.waitForCompletion             ;
            System.out.println(    result ? 0 : 1     );

        }
    }
     

     

    编写程序二

    Hadoop习题练习

     

    (1)LogMapper的代码如下:

    package OutputFormatTest;

    import org.apache.hadoop.io.LongWritable;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;

    import java.io.IOException;

    public class LogMapper extends Mapper<LongWritable, Text,Text,     NullWritable     > {
        @Override
        protected void map(LongWritable key,Text value,Context context) throws IOException, InterruptedException {
            context.write(  value  ,  NullWritable.get() );
        }
    }
     

    (2)LogReducer的代码如下:

    package OutputFormatTest;

    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;

    import java.io.IOException;

    public class LogReducer extends Reducer {
        @Override

        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            for (  NullWritable   value : values){
                context.write(key,    value.get()    NullWritable );
            }
        }
    }
     

    (3)LogOutputFormat代码如下:

    package OutputFormatTest;

    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.RecordWriter;
    import org.apache.hadoop.mapreduce.TaskAttemptContext;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

    import java.io.IOException;
    import java.util.logging.LogRecord;
    public class LogOutputFormat extends FileOutputFormat {
        @Override
        public RecordWriter        getRecord  ?  getRecordWritable          ( (?)      TaskAttempt    TaskAttemptContext   job) throws IOException, InterruptedException {
            LogRecordWriter logRecordWriter = new LogRecordWriter(   job  );
            return logRecordWriter;
        }
    }
     

    (4)LogRecordWriter的代码如下:

    package OutputFormatTest;

    import org.apache.hadoop.fs.FSDataOutputStream;
    import org.apache.hadoop.fs.FileSystem;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.IOUtils;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.RecordWriter;
    import org.apache.hadoop.mapreduce.TaskAttemptContext;

    import java.io.IOException;

    public class LogRecordWriter extends RecordWriter {
        private      FSDataOutputStream    atguiguOut;
        private FSDataOutputStream otherOut;
        
        public LogRecordWriter(TaskAttemptContext job){
            try {
                FileSystem fs = FileSystem.get(job.   getInstance(conf)   getConfiguration() );
                atguiguOut =      fs.create    (new Path(\"/root/IdeaProjects/mapReduceDemo/logOutputTest/log/atguigu.log\"));
                otherOut =        fs.create       (new Path(\"/root/IdeaProjects/mapReduceDemo/logOutputTest/log/other.log\"));
                
            } catch (IOException e) {
                throw new      Runtime   RuntimeException   (e);
            }
        }

        @Override
        public void write(Text key, NullWritable nullWritable) throws IOException, InterruptedException {
            String log = key.          toSring()         ;
            if (log.       contains       (\"atguigu\")){
                atguiguOut.    writeBytes     (log+\"   \\n  \");
            }else {
                otherOut.writeBytes(log+\"\\n\");
            }
            
        }
        @Override
        public void close(TaskAttemptContext taskAttemptContext) throws IOException, InterruptedException {
            IOUtils.   closeStream     (atguiguOut);
            IOUtils.closeStream(otherOut);
            
        }
    }
     

    (5)LogDriver的代码如下:

    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.fs.Path;
    import org.apache.hadoop.io.NullWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Job;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
     
    import java.io.IOException;
     
    public class LogDriver {
        public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

            Configuration configuration=new Configuration();
            Job job=Job.getInstance(configuration);
     

            job.setJarByClass(       LogDriver.class      );
     

            job.setMapperClass(LogMapper.class);
            job.setReducerClass(LogReducer.class);

            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(   NullWritable.class             );
     

            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(   NullWritable.class           );
     

            job.setOutputFormatClass(LogOutputFormat.class);                 

     

            FileInputFormat.    setInputPaths           (job,new Path(\"/root/IdeaProjects/mapReduceDemo/logOutputTest/input\")); 

            FileOutputFormat.    setOutputPath   (job,new Path(\"/root/IdeaProjects/mapReduceDemo/logOutputTest/output\"));

            boolean result=job.      waitForCompletion      (true);
            System.exit(result?0:1);
        }
    }
     

     

     

     

    五、Maven 项目相关

    在 maven 项目中 pom.xml 作用是记录项目的日志信息(判断)
    ×

     

    六、Yarn

    1.
    YARN 的三种调度器级主要功能(不熟)

     

    调度器 功能 FIFO Scheduler(先进先出调度器)

    1、单队列

    2、先进先出原则

    Capacity Scheduler(容量调度器)

    1、多队列

    2、计算能力调度器,选择资源占用量最小、优先级高的先执行

    3、多用户情况下,可以最大化集群的吞吐和利用率

    Fair Scheduler(公平调度器)

    1、多队列

    2、公平调度,所有job占用相同资源

     

     

     

     

     

    调度器 功能 FIFO Scheduler  (先进先出调度器)

    1、单队列

    2、先进先出原则

    Capacity Scheduler  (容器调度器)

    1、多队列

    2、计算能力调度器,选择资源占用小、优先级高的先执行

    3、多用户情况下,可以最大化集群的吞吐和利用率

    Fair Scheduler  (公平调度器)

    1、多队列

    2、公平调度,所有job占用相同的资源

    2.
    在计算机系统中,某个组件负责资源配置的分配和任务的执行
    A. YARN
    B. Spark   分布式计算框架
    C. HDFS   分布式文件存储系统
    D. Kafka   分布式消息队列系统

     

    3.
    在分布式运算时,有一个角色负责整个程序的过程调度以及状态协调。它是?
    A. MapTask
    B. ReduceTask
    C. MrAppMaster
    D. DataNode