拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

《从你点了一份外卖,到老板发现程序员是顶级牛马》一条外卖订单的大数据技术栈奇幻漂流

《从你点了一份外卖,到老板发现程序员是顶级牛马》一条外卖订单的大数据技术栈奇幻漂流

假设你是某电商app的核心开发,随着用户越来越多,每天都会产生海量的用户行为和订单数据。老板看了这些数据,得出一个惊人结论:程序员是顶级牛马。

你想验证这个结论,于是打开 MySQL,写了一条 SQL:按性别统计消费金额。结果 MySQL 直接卡死。为什么?因为数据量太大了。几百 GB 还能勉强撑一撑,到了 TB、PB 级别,MySQL 根本扛不住。这就是我们常说的大数据。

那怎么办?没有什么是加一层中间层不能解决的。这次我们加的中间层,叫 Hadoop。

Hadoop 是一套技术,由三个核心组件组成:HDFS、MapReduce、YARN。但大数据的核心难题就一个字:大。解决方案也就一个字:切。分而治之,把大问题切成小问题。

那我们先看看数据是怎么进来的。其实在数据存下来之前,还有一个很重要的东西,叫 Kafka。Kafka 是一个分布式消息队列,你可以把它想象成一个巨大的蓄水池。双十一零点,每秒几十万订单涌进来,如果直接往 HDFS 写,HDFS 会被瞬间冲垮。Kafka 先把这些数据接住,缓冲一下,再让下游按自己的节奏慢慢消费。它还能解耦上下游,上游只管发,下游只管读,互不干扰。同一份数据,实时风控、实时大屏、离线数仓都能读。而且 Kafka 可以攒批发送,比如攒够 16KB 或者等几毫秒,打包发出去,这样吞吐量就上去了。但你要知道,Kafka 本身不做计算,它只是负责把数据安全、平稳地送进后面的存储和计算引擎。

好,数据接住了,接下来解决怎么存。

一台服务器硬盘不够,就用多台。大文件切分成一个个 128MB 的数据块,分散放到多台服务器上。怕一台机器挂了丢数据,就多复制几份,默认三副本,放到不同机器备份。但问题来了:以前单机读写很简单,现在数据分散在几百台机器上,读写变得极其复杂。你怎么知道哪个块在哪台机器上?怎么保证一致性?

于是 HDFS 诞生了。全称 Hadoop Distributed File System,分布式文件系统。它有两个核心角色:NameNode 和 DataNode。NameNode 是大脑,负责管理整个文件系统的目录树和每个文件块的位置信息;DataNode 是苦力,真正存数据块的地方。你只需要调用 HDFS 的 API,它就能帮你切分、存储、备份、容错。你不用关心底层细节,就像用本地文件系统一样简单。

存储问题解决了,接下来解决怎么算。

假设我们要统计本年度的订单,按性别汇总消费金额。数据有 1000G,没有任何一台服务器能扛住。那就切。把数据切分成一个个分片,分给多台服务器并行计算,最后把结果聚合起来。但每台服务器怎么知道该怎么算?这就需要我们告诉它业务逻辑。我们写两个函数:一个 Map 函数,一个 Reduce 函数。Map 函数告诉每台服务器,每个分片里的数据怎么处理;Reduce 函数告诉服务器,Map 算完的结果怎么汇总。

这个“从 HDFS 读数据、切分片、执行 Map、Shuffle、执行 Reduce、汇总结果”的通用流程,被抽象成了一个框架,叫 MapReduce。MapReduce 的核心思想就是分而治之。它会把你的计算任务自动拆分成很多个小任务,分配到不同的机器上并行执行。中间还有一个 Shuffle 阶段,把相同 key 的数据拉到一起,交给 Reduce 处理。虽然它写起来有点麻烦,但它是大数据计算的基石。

存和算都解决了,还有什么问题?

每个分片都要跑一个 Map 任务,每个任务都要占 CPU 和内存。这么多任务,怎么管理?分配到哪些服务器上跑?这时候 YARN 登场了。全称 Yet Another Resource Negotiator,资源调度器。它在计算任务和服务器之间加了一层中间层,负责资源管理。它把每个任务需要的资源抽象成一个容器,容器里运行计算任务的代码。YARN 有两个核心角色:ResourceManager 和 NodeManager。ResourceManager 是全局大管家,负责整个集群的资源分配;NodeManager 是每台机器上的小管家,负责启动和监控容器。当 MapReduce 需要跑任务时,它会向 YARN 申请容器,YARN 根据资源情况分配,然后 MapReduce 把任务调度到对应的容器上运行。通过一系列资源申请和协调调度,完成所有 Map 和 Reduce 任务,最终得到结果。

到这里,存储、计算、资源调度都解决了。还有优化空间吗?

有。以前单机架构,我们写点 SQL 就搞定了。现在分布式集群,却要写一大堆 MapReduce 代码。这也太麻烦了吧?于是 Hive 出现了。它是 SQL 和 MapReduce 之间的中间层。你把 SQL 丢给它,它自动解析转换成 MapReduce 任务,运行完把结果返回给你。Hive 还有一个 MetaStore,用来存表的元数据,比如表名、字段、分区信息等。这样不会写 Java 的人,也能分析大数据。它让大数据的门槛一下子降低了很多。

还能再快吗?

MapReduce 的中间结果每次都往磁盘写,频繁读写磁盘,速度慢。那为什么不放内存呢?于是 Spark 出现了。它把中间结果放内存,放不下才放磁盘。Spark 的核心是 RDD,弹性分布式数据集,还有 DAG,有向无环图,可以把多个计算步骤串起来,减少落盘。速度比 MapReduce 快 10 到 100 倍。而且 Spark 也支持 SQL,叫 Spark SQL,可以直接查 Hive 表,性能更好。

还有问题吗?

双十一秒杀,一秒钟涌入几十万订单。MapReduce 和 Spark 都是批处理,得攒够一批才处理。攒的过程浪费时间,实时性不够。于是 Flink 出现了。来一条数据,处理一条数据。真正的流处理,毫秒级延迟。它还有状态管理和 Exactly-Once 语义,保证数据不丢不重。Flink 也能做批处理,但它的强项是流处理,特别适合实时性要求高的场景。

最后总结一下这条数据流水线:Kafka 负责接数据,HDFS 负责存数据,MapReduce 负责批量算,YARN 负责管资源,Hive 负责让 SQL 也能算,Spark 负责加速算,Flink 负责实时算。它们各司其职,共同构成了大数据处理的完整体系。

所以,下次你点外卖,看到推荐变了,背后就是这套系统在运转。

返回列表