# Summary - [[Hadoop]] 是基础,提供分布式存储([[HDFS]])和计算能力([[MapReduce]])。 - MapReduce 是 Hadoop 的一种计算方式,像个老工人,干活靠谱但效率不高。 - [[Hive]] 站在 Hadoop 肩膀上,帮你把 SQL 翻译成 MapReduce 任务,适合查大数据。 - [[Spark]] 是新世代工具,速度快、功能多,能用 HDFS 存数据,但计算上比 MapReduce 高级。 - [[Flink]] 也是新工具,特别擅长实时流处理,也能跟 HDFS 搭档。 它们就像一个团队:Hadoop 是仓库管理员,MapReduce 是老员工,Hive 是文员,Spark 是全能选手,Flink 是实时专家。大家可以一起干活,也可以各干各的。 # Cues [[数据@]] # Notes ## 技术栈 | 类别 | 技术/说明 | | ------------------------ | -------------------------------------------------------------- | | **数据收集/采集** | Flume, Kafka, Logstash<br>负责收集各种来源的数据流 | | **数据存储** | [[HDFS]](分布式文件系统)<br>HBase, Cassandra(列式存储)<br>MongoDB(文档型数据库)| | **计算引擎-数据处理** - 批处理 | [[Hadoop]]<br>[[MapReduce]]<br>[[Spark]] 批处理 | | **计算引擎-数据处理** - [[流式处理]] | [[Flink]]<br>Spark Streaming<br>Storm<br>Samza | | **资源调度** | [[YARN]]<br>Kubernetes<br>Mesos | | **查询分析** | [[Hive]](数据仓库)<br>Presto(交互式查询)<br>Impala | | **可视化/应用层** | Tableau<br>Superset<br>自定义应用 | ## 大数据常见问题通俗解释 |问题|核心特征|典型表现|主要危害| |---|---|---|---| |**数据倾斜**|分布不均|某些任务特别慢|性能瓶颈,资源浪费| |**数据膨胀**|体积暴增|中间数据过大|OOM,磁盘满| |**数据错误**|质量问题|结果不准确|计算失败,结果错误| ### 1. 数据倾斜 (Data Skew) **比喻:** 想象一个快递分拣中心,有10个工作人员负责处理包裹。理想情况下,每人应该处理100个包裹。但实际情况是: - 9个人各处理10个包裹(很快就完成了) - 1个人要处理910个包裹(累死了) **实际情况:** - 数据分布不均匀,某些分区的数据量特别大 - 少数任务处理大部分数据,其他任务早早结束等待 - 整体任务时间取决于最慢的那个任务 **常见原因:** ```Java 用户ID作为分组键时: - 普通用户: 10条订单 - 大客户/机器人: 100万条订单 → 处理大客户数据的节点成为瓶颈 ``` **症状:** - 任务执行时间特别长 - 某些任务进度停滞在99% - 部分节点CPU/内存爆满,其他节点空闲 **解决方法:** 1. **加盐(Salting)**:给倾斜的key加随机前缀 2. **两阶段聚合**:先局部聚合,再全局聚合 3. **过滤异常值**:单独处理超大key 4. **调整分区键**:选择分布更均匀的字段 --- ### 2. 数据膨胀 (Data Inflation) **比喻:** 你准备做一份10人的菜,结果: - 切菜时不小心切太碎,占了3个盆 - 加水时多加了10倍 - 最后变成了100人份,厨房装不下 **实际情况:** - 数据在处理过程中体积急剧增大 - 中间结果远大于输入和输出数据 - 导致磁盘/内存溢出 **常见原因:** ```sql -- 例子1: 笛卡尔积 SELECT * FROM 表A, 表B -- 没有JOIN条件 -- 表A: 1000行,表B: 1000行 -- 结果: 100万行! -- 例子2: 多对多JOIN 订单表(100万) JOIN 商品表(1000) -- 如果一个订单有多个商品,结果可能是500万行 -- 例子3: EXPLODE炸裂 一行数据包含100个元素的数组 EXPLODE后变成100行 ``` **症状:** - 中间临时文件特别大 - Shuffle阶段数据量暴增 - OOM (内存溢出) 错误 - 磁盘空间不足 **解决方法:** 1. **检查JOIN条件**:避免笛卡尔积 2. **提前过滤**:WHERE条件前置 3. **选择必要字段**:不要SELECT * 4. **增加资源**:调大内存、磁盘缓存 5. **分批处理**:大任务拆小 --- ### 3. 数据错误 (Data Error) **比喻:** 超市收银系统: - **脏数据**:商品条码是"abc123xyz"(格式错误) - **缺失数据**:价格字段是空的 - **逻辑错误**:出生日期是2030年(未来) - **重复数据**:同一笔订单录入了3次 **实际情况:** 数据质量问题导致计算结果不准确或程序崩溃 **常见类型:** ```python # 1. NULL值问题 age = None result = age + 10 # 报错 # 2. 类型不匹配 user_id = "abc" # 应该是数字 total = user_id * 100 # 错误 # 3. 重复数据 用户ID 订单金额 001 100 001 100 # 重复 001 100 # 重复 # 4. 数据不一致 订单表显示: 状态=已完成 支付表显示: 状态=未支付 # 矛盾 # 5. 异常值 年龄: -5, 300, 999 # 不合理 ``` **症状:** - 任务运行失败,报错退出 - 计算结果明显不对(如负数金额) - 数据统计对不上 - 类型转换异常 **解决方法:** ```sql -- 1. 数据清洗 SELECT * FROM orders WHERE order_date IS NOT NULL -- 过滤空值 AND amount > 0 -- 过滤异常值 AND amount < 1000000 -- 上限校验 -- 2. 去重 SELECT DISTINCT user_id, order_id FROM orders -- 3. 容错处理 SELECT COALESCE(age, 0) as age, -- NULL替换为0 CAST(price AS DECIMAL(10,2)) -- 类型转换,失败返回NULL -- 4. 数据校验 SELECT * FROM orders o LEFT JOIN payments p ON o.order_id = p.order_id WHERE o.status = 'completed' AND p.payment_status != 'paid' -- 找出不一致的数据 ```