Apache Hadoop与流计算
外观
Hadoop与流计算[编辑 | 编辑源代码]
Hadoop与流计算(Hadoop and Stream Processing)是指利用Hadoop生态系统处理实时数据流的技术。传统Hadoop(如MapReduce)主要用于批处理,而流计算则专注于连续到达的数据,适用于需要低延迟分析的场景(如金融交易监控、物联网传感器数据处理)。
核心概念[编辑 | 编辑源代码]
流计算与批处理的区别[编辑 | 编辑源代码]
特性 | 批处理 | 流计算 |
---|---|---|
数据处理方式 | 处理完整数据集 | 处理连续数据流 |
延迟 | 高(分钟至小时) | 低(毫秒至秒) |
典型框架 | MapReduce | Apache Storm/Flink/Spark Streaming |
Hadoop生态中的流计算框架[编辑 | 编辑源代码]
- Apache Storm:纯流处理框架,支持毫秒级延迟。
- Apache Flink:统一批流处理,支持状态管理和精确一次语义。
- Spark Streaming:微批处理(将流数据切分为小批次)。
技术实现[编辑 | 编辑源代码]
示例:Spark Streaming词频统计[编辑 | 编辑源代码]
以下代码演示如何使用Spark Streaming处理TCP socket输入的文本流:
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
# 初始化StreamingContext(每2秒一个批次)
sc = SparkContext("local[2]", "NetworkWordCount")
ssc = StreamingContext(sc, 2)
# 监听本地9999端口
lines = ssc.socketTextStream("localhost", 9999)
# 按空格分割单词并计数
words = lines.flatMap(lambda line: line.split(" "))
pairs = words.map(lambda word: (word, 1))
word_counts = pairs.reduceByKey(lambda x, y: x + y)
# 打印结果
word_counts.pprint()
ssc.start() # 启动计算
ssc.awaitTermination() # 等待终止
输入示例(通过Netcat发送):
hello world hello hadoop
输出示例:
------------------------------------------- Time: 2023-07-20 08:00:02 ------------------------------------------- ('hello', 2) ('world', 1) ('hadoop', 1)
架构设计[编辑 | 编辑源代码]
关键组件说明: 1. 数据源:持续生成数据的系统(如Kafka、IoT设备) 2. 处理引擎:执行窗口聚合、过滤等操作 3. 输出:可同时支持实时响应和持久化存储
实际应用案例[编辑 | 编辑源代码]
案例1:电商实时推荐[编辑 | 编辑源代码]
- 场景:用户浏览商品时实时推荐相似商品
- 技术栈:
* 数据源:用户点击流(Kafka) * 处理:Flink计算物品共现频率 * 输出:Redis存储实时推荐结果
案例2:网络攻击检测[编辑 | 编辑源代码]
- 场景:识别DDoS攻击流量模式
- 技术实现:
* 使用Storm分析网络包速率 * 滑动窗口(5秒)统计IP请求次数 * 超过阈值时触发告警
性能优化[编辑 | 编辑源代码]
- 窗口策略:
* 滑动窗口(Sliding Window):重叠的时间区间 * 滚动窗口(Tumbling Window):不重叠的固定区间
- 公式:计算窗口内平均值
其中为窗口大小,为当前时间戳
挑战与解决方案[编辑 | 编辑源代码]
挑战 | 解决方案 |
---|---|
数据乱序 | 使用事件时间戳+水位线(Watermark) |
状态管理 | 定期检查点(Checkpoint) |
资源波动 | 动态扩缩容(如YARN资源调度) |
扩展阅读[编辑 | 编辑源代码]
- 状态管理:Keyed State/Operator State
- 时间语义:Event Time/Processing Time
- 容错机制:Exactly-Once/At-Least-Once