乔人尹 - 学习
type: channel
link: https://underestimated.cn/tag/%E5%AD%A6%E4%B9%A0/
items: 大数据之Hadoop从入门到放弃之MapReduce

大数据之Hadoop从入门到放弃之MapReduce
type: item
date: 2023-01-07T14:59:00+00:00
description: 时间一晃而过，距离第一篇的大数据之Hadoop从入门到放弃（一）已经半年了，现在就连疫情也放开了，笔者刚从高烧中恢复，发烧的过程中害怕自己会不会挂掉，这不想起了未竟的学习事业，惊坐起继续写文。前言：从"存得下"到"算得动"上一篇我们认识了HDFS——一个能存下整个互联网的分布式文件系统。但是，光能存有什么用？就像你有一个装满了书的图书馆，但是没有图书管理员帮你找书、整理书，那这个图书馆就只是一个大号仓库。所以，这一篇我们来学习如何让大象干活——MapReduce。先讲一个悲伤的故事：有一天，老板让我分析一下公司过去5年的用户行为日志，大概10TB。我说："好的，我写个Python脚本跑一下。"3天后，老板问我结果。我说："脚本还在跑......"老板说："你被开除了。"这个故事告诉我们：单机处理大数据 = 职业生涯自杀。而MapReduce就是来拯救我们职业生涯的。一、MapReduce：分而治之的艺术1.1 核心思想：把大问题拆成小问题MapReduce的核心思想其实很简单，用四个字就能概括：分而治之。graph LR subgraph 传统思路["❌ 单机硬刚"] A[10TB数据] --> B[一台机器处理] B --> C[处理3天] C --> D[老板发火🔥] end subgraph MR思路["✅ MapReduce分治"] E[10TB数据] --> F[拆成1000份] F --> G[1000台机器并行处理] G --> H[合并结果] H --> I[几分钟搞定✨] end style D fill:#ff0000,color:#fff style I fill:#00ff00这就像什么呢？想象一下你要数清楚一个图书馆里所有书的总页数：方案做法耗时单人方案你一个人一本一本数一辈子MapReduce方案叫100个人，每人数一个书架（Map），最后把结果加起来（Reduce）一下午1.2 Map和Reduce到底是什么？graph TB subgraph MapReduce流程["🔄 MapReduce处理流程"] subgraph Input["📥 输入"] I1[数据块1] I2[数据块2] I3[数据块3] end subgraph Map阶段["🗺️ Map阶段"] M1[Mapper1处理 + 输出KV对] M2[Mapper2处理 + 输出KV对] M3[Mapper3处理 + 输出KV对] end subgraph Shuffle["🔀 Shuffle阶段"] S[排序 + 分组相同Key放一起] end subgraph Reduce阶段["📊 Reduce阶段"] R1[Reducer1聚合计算] R2[Reducer2聚合计算] end subgraph Output["📤 输出"] O1[结果文件1] O2[结果文件2] end I1 --> M1 I2 --> M2 I3 --> M3 M1 --> S M2 --> S M3 --> S S --> R1 S --> R2 R1 --> O1 R2 --> O2 end style M1 fill:#ff6b6b style M2 fill:#ff6b6b style M3 fill:#ff6b6b style S fill:#ffe66d style R1 fill:#4ecdc4 style R2 fill:#4ecdc4用人话来说：阶段做什么类比Map把输入数据转换成Key-Value对图书管理员给每本书贴标签Shuffle把相同Key的数据聚到一起把相同标签的书放到同一个箱子Reduce对相同Key的Value做聚合运算统计每个箱子里有多少本书1.3 一个公式理解MapReducemap: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3)翻译成人话：Map函数：输入一个键值对，输出一堆键值对Reduce函数：输入一个Key和它对应的一堆Value，输出结果二、经典案例：Word Count（程序员的Hello World）如果说学编程要写Hello World，那学MapReduce就必须写Word Count。2.1 问题描述统计一堆文本文件中，每个单词出现了多少次。输入：文件1: Hello World Hello Hadoop 文件2: Hello MapReduce World 文件3: Hadoop MapReduce Hadoop期望输出：Hadoop 3 Hello 3 MapReduce 2 World 22.2 MapReduce是怎么做的？graph TB subgraph 输入["📄 输入文件"] F1["文件1: Hello W…