专栏首页linjinhe的专栏设计数据密集型应用(10-11):大数据的批处理和流处理

设计数据密集型应用(10-11):大数据的批处理和流处理

第 10 章和第 11 章,介绍“大数据”的处理,分两个大类:

  1. 批处理(Batch Processing),用于处理大规模离线任务。“大规模”体现在:每次处理输入的数据量大;每次处理运行的时间长(可能几分钟~几天)。
  2. 流处理(Stream Processing),用于处理半离线、准实时任务。流处理系统每次处理的数据一般是一个刚刚生成的“数据”/“事件(event)”。

大数据处理,主要要解决三个问题:

  1. 数据挖掘。
  2. 扩展性。
  3. 容错性。

批处理系统和流处理系统主要解决 2 和 3 两个问题。

批处理

谈大数据批处理,绕不过的就是 MapReduce。MapReduce 是大数据处理的老祖宗了。

2004 年 Google 发表了一篇论文 MapReduce: Simplified Data Processing on Large Clusters。论文介绍了 MapReduce 的历史,API 的设计和实现,以及 Google 内部使用了 MapReduce 的一些生产案例,但是没有开源代码。后来,开源社区参考这篇论文自己撸了一个 MapReduce 框架配合 HDFS 使用。

MapReduce 的基本思想是提供一套非常简洁的数据处理 API —— 用户只需要实现一个 map 函数和一个 reduce 函数。剩下的繁琐的扩展性和容错系统问题由 MapReduce 框架负责处理。

Map 函数的输入是「一条记录」,然后经过处理,输出 0~N 个 key-value。Mapper 的输出是 Reducer 的输入。

Reduce 函数的输入是「key + key 相同的所有 value」,输出是本次 MapReduce 任务的结果。

一次 MapReduce 的执行流程如下:

  1. Map 阶段:
    1. 将 Mapper 任务调度到文件分片所在的机器。
    2. 读取文件,解析数据,然后调用 map 函数,得到输出,根据 key 进行分片(分片数量和 Reducer 的数量一致),写入到文件。
    3. 对得到的每个文件根据 key 进行排序。
  2. Reduce 阶段:
    1. 拉取要处理的文件,进行一次合并,得到一个根据 key 排序的文件。
    2. 读取文件,解析数据,然后调用 reduce 函数,得到输出,写入结果文件。

举个例子进行说明:WordCount - 计算文件(一行一个单词)中每个单词出现的次数。

Map 函数:

map(String key, String value) :
  // key: file name
  // value: file content
  for each word w in value :
    EmitIntermediate(w, "1");

Reduce 函数:

reduce(String key, Interator values) :
  // key: a word
  // value: a list of counts
  int result = 0;
  for each v in values :
    result += ParseInt(v);
    Emit(AsString(result));
  1. Map 阶段 —— 将文件内容拆成一个个单词:
    1. 将 Mapper 任务调度到文件分片所在的机器。
    2. 读取文件,解析数据,然后调用 map 函数,得到一个个 「word, "1"」的输出。根据单词进行哈希分片,写入到文件。
    3. 对得到的每个文件根据 key 进行排序。这样可以保证同一个单词的 key-value 都在文件中相邻的位置。
  2. Reduce 阶段 —— 对每个单词出现的次数进行统计:
    1. 拉取要处理的文件,进行一次合并,得到一个根据 key 排序的文件。
    2. 读取文件,解析数据,然后调用 reduce 函数,得到输出,写入结果文件。

MapReduce 的优点是理解起来简单,实现起来也不难。但是由于 MapReduce 的编程模型过于简单,导致表达能力限制太大,单个 MapReduce 任务并不能完成大量实际上的业务需求。一些比较复杂的系统可能需要 50 ~ 100 个 MapReduce 任务进行组合,这会产生很多中间数据需要写入到分布式文件系统,严重影响执行性能和效率。同时,太多的 MapReduce 任务组合提高了系统的维护难度。

关于 MapReduce 的更多细节,建议阅读论文。

流处理

说到流处理,自然不得不提 Apache Spark 和 Apache Flink(其实我也是在网上道听途说,这两个系统我都不怎么了解……)。

Spark 在 2009 年左右诞生于加州大学伯克利分校的著名 AMPLab。最开始的 Spark 其实是个批处理系统,其能成名的原因是它能够经常在内存执行大量的计算工作,直到作业的最后一步才写入磁盘,性能上比 MapReduce 要好不少。后来,Spark Streaming 的出现,Spark 才开始有了能支持流处理的能力。不过,Spark Streaming 是通过 micro-batch(多个记录/事件) 来模拟 stream 的。从 Spark 最近的版本更新看,Spark Streaming 应该是要被新搞出来的 Structured Streaming 代替了。

和 Spark 不同,Flink 处理流的时候是 per-event 的(一个记录/事件)。打个不太严谨的比方,洗头冲水的时候有两种方式:

  1. 拿一个杯子在水龙头接水,再冲到头上 => 这是 Spark 流处理的模式。
  2. 直接再水龙头下面冲水 => 这是 Flink 流处理的模式。

小结

最后,推荐一篇论文:Google 在 VLDB2015 发表的:The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data Processing。这篇论文提供了一种统一批处理和流处理的 dataflow 模型。

coredump

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 海量用户通信业务平台的设计和数据处理实践【大数据100分】

    大数据文摘
  • 大数据技术之_18_大数据离线平台_01_项目开发流程+大数据常用应用/分析平台/业务处理方式+数据分析平台的数据来源+数据处理的流程+项目集群的规模+需求分析+技术架构/选型

      明确项目到底需要做什么,以及最终做成什么样子,需求分析不明确,项目周期就不明朗,项目完成度无法把控,技术分控无法实现,而且也无法了解项目发展的主体方向。其中...

    黑泽君
  • 大数据处理的一些总结和应用(有关舆情监控)

        说到大数据处理可能大家都不会陌生,这是近年来非常火热的话题,各行各业都想借助大数据为自己助力,有了这个工具,就好像在飞机上看农田一般清晰,一目了然,也也...

    流川疯
  • 使用一个特别设计的损失来处理类别不均衡的数据集

    本文是谷歌对CVPR ' 19上发表的一篇文章的综述,文章的标题是Class-Balanced Loss Based on Effective Number o...

    AI算法与图像处理
  • 使用一个特别设计的损失来处理类别不均衡的数据集

    本文是谷歌对CVPR ' 19上发表的一篇文章的综述,文章的标题是Class-Balanced Loss Based on Effective Number o...

    石晓文
  • 40亿条/秒!Flink流批一体在阿里双11首次落地的背后

    阿里妹导读:今年的双11,实时计算处理的流量洪峰创纪录地达到了每秒40亿条的记录,数据体量也达到了惊人的每秒7TB,基于Flink的流批一体数据应用开始在阿里巴...

    用户2908108
  • 【案例】农业银行大数据平台项目——海量数据复杂运算处理

    数据猿导读 随着数据量的不断增大、接入的系统越来越多,系统加工效率逐步降低,满足内部数据分析和监管机构的监管数据不断增加的需求,农业银行在2013年开始建设完全...

    数据猿
  • 卷积神经网络

    注意:本教程面向TensorFlow 的高级用户,并承担机器学习方面的专业知识和经验。 概观 CIFAR-10分类是机器学习中常见的基准问题。问题是将R...

    片刻
  • 【原】Learning Spark (Python版) 学习笔记(四)----Spark Sreaming与MLlib机器学习

    本来这篇是准备5.15更的,但是上周一直在忙签证和工作的事,没时间就推迟了,现在终于有时间来写写Learning Spark最后一部分内容了。   第10-1...

    Charlotte77
  • 资深码农教你写详细设计(附示例模板)

    公司的文档一般有统一的规范格式,文档的开头,一般要包含公司信息、项目名称、业务名称、版本号等。

    甲蛙全栈
  • 业界 | 微软推出深度学习加速平台「Project Brainwave」:FPGA驱动实时人工智能

    选自微软博客 机器之心编译 参与:路雪、黄小天、蒋思源 近日在 Hot Chips 2017 上,微软团队推出了一个新的深度学习加速平台,其代号为脑波计划(Pr...

    机器之心
  • 都在追捧的新一代大数据引擎Flink到底有多牛?

    提起大数据处理引擎,很多人会想到Hadoop或Spark,而在2019年,如果你身处大数据行业却没听说过Flink,那你很可能OUT了!Flink是大数据界冉冉...

    PP鲁
  • [资源分享]计算机科学速成课

    推荐 程序员的你一定要看,不是程序员的也可以看看,我已经安利刚中考完的我妹妹看了(培养程序媛...)

    爬虫
  • Note_Spark_Day14:Structured Streaming(以结构化方式处理流式数据,底层分析引擎SparkSQL引擎)

    连续处理(Continuous Processing)是“真正”的流处理,通过运行一个long-running的operator用来处理数据。

    ChinaManor
  • 宜信数据中台全揭秘(一)数据中台整体介绍|分享实录

    传统数仓定制化报表,排期周期长,响应需求慢,重复开发工作比较多。T+1的数据失效也满足不了现在互联网业务场景下对数据实时处理能力的需求。对中台平台自主化开发,可...

    宜信技术学院
  • 宜信数据中台全揭秘(一)数据中台整体介绍|分享实录

    传统数仓定制化报表,排期周期长,响应需求慢,重复开发工作比较多。T+1的数据失效也满足不了现在互联网业务场景下对数据实时处理能力的需求。对中台平台自主化开发,可...

    宜信技术学院
  • 【Spark Streaming】Spark Day10:Spark Streaming 学习笔记

    首先,学习SparkStreaming流式计算模块,以批处理思想处理流式数据,进行实时分析。

    ChinaManor
  • 数据仓库之Hive快速入门 - 离线&实时数仓架构

    了解了Hive中的SQL基本操作之后,我们来看看Hive是如何将SQL转换为MapReduce任务的,整个转换过程分为六个阶段:

    端碗吹水
  • 基于流计算 Oceanus 和 Elasticsearch 构建日志分析系统

    实时即未来,最近在腾讯云流计算 Oceanus(Flink)进行实时计算服务,以下为MySQL 到 Flink 进行处理分析,再存储到ES的实践。分享给大家~

    吴云涛

扫码关注云+社区

领取腾讯云代金券