# 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' -- 找出不一致的数据
```