1、HDFS 读写流程是什么?
HDFS(Hadoop Distributed File System)的读写流程如下:
写流程:
- 客户端向 NameNode 发送写请求,请求在 HDFS 上创建一个新的文件。
- NameNode 为该文件分配一些数据块(默认情况下为 128 MB)以及在哪些 DataNode 上存储这些数据块的信息。
- NameNode 向客户端返回可用于写入数据的 DataNode 列表。
- 客户端选择最近的 DataNode,并向其发送一个写入数据块的请求。
- DataNode 向客户端确认写入请求,并向其发送一个写入确认。
- 客户端开始向 DataNode 写入数据块。
- DataNode 将写入的数据块存储在本地磁盘上。
- DataNode 向客户端发送一个写入完成的确认。
- 客户端通知 NameNode 数据块已经写入完成。
- NameNode 更新文件元数据信息,并将这些信息写入持久化存储。
读流程:
- 客户端向 NameNode 发送读请求。
- NameNode 返回文件的数据块位置信息以及存储这些数据块的 DataNode 列表。
- 客户端选择最近的 DataNode,向其发送读取数据块的请求。
- DataNode 向客户端返回数据块。
- 客户端读取数据块,并向 DataNode 发送确认。
- 如果需要读取的数据跨越了多个数据块,客户端将重复执行步骤 3~5,直到读取了整个文件。
- 客户端关闭文件,结束读取过程。
需要注意的是,HDFS 写操作采用流水线式写入机制,即当一个数据块正在写入时,客户端可以继续写入下一个数据块,以此来提高写入效率。此外,HDFS 读操作还支持数据本地性优化,即优先在存储数据块的 DataNode 上进行数据读取,以减少网络传输的开销。
2、HDFS小文件过多会有什么危害,如何避免?
HDFS 中存在大量小文件会导致以下危害:
- 巨大的元数据开销:HDFS 的元数据信息保存在 NameNode 中,而每个文件在 HDFS 中都对应着一个元数据信息。如果存在大量小文件,NameNode 需要管理大量的元数据信息,这会导致 NameNode 压力过大,导致性能下降。
- 数据块的利用率低:HDFS 采用的是数据块存储模式,即将大文件分成多个数据块存储在不同的 DataNode 上。如果文件大小小于数据块的大小,也会将其存储在一个单独的数据块中,造成存储空间浪费,降低了存储空间的利用率。
- 数据读取效率低下:小文件较多时,HDFS 中存在大量的小文件,导致 NameNode 需要进行大量的元数据信息的管理,同时也会增加网络传输的开销,降低数据读取效率。
为了避免小文件过多的问题,可以采取以下措施:
- 合并小文件:将多个小文件合并成一个大文件,以减少 HDFS 中的小文件数量。
- 合并小文件存储到 SequenceFile 中:SequenceFile 是 Hadoop 提供的一种二进制文件格式,它可以将多个小文件合并为一个 SequenceFile 文件,进而减少 HDFS 中小文件数量。
- 使用 HAR 文件:HAR 文件是一种归档文件格式,它可以将多个小文件合并成一个文件,并对文件进行压缩和索引,以便于快速访问。
- 限制小文件创建:可以通过 HDFS 参数
dfs.namenode.fs-limits.max-files-per-directory
限制单个目录下的小文件数量。 - 使用其他文件系统:如果小文件数量较大,可以考虑使用其他文件系统,如 HBase 等,它们能更好地处理大量的小文件。
3、YARN 集群的架构和工作原理是什么?
YARN(Yet Another Resource Negotiator)是 Hadoop 中的资源管理器,它的主要作用是管理集群中的资源,并协调运行在集群上的应用程序。YARN 通过其独特的架构和工作原理,实现了集群资源的高效管理和应用程序的高效执行。
YARN 集群的架构如下:
- ResourceManager(RM):ResourceManager 是整个 YARN 集群的核心组件,它负责管理集群中的资源,如 CPU、内存、磁盘等,以及管理运行在集群上的应用程序。ResourceManager 的主要功能包括为应用程序分配资源、监控集群资源的使用情况、处理应用程序的启动和停止请求等。
- NodeManager(NM):NodeManager 是运行在每个节点上的代理组件,它负责管理该节点上的资源,如 CPU、内存、磁盘等,并与 ResourceManager 交互以管理资源的分配和回收。NodeManager 的主要功能包括启动和停止容器、处理容器状态信息、管理本地资源等。
- ApplicationMaster(AM):ApplicationMaster 是运行在集群上的每个应用程序中的组件,它负责为应用程序协调资源、处理任务分配、监控应用程序状态等。每个应用程序都会有一个对应的 ApplicationMaster。
- Container:Container 是 YARN 中的一个基本概念,它是资源的抽象表示,包括 CPU、内存、磁盘等资源,以及运行应用程序所需的执行环境。Container 是由 NodeManager 来启动和管理的,它负责运行一个特定的任务。
YARN 集群的工作原理如下:
- 应用程序向 ResourceManager 提交应用程序,包括应用程序的描述信息和资源需求。
- ResourceManager 为该应用程序分配一个 ApplicationMaster,ApplicationMaster 向 ResourceManager 请求资源,并为应用程序协调资源、处理任务分配、监控应用程序状态等。
- ResourceManager 根据 ApplicationMaster 的请求,为其分配资源并通知 NodeManager 在相应的节点上启动 Container。
- NodeManager 在相应的节点上启动 Container,并由 Container 中的 ApplicationMaster 协调任务执行。
- ApplicationMaster 向 ResourceManager 报告任务的执行状态,并请求更多的资源,以便在更多的 Container 中运行任务。
- 应用程序完成后,ApplicationMaster 通知 ResourceManager 释放资源,并停止容器的运行。
4、Hive 内部表和外部表的区别是什么?
Hive 是 Hadoop 生态系统中的一种数据仓库工具,可以将结构化的数据映射到 Hadoop 的 HDFS 上,并通过类 SQL 的方式来查询数据。在 Hive 中,数据可以被存储在内部表或外部表中,它们的区别如下:
- 存储位置:内部表的数据存储在 Hive 管理的 HDFS 目录下,而外部表的数据存储在用户指定的路径中,可以是 HDFS 或本地文件系统等。
- 数据管理:内部表是由 Hive 管理的,当删除内部表时,表的元数据和数据都会被删除。而外部表是由用户管理的,当删除外部表时,只会删除元数据,而不会删除数据。
- 数据备份和恢复:内部表的数据备份和恢复由 Hive 管理,而外部表的数据备份和恢复由用户自行管理。
- 数据导入和导出:内部表数据的导入和导出需要使用 Hive 的特定命令或 API,而外部表数据的导入和导出可以使用 Hadoop 或其他工具。
- 数据共享:内部表只能被 Hive 识别和访问,而外部表的数据可以被多个应用程序或工具访问,包括 Hive。
综上所述,内部表和外部表的主要区别在于数据的存储位置、管理方式和备份恢复策略等方面。在实际应用中,应根据实际情况选择使用内部表还是外部表。如果数据是由 Hive 管理的,并且不需要共享给其他应用程序或工具,则应该使用内部表。如果数据需要在多个应用程序或工具之间共享,并且需要由用户自行管理,则应该使用外部表。
5、Flink 相比 Spark Streaming 有什么区别?
Flink 和 Spark Streaming 都是实时流处理框架,它们都可以处理实时数据流,并支持流处理的多种应用场景。它们之间的区别如下:
- 数据处理模型:Flink 和 Spark Streaming 采用不同的数据处理模型。Flink 采用基于事件驱动的模型,它将数据流看作事件序列,并在事件到达时立即处理。而 Spark Streaming 采用基于微批处理的模型,它将数据流分成一系列小的批次进行处理。
- 精度:Flink 的流处理精度可以达到毫秒级别,而 Spark Streaming 的批处理间隔默认为数秒,精度较低。
- 状态管理:Flink 的状态管理机制非常灵活,可以在内存和磁盘之间进行平衡,从而支持更复杂的应用场景。Spark Streaming 的状态管理机制比较简单,仅支持将状态存储在内存中。
- 任务调度:Flink 采用基于优先级的任务调度策略,它可以在集群中自动调整资源分配。而 Spark Streaming 使用 Spark 的任务调度器,调度器仅仅会考虑 CPU 和内存资源,无法考虑网络带宽等其他因素。
- 应用场景:Flink 适用于对低延迟和高吞吐量的需求较高的应用场景,如金融交易分析、网络实时监控等。Spark Streaming 适用于对实时数据处理要求较低,但需要大规模批量处理的场景,如离线批量分析等。
综上所述,Flink 和 Spark Streaming 都有自己的优势和适用场景,具体的选择应该根据具体的应用场景和需求来进行。如果需要实现低延迟、高吞吐量的实时数据处理,可以考虑使用 Flink;如果需要对大规模数据进行批量处理,可以考虑使用 Spark Streaming。
6、星型模型和雪花模型的区别是什么?
星型模型和雪花模型是数据仓库中最常用的两种数据建模方式,它们的主要区别如下:
- 结构复杂度:星型模型中只包含一个事实表和多个维度表,所有维度表都直接关联到事实表。而雪花模型相比星型模型多了一个步骤,即将维度表进行归一化,使得维度表中的属性也可以成为新的维度表,从而产生更多的维度表,这样可以降低冗余度,但同时也增加了模型的复杂度。
- 灵活性:星型模型比较简单,易于理解和维护,同时也具有较好的查询性能。但它的灵活性相对较低,难以应对一些复杂的查询场景。而雪花模型相对灵活,可以支持更多的查询场景,但同时也会增加查询的复杂度。
- 存储空间:星型模型中存在大量的冗余数据,而雪花模型将维度表进行归一化,可以减少冗余数据,节省存储空间。
- 可读性:星型模型比较简单,易于理解和维护,同时也具有较好的可读性。而雪花模型的结构比较复杂,可读性相对较低。
综上所述,星型模型比较适合简单的数据分析场景,如数据统计、报表分析等;而雪花模型比较适合复杂的数据分析场景,如数据挖掘、OLAP 分析等。同时,在具体应用时,应根据数据规模、查询场景和应用需求等因素来选择适合的数据建模方式。