问答
* Hadoop有哪些组件,分别介绍一下
Hadoop Common: 为其他Hadoop模块提供基础设施,包括文件系统、远程过程调用(RPC)和序列化机制。
Hadoop Distributed File System (HDFS): 分布式文件系统,可以存储大量数据,并且提供高吞吐量的数据访问。
Hadoop YARN (Yet Another Resource Negotiator): 资源管理平台,负责集群资源的管理和调度。
Hadoop MapReduce: 分布式数据处理模型和执行环境,用于大规模数据处理。
* HDFS架构
NameNode: 存储文件的元数据,如文件名、目录结构、权限等信息,以及每个文件对应的Block列表。
DataNode: 存储实际的数据块(Block)。
Secondary NameNode: 辅助NameNode,定期合并FsImage和EditLog,防止EditLog过大。
* HDFS初始化命令
hdfs namenode -format
* HDFS原理
HDFS通过将大文件分割成固定大小的Block(默认128MB)存储在多个DataNode上,实现数据的分布式存储。NameNode负责维护文件系统的命名空间和文件与Block的对应关系,而DataNode负责处理文件系统客户端的读写请求。
* Yarn启动后有什么进程
Yarn启动后主要有以下进程:
ResourceManager (RM): 整个集群的资源管理器。
NodeManager (NM): 运行在每个节点上,负责启动Container和监控资源使用情况。
* Block大小为什么是128M
128MB是Hadoop 2的默认Block大小,这个大小是基于经验选择的,旨在优化磁盘传输和网络带宽的利用。更大的Block可以减少寻址开销,但也不是越大越好,需要根据具体应用场景和数据特点来调整。
* SecondaryNameNode的作用
Secondary NameNode定期合并NameNode的FsImage和EditLog,减少NameNode重启时合并日志的时间,同时避免EditLog文件过大。
* Yarn的架构
Yarn主要由以下几个组件构成:
ResourceManager: 整个集群的资源管理器,处理客户端请求,启动/监控ApplicationMaster,并监控NodeManager。
NodeManager: 管理单个节点的资源,启动Container,监控其资源使用情况。
ApplicationMaster: 为每个应用程序管理资源,并负责与ResourceManager协商资源。
Container: 运行任务的容器,包含一定的资源如内存、CPU。
* MR的架构
MapReduce架构包括:
JobTracker: 跟踪作业的进度,并负责资源分配给TaskTracker。
TaskTracker: 运行在数据节点上,执行Map和Reduce任务,并与JobTracker通信。
* Container是什么
Container是YARN中的资源抽象,它封装了某个节点上的资源如内存、CPU、磁盘、网络等。
* 如何提交MR任务
hadoop jar <jar_file> <main_class> [args]
* HDFS的详细架构
HDFS架构包括:
NameNode: 维护文件系统树和整个文件系统的命名空间。
DataNode: 存储实际的数据块。
Secondary NameNode: 辅助NameNode,执行日志的合并操作。
* FileSystem的创建过程
FileSystem的创建通常通过以下代码进行:
Configuration conf = new Configuration();
FileSystem fs = FileSystem.get(conf);
这个过程涉及到读取Hadoop配置文件,确定使用哪种文件系统,并通过RPC与NameNode通信。
* HDFS读写流程
读流程: 客户端通过NameNode获取文件Block的位置信息,然后直接从DataNode读取数据。
写流程: 客户端将数据写入第一个DataNode,该DataNode将数据复制到其他副本所在的DataNode。
* Block块的数量、切片的数量怎么计算
Block的数量通常由文件大小除以Block大小得出。切片的数量通常等于Map任务的数量,默认情况下等于输入文件的Block数量。
* 数据进入Map任务中的KV分别是什么
在默认的TextInputFormat中,每一行文本数据会被解析为一个KV对,其中Key是这一行文本的起始字节偏移量,Value是这一行的内容。
* InputFormat、FileInputFormat、TextInputFormat区别及作用
InputFormat: 定义了MapReduce作业的输入规范。
FileInputFormat: 是InputFormat的实现,用于处理文件系统中的数据。
TextInputFormat: 是FileInputFormat的子类,用于读取文本文件,每个记录是一行。
* MapReduce中Map任务数、Reduce任务数由什么决定
Map任务数通常由输入数据的切片数决定,Reduce任务数由用户在作业配置中指定。
* MapReduce默认Shuffle规则(分区规则)
MapReduce的默认Shuffle规则包括以下几个步骤:
分区(Partitioning): Map任务的输出会根据Reduce任务的数量进行分区。默认的分区器是HashPartitioner,它根据Key的哈希值来确定每个记录应该发送到哪个Reducer。
排序(Sorting): 在每个Map任务内部,输出数据会根据Key进行排序。
可选的Combiner操作: 在Map端,可以有一个Combiner函数,它对Map任务的输出进行局部聚合,减少网络传输的数据量。
分组(Grouping): 在Shuffle过程中,具有相同Key的所有Value会被组合在一起,传递给Reduce任务。
* MapReduce流程
MapReduce的流程主要包括以下几个阶段:
输入分片(Input Splitting): 输入数据被划分为多个分片,每个分片由一个Map任务处理。
Map阶段: 每个Map任务处理一个输入分片,产生一系列中间KV对。
Shuffle阶段: 中间数据根据Key进行排序、分组和可选的合并,然后分配给Reducer。
Reduce阶段: 每个Reduce任务处理一组具有相同Key的中间值,输出最终结果。
输出阶段: 将Reduce任务的输出写入到文件系统。
* MR默认格式化的类
MapReduce默认使用的格式化类是TextInputFormat和TextOutputFormat,它们分别用于处理文本格式的输入和输出。
* MR分区方式、排序原理
分区方式: 默认使用HashPartitioner,根据Key的哈希值来决定数据应该被发送到哪个Reducer。
排序原理: MapReduce对中间结果的Key进行排序,确保相同Key的数据能够被同一个Reducer处理。排序是在Map任务的环形缓冲区中进行,并在溢写(spill)到磁盘时完成。
* Combiner是什么
Combiner是一个在Map任务之后,Reduce任务之前运行的可选组件,用于对Map任务的输出进行局部聚合,以减少网络传输的数据量。
* 如何实现自定义排序
要实现自定义排序,可以:
实现WritableComparable接口,并重写compareTo方法来自定义比较逻辑。
在Job配置中设置自定义的RawComparator。
* 如何实现Join
实现Join操作通常有以下几种方法:
Map端Join: 在Map任务中读取所有需要的文件,并进行连接操作。
Reduce端Join: 在Map任务中输出Key和来源信息,然后在Reduce任务中进行连接。
半连接(Semi-Join): 在Map任务中只输出参与连接的关键Key,减少数据传输。
如何实现自定义分区
* 如何实现自定义分区
实现自定义分区需要:
创建一个类实现Partitioner接口。
重写getPartition方法,根据自定义逻辑返回分区号。
* 如何实现MapJoin
MapJoin通常用于小表和大表连接的场景,实现步骤如下:
在Mapper初始化时读取小表数据到内存。
在Mapper处理大表数据时,与小表数据进行连接。
* MapReduce执行流程
MapReduce的执行流程包括:
作业提交:客户端提交作业到ResourceManager。
作业初始化:ResourceManager分配一个ApplicationMaster,ApplicationMaster负责作业的初始化。
任务分配:ApplicationMaster向ResourceManager请求资源,并将任务分配给NodeManager。
任务执行:NodeManager执行任务,并定期向ApplicationMaster报告状态。
作业完成:所有任务完成后,作业完成。
MapReduce优化
* MapReduce优化
MapReduce优化可以包括:
使用Combiner减少网络传输。
调整Map和Reduce任务的数量。
使用自定义分区器来优化数据分布。
使用压缩来减少磁盘I/O和网络传输。
* MapReduce在Yarn上的执行流程
在Yarn上执行MapReduce的流程是:
客户端提交作业到ResourceManager。
ResourceManager分配一个ApplicationMaster。
ApplicationMaster请求资源并启动Map和Reduce任务。
NodeManager执行任务并向ApplicationMaster报告状态。
ApplicationMaster监控作业进度,直到作业完成。
* 粗粒度资源申请和细粒度资源申请
粗粒度资源申请:在整个作业执行期间,ApplicationMaster为每个任务申请固定的资源。
细粒度资源申请:ApplicationMaster可以根据任务的需要动态申请和释放资源。
* Yarn的调度策略
YARN(Yet Another Resource Negotiator)提供了几种调度策略,这些策略定义了如何将资源分配给在集群上运行的应用程序。以下是YARN支持的几种主要调度策略:
1. 容量调度器(Capacity Scheduler)
容量调度器旨在为多个组织提供共享集群资源的同时,保证每个组织获得一定量的资源。以下是容量调度器的主要特点:
队列: 集群资源被划分为多个队列,每个队列可以进一步划分为子队列,形成层级结构。
容量保证: 每个队列可以设定一个资源容量保证,确保队列可以获得至少这么多的资源。
弹性分配: 如果某个队列没有使用其全部容量,其他队列可以占用这些空闲资源。
优先级: 队列内部可以设置作业的优先级,高优先级的作业可以抢占低优先级作业的资源。
多租户: 适用于多租户环境,可以同时运行多个用户的作业,每个用户可以有自己的队列。
2. 公平调度器(Fair Scheduler)
公平调度器旨在为所有运行中的应用程序提供公平的资源分配。以下是公平调度器的主要特点:
公平性: 资源按照“份额”分配给应用程序,使得每个应用程序获得大致相同的资源量。
负载均衡: 尝试在所有运行的应用程序之间平衡资源使用。
可抢占: 如果一个应用程序长时间占用资源而不释放,调度器可以抢占其资源分配给其他应用程序。
队列: 支持队列和子队列,可以设置不同的权重来影响资源分配。
最小共享: 可以设置每个队列或应用程序的最小资源份额,确保它们至少获得这些资源。
3. 先来先服务调度器(FIFO Scheduler)
FIFO调度器是最简单的调度器,它按照作业提交的顺序分配资源。以下是FIFO调度器的主要特点:
顺序: 作业按照提交的顺序排队,先提交的作业先获得资源。
无优先级: 所有作业平等对待,不考虑作业的优先级或需求。
不支持多队列: FIFO调度器不支持多队列,所有作业都在一个队列中排队。
4. 自定义调度器
除了上述三种调度器,YARN还允许开发者实现自定义调度器,以满足特定的调度需求。自定义调度器需要实现YARN提供的调度器接口。
总结
选择哪种调度器取决于具体的集群环境和应用程序需求。容量调度器和公平调度器都是为多租户环境设计的,它们提供了更细粒度的资源管理和调度能力。FIFO调度器适用于单用户环境或对资源分配没有特殊要求的情况。在选择调度器时,管理员需要考虑集群的使用模式、用户的期望以及应用程序的特性。