hive计算机
了解Hadoop吗
Hadoop 框架是用于计算机集群大数据处理的框架,
Hadoop 框架最根本的原理就是利用大量的计算机同时运算来加快大量数据的处理速度。
主要包含 HDFS,MapReduce 和Yarn 这3个核心的组件,HDFS 负责分布储存数据;MapReduce ,Map的含义是使用使用分治的思想对大数据进行分解,映射成一个个Task进行并行计算,Reduce的含义是将Map处理的中间结果,最后汇总处理。
Hadoop 与关系型数据库的区别,各自优劣
数据模型
关系型数据库
Schema-on-Write(写时模式)
数据在写入前必须明确定义结构(表、字段、数据类型、约束等)。
例如:创建表时必须指定id INT PRIMARY KEY, name VARCHAR(255)。
优点:数据一致性高,适合事务处理。
缺点:灵活性差,无法直接处理非结构化数据(如日志、JSON、图像)。
Hadoop
Schema-on-Read(读时模式)
数据在写入时不用预定义结构,仅在读取时解析(如通过Hive、Spark定义表结构)。
例如:原始日志文件直接存入HDFS,查询时通过Hive映射为结构化表。
优点:支持任意格式数据(文本、JSON、Parquet、二进制文件等)。
缺点:数据质量依赖后期处理,可能引入脏数据。
扩展性
传统关系型数据库需要垂直扩展(Scale Up),
通过升级单机硬件(CPU、内存、存储)提升性能。
瓶颈:硬件成本呈指数级增长,单机容量和性能有限(比如TB级数据)。
适用场景:中小规模数据(如银行交易系统)。
不过现在很多云厂商都自研了分布式数据库,比如OceanBase就是可以实现水平扩展,但是在传统关系型数据库比如MySQL中是垂直扩展的。
Hadoop
水平扩展(Scale Out)
通过增加廉价机器节点扩展存储和计算能力。
例如:HDFS将数据分块(Block)存储在不同节点,MapReduce任务并行处理。
优点:理论上可无限扩展,适合PB级数据。
成本:硬件成本低,但集群管理复杂度高。
事务支持
关系型数据库
强ACID事务
ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
适用场景:高频事务处理(OLTP),如订单系统。
Hadoop
弱事务或无事务
HDFS:不支持事务,文件写入后不可修改(仅支持追加)。
HBase:支持行级原子性,但无跨行事务。
适用场景:离线分析、日志处理(最终一致性即可)。
查询对比
关系型数据库
实时交互式查询
基于SQL的优化引擎,支持复杂查询(Join、子查询、聚合函数)。
例如:SELECT COUNT(*) FROM orders WHERE date=‘2023-10-01’;
延迟:延迟低,适合OLTP和简单OLAP。
Hadoop
批处理与分布式计算
MapReduce:将任务拆分为Map(分片处理)和Reduce(汇总结果)阶段。
Spark:基于内存计算,支持批处理、流处理和机器学习。
延迟:分钟到小时级(原生MapReduce),优化后可达秒级(Spark)。
适用场景:ETL、全量数据分析、机器学习模型训练。
生态
关系型数据库,在大数据相关的生态比较少,但是在Hadoop有丰富生态:
存储层:HDFS、HBase(列式存储)、Kudu(实时分析)。
计算层:MapReduce(批处理)、Spark(内存计算)
查询层:Hive(SQL化)
Hadoop的MapReduce机制
Map reduce是一种分布式计算框架,核心思想是“分而治之”,通过将大规模数据处理任务分解为并行执行的子任务(Map阶段),再将结果汇总(Reduce阶段),最终完成复杂计算。
HDFS
HDFS的NameNode和DataNode
HDFS(Hadoop分布式文件系统)的集群里有两类节点,它们是以“管理节点-工作节点”的模式运行的:
- NameNode:负责管理整个文件系统的命名空间。它维护着文件系统的目录树结构,记录所有文件和文件夹的信息。这些信息会保存在本地磁盘的两个文件里:一个是命名空间镜像文件,另一个是编辑日志文件。
- DataNode:负责实际存储数据块。它们根据客户端或者NameNode的指令来存储和读取数据块,并且会定期向NameNode汇报自己存了哪些数据块。
NameNode的作用
NameNode非常重要!如果没有NameNode,整个文件系统就没法用了。因为NameNode存了文件系统的元数据(比如文件目录结构、数据块分布等),如果NameNode所在的机器挂了,文件系统里的所有文件就找不回来了,因为我们不知道如何根据DataNode上的数据块重新拼出完整的文件。
所以,Hadoop有机制来保证NameNode的容错性:
- 备份元数据文件:
NameNode会把元数据文件(命名空间镜像和编辑日志)备份到多个地方。通常的做法是,一边写到本地磁盘,一边同步写到一个远程的网络文件系统(比如NFS)。这样即使本地磁盘坏了,还能从远程恢复。 - 辅助NameNode(Secondary NameNode):
辅助NameNode并不是NameNode的备份,它的主要任务是定期把编辑日志和命名空间镜像合并,防止编辑日志太大。它通常会跑在另一台机器上,因为合并操作很耗CPU和内存。辅助NameNode会保存合并后的元数据副本,如果NameNode挂了,可以用它来恢复。不过,辅助NameNode的数据可能会比主NameNode稍微旧一点,所以还是会丢一点数据。如果主NameNode彻底挂了,可以把NFS上的元数据复制到辅助NameNode,然后把它变成新的主NameNode。
(另外,Hadoop还支持热备份NameNode,这个功能更高级,能实现高可用性,具体可以看HDFS高可用性的相关文档。)
NameNode存的文件的作用
NameNode通过命名空间镜像文件与编辑日志文件来实现对文件系统的目录树结构的维护。
命名空间镜像文件(FsImage)
作用
- FsImage 是 HDFS 文件系统命名空间的完整快照。
- 它包含了文件系统的目录结构、文件的元数据(如权限、块大小、副本数等)以及文件与数据块的映射关系。
- FsImage 是一个静态文件,记录了某个时间点的文件系统状态。
存储内容
- 文件系统的目录树结构。
- 文件的元数据(如文件名、权限、所有者、组、块大小、副本数等)。
- 文件与数据块(Block)的映射关系。
特点 - 完整性:FsImage 是文件系统的完整快照。
- 静态性:只有在 NameNode 启动或触发检查点(Checkpoint)时才会生成新的 FsImage。
- 较大体积:由于包含完整的命名空间信息,FsImage 文件通常较大。
生成时机
- NameNode 启动时加载 FsImage。
- 定期触发检查点(Checkpoint)时,SecondaryNameNode 或 Standby NameNode(在高可用模式下)会生成新的 FsImage。
编辑日志文件(EditLog)
作用
- EditLog 记录了自上一次 FsImage 生成以来,文件系统的所有更改操作(如创建、删除、重命名文件等)。
- 它是一个增量日志文件,用于在 NameNode 重启时恢复最新的文件系统状态。
存储内容 - 文件系统的所有更改操作,例如:
- 创建、删除、重命名文件或目录。
- 修改文件元数据(如权限、副本数等)。
- 更新文件与数据块的映射关系
客户端怎么访问HDFS?
HDFS给客户端提供了一个类似POSIX(可移植操作系统接口)的文件系统接口,所以用户写程序的时候不用关心NameNode和DataNode的具体细节,可以直接使用。
总结
- NameNode:管理文件系统的元数据,超级重要,挂了整个系统就完了。
- DataNode:存实际的数据块,定期向NameNode汇报。
- 客户端:通过NameNode和DataNode访问文件系统,用户不用关心底层细节。
- 容错机制:通过备份元数据和secondary NameNode来防止NameNode挂掉导致的数据丢失。
HDFS的高可用性
HDFS(Hadoop Distributed File System)的高可用性(High Availability, HA)通过消除 NameNode 单点故障 来实现。在传统HDFS架构中,NameNode是唯一的管理元数据的节点,一旦宕机,整个集群将不可用。HA机制通过引入 Active-Standby双NameNode架构 和 元数据同步机制,确保系统在NameNode故障时快速切换,保持服务连续性。
HDFS HA 的核心架构
-
双NameNode角色,提供两种namenode
Active NameNode:处理客户端请求,管理文件系统元数据。
Standby NameNode:实时同步Active NameNode的元数据,随时准备接管服务。目标:当Active NameNode故障时,Standby NameNode能在秒级内切换为Active状态。
-
共享元数据存储
JournalNodes(JNs):一组独立进程(通常3或5个节点),用于存储EditLog(操作日志)。功能:Active NameNode将EditLog写入JournalNodes,Standby NameNode从JournalNodes读取EditLog并同步元数据。
-
故障自动转移
ZooKeeper(ZK):协调集群状态,监控NameNode健康状态。ZKFC(ZooKeeper Failover Controller):运行在每个NameNode上的守护进程,负责触发故障转移。
-
数据节点(DataNode)的双向通信
所有DataNode同时向Active和Standby NameNode发送块报告(Block Report)和心跳,确保两者均掌握数据块位置信息。
Spark了解吗
Spark 是 Hadoop 生态系统里面广泛使用的分布式计算框架,对比MapReduce的基于磁盘的迭代计算,它主要是通过内存计算、弹性数据抽象和优化的DAG执行引擎提升计算效率。
Spark的原理
Spark的核心原理分别是RDD(弹性分布式数据集),DAG 执行引擎和内存计算优化。
-
弹性分布式数据集(RDD)
RDD(Resilient Distributed Datasets)是 Spark 的基本数据抽象,表示分布在集群节点上的不可变数据集合。
RDD将数据划分为多个分区,分布式存储在不同节点。容错性上,通过 Lineage(血统)记录数据生成过程,故障时重新计算丢失的分区。
持久化(Persistence)上,允许将 RDD 缓存到内存或磁盘,加速重复计算。
-
DAG 执行引擎
DAG(有向无环图)
Spark 将用户的作业转换为由 RDD 和操作构成的 DAG,优化执行顺序。执行流程是
逻辑计划阶段:将用户代码解析为 RDD 的转换和动作序列。
物理计划阶段:将 DAG 划分为多个 Stage(阶段),每个 Stage 包含多个 Task(任务)。
任务调度阶段:由 Driver 将 Task 分发给 Executor 执行。DAG的优势是
可以减少中间结果的磁盘写入。通过 Stage 合并优化并行度。 -
内存计算优化
内存存储:RDD 可缓存至内存,避免重复计算(如迭代算法)。
Spark 的组件
Spark 运行流程是怎样的
Spark 与 Hadoop MapReduce 对比
Hive了解吗
Hive是一个基于Hadoop的数据仓库工具,它的主要作用是简化大规模数据集的查询和分析。以下是需要Hive的原因及其作用:
为什么需要Hive?
简化大数据查询:Hive提供了一种类似SQL的查询语言HiveQL,使得没有编程背景的可以轻松地查询和管理存储在Hadoop分布式文件系统(HDFS)上的大规模数据集,直接编写复杂的MapReduce程序。
降低学习成本:相比直接使用MapReduce,Hive的学习曲线更平缓,因为它抽象了很多底层细节,使得开发人员可以更快地上手并进行数据处理工作。
提高开发效率:Hive避免了手动编写低级别的MapReduce作业,大大提高了数据处理和分析的开发速度。
扩展性与容错性:Hive支持集群的动态扩展,能够在不重启服务的情况下增加或减少节点。此外,它具备良好的容错机制,即使集群中的某些节点发生故障,也能保证SQL查询的完成执行
Hive有哪些部分组成
Hive支持的数据格式
Hive支持多种数据格式,主要分为行式存储和列式存储两大类,不同格式在性能、压缩率及适用场景上各有特点。
一、行式存储格式
TextFile
特点:默认存储格式,以纯文本形式存储数据,支持Gzip、Bzip2等压缩算法,但压缩后文件不可分割,处理时需全量读取。
适用场景:数据导入导出的中转场景(如ETL流程),适合字段较少或需要频繁全字段读取的情况。
缺点:存储效率低,反序列化开销大。
SequenceFile
特点:二进制文件格式,支持行式存储、压缩(None/Record/Block三种方式)及分片处理,适合MapReduce输入。
适用场景:需要原生压缩且兼顾性能的生产环境。
缺点:合并文件复杂,不支持直接查看内容。
二、列式存储格式
RCFile
特点:结合行组与列存储,先按行分块再按列压缩,减少I/O开销。
现状:已逐渐被ORC和Parquet替代。
ORC(Optimized Row Columnar)
特点:优化的列式存储,支持Zlib/Snappy压缩、事务操作及轻量级索引(如行组偏移量记录)。
优势:查询性能高,压缩率高(比TextFile节省约85%空间)。
缺点:兼容性较差,单个大文件压缩后可能无法分片。
Parquet
特点:通用列式存储,支持嵌套数据结构(如JSON)、多种压缩算法(Snappy/Gzip/LZO),兼容Spark等生态工具。
优势:兼容性优于ORC,适合复杂查询和跨平台场景。
缺点:复杂查询性能略低于ORC