大数据技术梳理:Hadoop Shuffle、Spark Shuffle与Hive、HBase优化

需积分: 0 0 下载量 127 浏览量 更新于2024-06-30 收藏 6.91MB DOCX 举报
"该项目笔记涵盖了多个IT领域的知识点,包括大数据处理框架Hadoop、Spark、Hive和HBase,以及数据库理论、Zookeeper和Kafka。此外,还涉及到数据倾斜问题和消息队列MQ的基本概念。笔记中通过两个实际问题展示了SQL查询和Kafka的offset管理。" 1. Hadoop的Shuffle过程: 在Hadoop MapReduce中,Shuffle阶段发生在Map任务和Reduce任务之间。首先,MapTask将处理后的数据暂存到内存缓冲区,当缓冲区满到一定阈值时,数据会被溢写到磁盘。在溢写过程中,会进行局部排序和合并(merge),确保相同分区的数据在一起,以便于Reduce任务的处理。 2. Spark的Shuffle流程: Spark的Shuffle操作与Hadoop类似,但在内存管理上有所不同。它使用HashPartitioner或RangePartitioner来决定数据如何在Executor之间分布。数据首先在Executor内存中进行排序,然后写入磁盘并生成临时文件。在Reduce阶段,数据被拉取并再次排序,以满足聚合或连接等操作的需求。 3. Spark on YARN的作业提交流程: 当Spark运行在YARN上时,客户端首先提交作业到YARN资源管理器,资源管理器为作业分配Container,并启动ApplicationMaster。ApplicationMaster负责任务调度和资源申请,协调数据计算。 4. Spark的任务调度流程: Spark的任务调度主要包括DAGScheduler和TaskScheduler两部分。DAGScheduler将应用拆分为Stage,每个Stage是一系列可以并行执行的任务集。TaskScheduler则将Stage进一步拆分成任务,分配给Executor执行。 5. Hive调优: Hive优化主要关注查询计划、元数据、执行引擎等方面。例如,使用合适的JOIN类型,避免全表扫描,合理使用PARTITION、SORT BY、CLUSTER BY和DISTRIBUTE BY等语句来优化数据分布和查询效率。 6. Hive的架构及角色功能: Hive由Metastore、Driver、Compiler、Execution Engine和Storage Handler等组件构成。Metastore存储元数据,Driver解析和编译SQL,Compiler生成执行计划,Execution Engine执行计划,Storage Handler处理数据的读写。 7. HBase的架构及角色功能: HBase是分布式列式存储系统,基于HDFS。其核心组件包括Master、RegionServer和Zookeeper。Master负责 Region 的分配和监控,RegionServer存储数据并处理用户请求,Zookeeper用于集群的协调和故障恢复。 8. 数据倾斜问题与解决方案: 数据倾斜是指数据在节点间不均匀分布,导致某些节点负载过高。解决方案包括调整分区策略、使用更复杂的哈希函数、手动负载均衡或数据预处理等。 9. Zookeeper的节点类型: Zookeeper节点分为持久节点、临时节点、有序节点和顺序持久节点,分别对应不同的生存时间和顺序标识。 10. Kafka的offset管理: Kafka的offset信息存储在Zookeeper中,基于Group进行管理,而不是每个Consumer。这样,即使Consumer失败,其他Consumer可以从Group的最新offset处继续消费,保证消息的连续性。 11. Kafka的分区分配策略: 分区分配策略包括轮询(Round Robin)和范围(Range)。轮询是简单地按顺序分配,而范围根据Consumer的数量将分区均匀分配。 12. 消息队列MQ的基本概念: MQ是消息传递中间件,用于解耦应用系统,提供消息的可靠传输。它通常包含消息发送、接收、存储和消费等功能,支持事务、持久化和多种协议。 13. SQL查询示例: - Question1: 使用COUNT(DISTINCT UserId)统计每天登录的唯一用户数(UV),COUNT(Login)统计登录总次数,按照日期升序排列。 ``` SELECT DATE(ActioinTime) AS '日期', COUNT(DISTINCT UserId) AS 'UV', COUNT(Login) AS '登录总次数' FROM User_Actioninfo WHERE ActionTime BETWEEN '2011-11-01' AND '2011-11-24' GROUP BY DATE(ActioinTime) ORDER BY '日期'; ``` - Question2: 统计一个月内用户发送消息的频次分布,按消息次数升序排序。 ``` SELECT COUNT(*) AS '用户数量', SUM(CASE WHEN SendMessage = 1 THEN 1 ELSE 0 END) AS '消息次数' FROM User_Actioninfo WHERE ActioinTime BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AND CURDATE() GROUP BY SendMessage ORDER BY '消息次数'; ``` 以上内容详细介绍了Hadoop、Spark、Hive、HBase、Zookeeper、Kafka以及MQ等相关技术的关键概念和应用场景,并结合实际问题展示了SQL查询和Kafka offset管理的实践。