主流流处理框架比较
大数据学习路线

⼤数据学习路线前⾔数据科学部为想从事⼤数据⽅向学习的⼩伙伴总结了⼀下⼤数据的学习路线,供⼤家学习参考。
由于⼤数据是⼀个基础门槛较⾼就业前景较好的学习⽅向。
所以打算学习⼤数据的⼩伙伴要加油啦!⼤数据学习路线:⾸先我要了解⼤数据处理流程:第⼀步:数据收集第⼆部:数据存储第三步:数据分析第四步:数据应⽤数据收集⼤数据处理的第⼀步是数据的收集。
现在的中⼤型项⽬通常采⽤微服务架构进⾏分布式部署,所以数据的采集需要在多台服务器上进⾏,且采集过程不能影响正常业务的开展。
基于这种需求,就衍⽣了多种⽇志收集⼯具,如 Flume 、Logstash等,它们都能通过简单的配置完成复杂的数据收集和数据聚合。
数据存储收集到数据后,下⼀个问题就是:数据该如何进⾏存储?我们通常熟知的就是把数据存⼊MySQL、Oracle等传统的关系型数据库,这些传统的数据库的特点是能够快速存储结构化的数据,并⽀持随机访问。
但⼤数据的数据结构通常是半结构化(如⽇志数据)、甚⾄是⾮结构化的(如视频、⾳频数据),为了解决海量半结构化和⾮结构化数据的存储,衍⽣了 Hadoop HDFS 、KFS、GFS 等分布式⽂件系统,它们都能够⽀持结构化、半结构和⾮结构化数据的存储,并可以通过增加机器进⾏横向扩展。
分布式⽂件系统完美地解决了海量数据存储的问题,但是⼀个优秀的数据存储系统需要同时考虑数据存储和访问两⽅⾯的问题,⽐如你希望能够对数据进⾏随机访问,这是传统的关系型数据库所擅长的,但却不是分布式⽂件系统所擅长的,那么有没有⼀种存储⽅案能够同时兼具分布式⽂件系统和关系型数据库的优点,基于这种需求,就产⽣了 HBase、MongoDB。
数据分析⼤数据处理最重要的环节就是数据分析,数据分析通常分为两种:批处理和流处理。
批处理:对⼀段时间内海量的离线数据进⾏统⼀的处理,对应的处理框架有 Hadoop MapReduce、Spark、Flink 等;流处理:对运动中的数据进⾏处理,即在接收数据的同时就对其进⾏处理,对应的处理框架有 Storm、Spark Streaming、Flink Streaming 等。
国内市场主流专业的工作流(bpm)软件分析、比较及推荐

国内市场主流专业的工作流(bpm)软件分析、比较及推荐目前国内外的工作流系统层出不穷,行业标准多种多样,虽然工作流主要功能国内比较知名的工作流软件基本上都具备,但功能的侧重点各不相同,增加了企业对工作流或BPM选型难度,本人选用目前国内市场主流专业的工作流软件,从概念、工作流引擎、工作流过程建模工具、流程操作、工作流客户端架构、流程监控、表单设计器以及与应用程序的集成等方面进行分析和比较,帮助企业对工作流或BPM产品的选型。
一、概述:工作流的思想最先起源于西方国家,一开始的目的主要是为了简化工作流程,为繁琐的工作提供依据。
随着需求的不断延伸以及人们对企业信息化思想的不断普及,工作流越来越受到企业内部的使用推广,当然,工作流能满足的需求也在不断的优化。
工作流概念起源于生产组织和办公自动化领域,是针对日常工作中具有固定程序活动而提出的一个概念,目的是通过将工作分解成定义良好的任务或角色,按照一定的规则和过程来执行这些任务并对其进行监控,达到提高工作效率、更好的控制过程、增强对客户的服务、有效管理业务流程等目的。
尽管工作流已经取得了相当的成就,但对工作流的定义还没有能够统一和明确,不同学者从不同角度对工作流做出了不同的定义。
Georgakopoulos给出的工作流定义是:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完成。
IBM Almaden Research Center将工作流定义为:工作流是经营过程的一种计算机化的表示模式,定义了完成整个过程需要的所有参数;这些参数包括对过程中每一个步骤的定义、步骤的执行顺序和条件、步骤由谁负责以及每个活动所需要的应用程序等。
1993年工作流管理联盟(Workflow Management Coalition,WfMC)作为工作流管理的标准化组织而成立,标志着工作流技术逐步走向成熟。
大数据分析中的数据流处理技术介绍(十)

大数据分析中的数据流处理技术介绍随着科技的不断发展,数据量不断增长,大数据分析技术已经成为现代社会中不可或缺的一部分。
大数据分析通过对海量数据的处理和分析,可以为企业、政府等各个领域提供重要的决策支持。
在大数据分析中,数据流处理技术扮演着非常重要的角色,它能够实时地处理数据流,从而使得分析结果更加准确和实时。
本文将从数据流处理技术的基本概念、流处理框架、流处理算法和应用实例等方面对大数据分析中的数据流处理技术进行介绍。
数据流处理技术的基本概念数据流处理是指持续不断地处理数据流,而不是一次性地处理静态数据集。
在大数据分析中,数据流处理技术通过对即时到达的数据流进行实时处理和分析,能够更好地把握数据的动态变化,从而对实时决策提供支持。
数据流处理技术的主要特点包括高吞吐量、低延迟、容错性和可伸缩性等。
数据流处理技术主要应用于网络监控、金融交易分析、智能制造等领域。
流处理框架流处理框架是实现数据流处理技术的重要工具,它能够有效地管理和处理数据流。
目前主流的流处理框架包括Apache Storm、Apache Flink和Apache Kafka Streams等。
其中,Apache Storm是一个开源的分布式实时计算系统,具有高吞吐量、低延迟、可扩展等特点,能够支持复杂的流处理任务。
Apache Flink是另一个流处理框架,它支持事件驱动的流处理,并且提供了丰富的API和库,可以方便地进行实时数据分析。
而Apache Kafka Streams则是一个轻量级的流处理框架,它能够实现高吞吐量和低延迟的流处理,同时还提供了容错性和状态管理等功能。
流处理算法流处理算法是数据流处理技术的核心,它能够对数据流进行实时的处理和分析。
常见的流处理算法包括滑动窗口、聚合操作、过滤操作等。
其中,滑动窗口是一种常见的流处理算法,它能够对数据流进行分段处理,从而实现实时的数据分析。
聚合操作则是将数据流中的数据进行合并和计算,用于生成统计结果和报表。
高效处理流式数据的流式计算框架

高效处理流式数据的流式计算框架流式计算框架是一种能够高效处理流式数据的计算工具,用于实时地处理并分析大规模的数据流。
随着大数据时代的到来,越来越多的数据以流的形式产生,因此流式计算框架变得愈发重要。
流式计算框架的核心目标是能够实时地处理数据,并尽可能地降低计算延迟。
在传统的批处理计算框架中,数据必须等待一定的时间才能被处理,而在流式计算框架中,数据可以立即被处理。
这种实时处理能力为数据分析提供了更加及时的反馈机制,使得决策可以更加快速地做出。
在设计流式计算框架时,有几个关键的考虑因素。
首先是数据的到达速率。
由于流式数据的特性,数据的到达速率往往很快,因此流式计算框架必须具备高吞吐量的能力,能够处理大规模的数据流。
其次是数据的有序性。
在流式计算中,数据的顺序很重要,因为后续的计算可能依赖于前面的数据。
因此,流式计算框架必须能够保证数据的有序性,确保数据按照正确的顺序被处理。
流式计算框架通常由两个重要的组件构成:流式数据收集和流式数据处理。
流式数据收集是指从不同的源收集数据,并将其整合成一个流式数据集。
这需要考虑数据的来源、数据的到达速率以及数据的有序性。
流式数据处理是指对流式数据进行计算和分析,通常采用流水线的方式进行处理。
数据会依次经过多个处理单元,并进行不同的操作,例如过滤、聚合、计算等。
这些处理单元可以并行执行,以提高处理效率。
在实际的流式计算框架中,常见的有Apache Storm、Apache Flink和Apache Kafka等。
其中,Apache Storm是一种分布式实时计算系统,能够以毫秒级的延迟处理大规模的数据流。
它以流的方式处理数据,将数据划分为不同的流组件,并通过消息传递的方式进行通信。
Apache Flink是一种分布式流处理框架,能够以秒级的延迟处理数据流。
它支持流和批处理的模式,并提供了丰富的操作函数和状态管理机制。
Apache Kafka是一种高吞吐量的分布式消息队列,用于处理实时数据流。
概述四种主流的大数据技术(一)

概述四种主流的大数据技术(一)概述四种主流的大数据技术引言:大数据技术在不断进步和创新的过程中,已经成为当今世界中最重要和炙手可热的技术之一。
它可以帮助企业和组织从海量的数据中提取有价值的信息和洞见,从而支持决策和业务发展。
本文将概述四种主流的大数据技术,包括分布式存储系统、分布式处理框架、机器学习算法和数据可视化工具。
一、分布式存储系统:1. Hadoop分布式文件系统(HDFS):介绍HDFS的基本原理和特点。
2. Cassandra分布式数据库:探讨Cassandra的数据模型和可伸缩性。
3. Amazon S3:说明Amazon S3如何实现高性能、高可靠性的文件存储。
4. Google Cloud Storage:介绍Google Cloud Storage的特点和用途。
5. Apache HBase:探讨HBase的数据模型和应用场景。
二、分布式处理框架:1. Apache Spark:介绍Spark的特点和优势。
2. Apache Hadoop MapReduce:探讨MapReduce的原理和应用。
3. Apache Flink:说明Flink如何支持实时流处理和批处理。
4. Apache Storm:介绍Storm的实时分布式计算能力。
5. Apache Beam:探讨Beam的跨多种分布式处理框架的兼容性。
三、机器学习算法:1. 回归算法:介绍线性回归、逻辑回归等常用的回归算法。
2. 分类算法:探讨决策树、支持向量机等常用的分类算法。
3. 聚类算法:说明K-means、DBSCAN等常用的聚类算法。
4. 关联规则挖掘算法:介绍Apriori、FP-growth等挖掘频繁项集的算法。
5. 深度学习算法:探讨神经网络、卷积神经网络等深度学习算法的基本原理。
四、数据可视化工具:1. Tableau:介绍Tableau的交互性和灵活性。
2. Power BI:探讨Power BI的数据分析和可视化能力。
Storm对比Flink

• 如果一个 task manager 节点因为机器损坏而掉线,整个程序就 会直接终止并从 checkpoint 恢复,而不会保持程序运行并从集 群中重新申请一台空白机器进行恢复。(这一点是和spark有区 别,不能完全说是缺点,只是设计上的不同)
JAVA 无
Flink
有状态
窗口支持较为完善,自带一 些窗口聚合方法,并且会自 动管理窗口状态
At Most Once At Least Once Exactly Once
检查点机制:通过分布式一 致性快照机制,对数据流和 状态进行保存,在发生错误 时使系统能够进行回滚。
Scala, Python, Java
项处理的能力 • Flink能很好地与其他组件配合使用。如果配合Hadoop 堆
栈使用,该技术可以很好地融入整个环境,在任何时候都 只占用必要的资源。该技术可轻松地与YARN、HDFS和 Kafka 集成 • 框架提供了更好的容错以及状态机制
Flink不足之处
• Flink相对于Storm来说比较年轻,使用过这个框架和scala的普及 度目前要比Storm低,如果有大量开发人员开发需要考虑到学习 成本。
流计算框架 Flink 与 Storm 对比
Flink 与 Storm 两个框架对比
状态管理 窗口支持
消息投递
容错方式
开发语言 连接器支持较弱
At Most Once At Least Once
ACK机制:对每个消息进行 全链路跟踪,失败或者超时 进行重发。
• 需要程序能够正常完美的运行,Flink需要优化的地方非常多, 不仅需要在代码上,配置上进行调整,有时连数据库,服务器 方面也是需要一起优化的。(Flink对内存的要求还是挺大的, 相关服务有时候不优化可能会导致OOM,从而节点挂掉后导致 整个作业停止)
统一批处理和流式计算框架

统一批处理和流式计算框架全文共四篇示例,供读者参考第一篇示例:统一批处理和流式计算框架是当今大数据处理领域中的两大重要技术。
它们分别用于处理离线和实时数据,帮助企业有效地利用数据资源进行分析和决策。
本文将深入探讨统一批处理和流式计算框架的背景、原理、应用场景以及优势和挑战。
一、背景随着互联网的迅速发展和物联网、智能设备的普及,大数据的产生速度呈指数级增长。
传统的数据处理技术已经无法满足对大规模、多样性、高实时性数据的处理需求。
统一批处理和流式计算框架应运而生,成为解决大数据挑战的重要工具。
二、原理1. 统一批处理框架:典型的批处理框架有Hadoop MapReduce、Apache Spark等。
批处理框架通过将数据划分成多个分区,分布式计算每个分区的数据,最后将结果合并。
这种方式适合处理大规模数据量,但实时性较差。
2. 流式计算框架:流式计算框架如Storm、Flink等,采用持续计算的方式处理实时数据流。
数据通过流式管道传输和处理,允许在数据生成和处理过程中快速响应和做出决策。
流式计算框架适合处理需要实时分析和决策的场景。
三、应用场景1. 统一批处理框架:适用于数据量大、批量处理的场景,如离线数据分析、数据挖掘、批量推荐等。
在电商、金融、广告等行业有广泛应用。
2. 流式计算框架:适用于实时监控、实时推荐、实时风控等需要实时决策的场景。
在智能家居、智能交通、智能制造等领域得到广泛应用。
四、优势和挑战1. 统一批处理和流式计算框架的优势在于能够满足不同业务需求的数据处理和分析需求,帮助企业实现数据驱动决策。
2. 统一批处理和流式计算框架也存在一些挑战,如数据一致性、计算性能、容错处理等方面的问题需要解决。
总结:统一批处理和流式计算框架是大数据处理领域的重要技术,通过结合批处理和实时计算,可以更好地满足企业对数据处理和决策的需求。
我们相信在未来的发展中,统一批处理和流式计算框架将会扮演越来越重要的角色,助力企业实现数据驱动的业务目标。
比较机器学习的两个主流框架:TensorFlow和PyTorch

比较机器学习的两个主流框架:TensorFlow和PyTorchTensorFlow和PyTorch是当前机器学习领域的两个主流框架,两者在实现方式和使用方法上都有所不同,各有优缺点。
本文将比较两个框架的特点,希望能够帮助读者选择适合自己的框架。
一、TensorFlow和PyTorch的概述TensorFlow是由Google公司开发的一个开源的机器学习框架,它源于Google Brain团队在进行机器学习研究时使用的一些工具,后来成为了一个独立的项目。
TensorFlow的主要特点是强大的分布式计算能力,支持GPU加速计算,能够实现高效的模型训练和推理。
TensorFlow拥有广泛的应用领域,包括图像识别、语音识别、自然语言处理等。
PyTorch是facebook推出的一个开源的机器学习框架,它中文名为“热力图”,它源于亚马逊推出的另一个机器学习框架Torch,但在TensorFlow的威压下逐渐式微。
PyTorch的主要特点是具有灵活的设计和易于阅读的代码,它具备多种高级特性,如动态计算图和自动微分等。
PyTorch针对研究人员和实验室研究者开发,并且拥有丰富的社区支持,能够快速解决问题。
二、TensorFlow和PyTorch的特点比较1.编程风格和易用性TensorFlow的API风格是静态的,意味着用户需要预先定义计算图,然后再将数据输入其中进行计算。
TensorFlow需要一定的学习曲线和经验才能熟练使用,但一旦熟悉,其代码结构清晰,易于维护。
PyTorch的API风格是动态的,有些类似于Python的编程风格,意味着用户可以像写Python代码一样执行操作。
相对于TensorFlow 而言,PyTorch更加容易使用和学习,因为它可以让用户专注于解决问题本身,而不是图形和会话。
2.计算图构建方式TensorFlow使用静态图,这意味着在定义模型时,用户需要显式地构建计算图,然后再运行图来执行操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
分布式流处理是对无边界数据集进行连续不断的处理、聚合和分析。
它跟MapReduce一样是一种通用计算,但我们期望延迟在毫秒或者秒级别。
这类系统一般采用有向无环图(DAG)。
DAG是任务链的图形化表示,我们用它来描述流处理作业的拓扑。
如下图,数据从sources流经处理任务链到sinks。
单机可以运行DAG,但本篇文章主要聚焦在多台机器上运行DAG的情况。
关注点当选择不同的流处理系统时,有以下几点需要注意的:•运行时和编程模型:平台框架提供的编程模型决定了许多特色功能,编程模型要足够处理各种应用场景。
这是一个相当重要的点,后续会继续。
•函数式原语:流处理平台应该能提供丰富的功能函数,比如,map或者filter这类易扩展、处理单条信息的函数;处理多条信息的函数aggregation;跨数据流、不易扩展的操作join。
•状态管理:大部分应用都需要保持状态处理的逻辑。
流处理平台应该提供存储、访问和更新状态信息。
•消息传输保障:消息传输保障一般有三种:at most once,at least once和exactly once。
At most once的消息传输机制是每条消息传输零次或者一次,即消息可能会丢失;A t least once意味着每条消息会进行多次传输尝试,至少一次成功,即消息传输可能重复但不会丢失;Exactly once的消息传输机制是每条消息有且只有一次,即消息传输既不会丢失也不会重复。
•容错:流处理框架中的失败会发生在各个层次,比如,网络部分,磁盘崩溃或者节点宕机等。
流处理框架应该具备从所有这种失败中恢复,并从上一个成功的状态(无脏数据)重新消费。
•性能:延迟时间(Latency),吞吐量(Throughput)和扩展性(Scalability)是流处理应用中极其重要的指标。
平台的成熟度和接受度:成熟的流处理框架可以提供潜在的支持,可用的库,甚至开发问答帮助。
选择正确的平台会在这方面提供很大的帮助。
运行时和编程模型运行时和编程模型是一个系统最重要的特质,因为它们定义了表达方式、可能的操作和将来的局限性。
因此,运行时和编程模型决定了系统的能力和适用场景。
实现流处理系统有两种完全不同的方式:一种是称作原生流处理,意味着所有输入的记录一旦到达即会一个接着一个进行处理。
第二种称为微批处理。
把输入的数据按照某种预先定义的时间间隔(典型的是几秒钟)分成短小的批量数据,流经流处理系统。
两种方法都有其先天的优势和不足。
首先以原生流处理开始,原生流处理的优势在于它的表达方式。
数据一旦到达立即处理,这些系统的延迟性远比其它微批处理要好。
除了延迟性外,原生流处理的状态操作也容易实现,后续将详细讲解。
一般原生流处理系统为了达到低延迟和容错性会花费比较大的成本,因为它需要考虑每条记录。
原生流处理的负载均衡也是个问题。
比如,我们处理的数据按key分区,如果分区的某个key是资源密集型,那这个分区很容易成为作业的瓶颈。
接下来看下微批处理。
将流式计算分解成一系列短小的批处理作业,也不可避免的减弱系统的表达力。
像状态管理或者join等操作的实现会变的困难,因为微批处理系统必须操作整个批量数据。
并且,batch interval会连接两个不易连接的事情:基础属性和业务逻辑。
相反地,微批处理系统的容错性和负载均衡实现起来非常简单,因为微批处理系统仅发送每批数据到一个worker节点上,如果一些数据出错那就使用其它副本。
微批处理系统很容易建立在原生流处理系统之上。
编程模型一般分为组合式和声明式。
组合式编程提供基本的构建模块,它们必须紧密结合来创建拓扑。
新的组件经常以接口的方式完成。
相对应地,声明式API操作是定义的高阶函数。
它允许我们用抽象类型和方法来写函数代码,并且系统创建拓扑和优化拓扑。
声明式API经常也提供更多高级的操作(比如,窗口函数或者状态管理)。
后面很快会给出样例代码。
主流流处理系统有一系列各种实现的流处理框架,不能一一列举,这里仅选出主流的流处理解决方案,并且支持Scala API。
因此,我们将详细介绍Apache Storm,Trident,Spark Streaming,Samza和Apache Flink。
前面选择讲述的虽然都是流处理系统,但它们实现的方法包含了各种不同的挑战。
这里暂时不讲商业的系统,比如Google MillWheel或者Amazon Kinesis,也不会涉及很少使用的Intel GearPump或者Apache Apex。
Apache Storm最开始是由Nathan Marz和他的团队于2010年在数据分析公司BackType 开发的,后来BackType公司被Twitter收购,接着Twitter开源Storm并在2014年成为Apache顶级项目。
毋庸置疑,Storm成为大规模流数据处理的先锋,并逐渐成为工业标准。
Storm是原生的流处理系统,提供low-level的API。
Storm使用Thrift来定义topology和支持多语言协议,使得我们可以使用大部分编程语言开发,Scala自然包括在内。
Trident是对Storm的一个更高层次的抽象,Trident最大的特点以batch的形式进行流处理。
Trident简化topology构建过程,增加了窗口操作、聚合操作或者状态管理等高级操作,这些在Storm中并不支持。
相对应于Storm的At most once流传输机制,Trident提供了Exactly once传输机制。
Trident支持Java,Clojure和Scala。
当前Spark是非常受欢迎的批处理框架,包含Spark SQL,MLlib和Spark Streaming。
Spark的运行时是建立在批处理之上,因此后续加入的Spark Streaming也依赖于批处理,实现了微批处理。
接收器把输入数据流分成短小批处理,并以类似Spark作业的方式处理微批处理。
Spark Streaming提供高级声明式API(支持Scala,Java和Python)。
Samza最开始是专为LinkedIn公司开发的流处理解决方案,并和LinkedIn的Kafka一起贡献给社区,现已成为基础设施的关键部分。
Samza的构建严重依赖于基于log的Kafka,两者紧密耦合。
Samza提供组合式API,当然也支持Scala。
最后来介绍Apache Flink。
Flink是个相当早的项目,开始于2008年,但只在最近才得到注意。
Flink是原生的流处理系统,提供high level的API。
Flink也提供API来像Spark一样进行批处理,但两者处理的基础是完全不同的。
Flink把批处理当作流处理中的一种特殊情况。
在Flink中,所有的数据都看作流,是一种很好的抽象,因为这更接近于现实世界。
快速的介绍流处理系统之后,让我们以下面的表格来更好清晰的展示它们之间的不同:Word CountWordcount之于流处理框架学习,就好比hello world之于编程语言学习。
它能很好的展示各流处理框架的不同之处,让我们从Storm开始看看如何实现Wordcount:TopologyBuilder builder = new TopologyBuilder();builder.setSpout("spout", new RandomSentenceSpout(), 5);builder.setBolt("split", new Split(), 8).shuffleGrouping("spout");builder.setBolt("count", new WordCount(), 12).fieldsGrouping("split", new Fields("word")); ...Map<String, Integer> counts = new HashMap<String, Integer>();public void execute(Tuple tuple, BasicOutputCollector collector) {String word = tuple.getString(0);Integer count = counts.containsKey(word) ? counts.get(word) + 1 : 1;counts.put(word, count);collector.emit(new Values(word, count));}首先,定义topology。
第二行代码定义一个spout,作为数据源。
然后是一个处理组件bolt,分割文本为单词。
接着,定义另一个bolt来计算单词数(第四行代码)。
也可以看到魔数5,8和12,这些是并行度,定义集群每个组件执行的独立线程数。
第八行到十五行是实际的WordCount bolt实现。
因为Storm不支持内建的状态管理,所有这里定义了一个局部状态。
按之前描述,Trident是对Storm的一个更高层次的抽象,Trident最大的特点以batch 的形式进行流处理。
除了其它优势,Trident提供了状态管理,这对wordcount实现非常有用。
public static StormTopology buildTopology(LocalDRPC drpc) {FixedBatchSpout spout = ...TridentTopology topology = new TridentTopology();TridentState wordCounts = topology.newStream("spout1", spout).each(new Fields("sentence"),new Split(), new Fields("word")).groupBy(new Fields("word")).persistentAggregate(new MemoryMapState.Factory(),new Count(), new Fields("count"));...}如你所见,上面代码使用higher level操作,比如each(第七行代码)和groupby(第八行代码)。
并且使用Trident管理状态来存储单词数(第九行代码)。
下面是时候祭出提供声明式API的Apache Spark。
记住,相对于前面的例子,这些代码相当简单,几乎没有冗余代码。