024、大数据技术栈概览:Hadoop、Spark与Flink

张开发
2026/4/8 11:38:10 15 分钟阅读

分享文章

024、大数据技术栈概览:Hadoop、Spark与Flink
排查一个线上问题集群凌晨ETL任务突然卡住日志里反复报“No space left on device”。查了半天发现不是磁盘满而是HDFS的DataNode线程池耗尽——某个MapReduce任务开了上千个Mapper把节点拖垮了。这事儿让我重新审视团队的技术栈选型我们是否还在用“大炮打蚊子”今天聊聊Hadoop、Spark、Flink这三个老伙计它们不只是技术选项更是不同数据处理哲学的体现。Hadoop笨重但扎实的基石Hadoop的核心其实是HDFS和MapReduce。现在很少有人直接写MapReduce代码了但它的设计思想还在影响整个生态。记得刚接触时我对着WordCount例子琢磨了半天——为什么要把简单的事情拆成map、shuffle、reduce三步后来在处理TB级日志时才明白数据大到放不进单机内存时你只能切碎了慢慢啃。// 典型MapReduce结构伪代码map(key,value):// 这里踩过坑别在map里做全局统计它看不到全量数据emit(intermediate_key,intermediate_value)reduce(key,values):// 小心内存溢出values可能是海量迭代器resultaggregate(values)emit(key,result)Hadoop生态的精致在于YARN的资源调度。但它的痛点也很明显中间结果写磁盘太慢迭代计算比如机器学习训练能让你等到怀疑人生。我们团队现在只拿它做冷数据归档和超大规模批处理——就像仓库里那台老式冲床平时不用但压钢板时还得它上。Spark内存计算的暴力美学Spark最初就是针对Hadoop的磁盘IO瓶颈来的。第一次看到RDD弹性分布式数据集概念时我拍大腿了——把数据抽象成内存里的对象图这才是程序员该有的思维。但早期Spark调优简直是玄学内存分多少给storage多少给executionshuffle分区数设多少记得有个任务设了2000个分区结果调度开销比计算时间还长。// Spark典型操作Scalavalrddsc.textFile(hdfs://...).filter(_.contains(ERROR))// 转换懒加载这里不触发计算.cache()// 重要复用RDD一定要cache否则重复算// 行动操作触发DAG执行rdd.count()// 这里才真正跑任务// 踩坑提醒collect()小心点数据量大会把driver内存撑爆Spark Structured Streaming出来之后我们一度用它替换了部分流处理任务。但后来发现它的“微批处理”本质——底层还是按批次调度对秒级延迟敏感的场景还是勉强。不过MLlib和GraphX确实香特别是做图计算时比MapReduce版本快几十倍。Flink流处理的本质洞察Flink最颠覆的设计是把流作为一等公民批只是流的特例。刚开始接触时很不适应它的时间窗口、水位线、状态后端这些概念比Spark复杂得多。但做过一次实时风控系统后就真香了——事件时间处理、精确一次语义exactly-once这些特性在金融场景里是刚需。// Flink流处理片段Java APIDataStreamEventstreamenv.addSource(newKafkaSource()).keyBy(Event::getUserId).window(TumblingEventTimeWindows.of(Time.minutes(5))).process(newMyWindowFunction());// 关键理解水位线是“事件时间进度”的信使// 设太激进会丢数据设太保守延迟高——需要根据业务权衡我们在物联网场景用Flink处理传感器数据时遇到过状态后端爆内存的问题。后来切到RocksDB状态后端才稳住但IO开销又上来了。Flink的调优像走钢丝托管内存、网络缓存、检查点间隔……每个参数都可能成为瓶颈。技术选型的现实考量去年做数据平台升级时我们画了张二维图横轴是数据延迟要求小时级到毫秒级纵轴是开发运维成本。结果发现离线报表和天级T1任务还是跑在Hadoop上最经济资源利用率高失败重试机制成熟交互式查询和机器学习Spark占主导特别是Notebook开发模式算法同事喜欢直接写PySpark实时监控和事件驱动流程Flink一揽子解决但得配个懂内部机制的团队盯着有个经验之谈别盲目追求技术时髦。我们曾用Spark Streaming处理每分钟几个事件的数据流结果资源开销是Flink的3倍——杀鸡用牛刀还费电。调试心法Hadoop出问题先看资源检查YARN队列资源、HDFS磁盘平衡、DataNode线程数。它的错误信息经常是“症状”而非“病因”Spark应用慢时看DAG图Stage划分不合理会导致大量shuffle。记住窄依赖比宽依赖快合理分区数是核心技能Flink背压backpressure报警大概率是sink写慢了而不是计算逻辑问题。Kafka连接器配置不对能把整个管道拖垮最后说个反直觉的观点这三个框架未来可能都会淡出。云厂商的Serverless数据服务比如AWS Glue、Google Dataflow正在抽象掉集群管理的痛苦。但理解它们的核心思想——分而治之、内存优先、流式本质——比掌握API更重要。就像你会开车就行不必精通发动机原理但知道变速箱怎么工作至少能在半路抛锚时判断是不是该叫拖车。下次聊聊我们在混合架构里怎么让这三个系统共存Hadoop做数据湖底层存储Spark跑日终批量分析Flink处理实时流——像一支分工明确的工程队挖地基的、砌墙的、装修的各司其职。技术栈没有银弹只有适不适合你的业务节奏。

更多文章