《从0开始学大数据》之spark的编程模型(代码片段)

我叫CJJ 我叫CJJ     2023-01-27     741

关键词:

Hadoop MapReduce 虽然已经可以满足大数据的应用场景。但人们在 Spark 出现之后,才开始对 MapReduce 不满。原来大数据计算速度可以快这么多,编程也可以更简单。而且 Spark 支持 Yarn 和 HDFS,公司迁移到 Spark 上的成本很小,于是很快,越来越多的公司用 Spark 代替 MapReduce。

Spark编程模型

Spark 和 MapReduce 相比,有更快的执行速度。下图是 Spark 和 MapReduce 进行逻辑回归机器学习的性能比较,Spark 比 MapReduce 快 100 多倍。

除了速度更快,Spark 和 MapReduce 相比,还有更简单易用的编程模型。使用 Scala 语言在 Spark 上编写 WordCount 程序,主要代码只需要三行。

val textFile = sc.textFile("hdfs://...")
val counts = textFile.flatMap(line => line.split(" "))
                 .map(word => (word, 1))
                 .reduceByKey(_ + _)
counts.saveAsTextFile("hdfs://...")

第 1 行代码:根据 HDFS 路径生成一个输入数据 RDD。
第 2 行代码:在输入数据 RDD 上执行 3 个操作,得到一个新的 RDD。将输入数据的每一行文本用空格拆分成单词。将每个单词进行转换,word => (word, 1),生成 的结构。相同的 Key 进行统计,统计方式是对 Value 求和,(_ + _)。
第 3 行代码:将这个 RDD 保存到 HDFS。

RDD

RDD 是 Spark 的核心概念,是弹性数据集(Resilient Distributed Datasets)的缩写。RDD 既是 Spark 面向开发者的编程模型,又是 Spark 自身架构的核心元素。

我们先来看看作为 Spark 编程模型的 RDD。我们知道,大数据计算就是在大规模的数据集上进行一系列的数据计算处理。MapReduce 针对输入数据,将计算过程分为两个阶段,一个 Map 阶段,一个 Reduce 阶段,可以理解成是面向过程的大数据计算。我们在用 MapReduce 编程的时候,思考的是,如何将计算逻辑用 Map 和 Reduce 两个阶段实现,map 和 reduce 函数的输入和输出是什么,这也是我们在学习 MapReduce 编程的时候一再强调的。

而 Spark 则直接针对数据进行编程,将大规模数据集合抽象成一个 RDD 对象,然后在这个 RDD 上进行各种计算处理,得到一个新的 RDD,继续计算处理,直到得到最后的结果数据。所以 Spark 可以理解成是面向对象的大数据计算。我们在进行 Spark 编程的时候,思考的是一个 RDD 对象需要经过什么样的操作,转换成另一个 RDD 对象,思考的重心和落脚点都在 RDD 上。

惰性计算

RDD 上定义的函数分两种,一种是转换(transformation)函数,这种函数的返回值还是 RDD;另一种是执行(action)函数,这种函数不再返回 RDD。

RDD 定义了很多转换操作函数,比如有计算 map(func)、过滤 filter(func)、合并数据集 union(otherDataset)、根据 Key 聚合 reduceByKey(func, [numPartitions])、连接数据集 join(otherDataset, [numPartitions])、分组 groupByKey([numPartitions]) 等十几个函数。

我们再来看看作为 Spark 架构核心元素的 RDD。跟 MapReduce 一样,Spark 也是对大数据进行分片计算,Spark 分布式计算的数据分片、任务调度都是以 RDD 为单位展开的,每个 RDD 分片都会分配到一个执行进程去处理。

RDD 上的转换操作又分成两种,一种转换操作产生的 RDD 不会出现新的分片,比如 map、filter 等,也就是说一个 RDD 数据分片,经过 map 或者 filter 转换操作后,结果还在当前分片。就像你用 map 函数对每个数据加 1,得到的还是这样一组数据,只是值不同。实际上,Spark 并不是按照代码写的操作顺序去生成 RDD,比如rdd2 = rdd1.map(func)这样的代码并不会在物理上生成一个新的 RDD。物理上,Spark 只有在产生新的 RDD 分片时候,才会真的生成一个 RDD,Spark 的这种特性也被称作惰性计算

另一种转换操作产生的 RDD 则会产生新的分片,比如reduceByKey,来自不同分片的相同 Key 必须聚合在一起进行操作,这样就会产生新的 RDD 分片。

Spark生态体系

Spark 也有自己的生态体系,以 Spark 为基础,有支持 SQL 语句的 Spark SQL,有支持流计算的 Spark Streaming,有支持机器学习的 MLlib,还有支持图计算的 GraphX。利用这些产品,Spark 技术栈支撑起大数据分析、大数据机器学习等各种大数据应用场景。

分享

这里有一条关于问题的定律分享给你:我们常常意识不到问题的存在,直到有人解决了这些问题。

当你去询问人们有什么问题需要解决,有什么需求需要被满足的时候,他们往往自己也不知道自己想要什么,常常言不由衷。但是如果你真正解决了他们的问题,他们就会恍然大悟:啊,这才是我真正想要的,以前那些统统都是“垃圾”,我早就想要这样的东西(功能)了。

所以顶尖的产品大师(问题解决专家),并不会拿着个小本本四处去做需求调研,问人们想要什么。而是在旁边默默观察人们是如何使用产品(解决问题)的,然后思考更好的产品体验(解决问题的办法)是什么。最后当他拿出新的产品设计(解决方案)的时候,人们就会视他为知己:你最懂我的需求(我最懂你的设计)。

思考题

你在工作、生活中通过提问发现问题背后的本质、现象背后的规律的例子有哪些?或者你观察到同事、朋友这样的例子有哪些?

来自极客时间精选留言

大神1

惭愧,我遇到的产品经理或者需求人员,基本上分为两类。一类经常说,这是客户的要求必须马上改,用客户来压制研发。一类比较以自我为中心,把自己的观点等同于用户的观点。常常想当然,结果用户一看不是我想要的。结果就是开发人员一次次的从坑里刚爬上来,又被产品一脚踹下去。有几次我真的无法克制,有一种想套麻袋然后一顿打的冲动。🤔非常赞同老师的观点,不管解决技术问题,还是设计产品都需要深刻的洞察力。想起前面您说的抽象是事物本质的洞察,遇到问题先猫在后面(虽然这种方式比较猥琐),冷静思考,暗中观察,从别人的方案或者错误中总结发现规律,然后顺势而为。

大神2

我们常常意识不到问题的存在,直到有人解决了这些问题。非常喜欢这句话。如同:千里马常在,伯乐难寻一个道理,我们往往缺少发现问题的独到眼光。

该笔记摘录自极客时间课程
《从0开始学大数据》

《从0开始学大数据》的启示

《从0开始学大数据》学习后感方法论与哲学学习的目的以及形成思维体系抽象能力,为什么是A而不是B?从MR-Spark看产品思维模式思维大数据发展历史分布式计算的核心思想——移动计算而非移动数据大数据系统与大型网... 查看详情

从0开始学大数据-java基础语法

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节了解Java的发展史和基本操作... 查看详情

从0开始学大数据-java基础开篇

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。一、序言:2017年,这一年人才市场... 查看详情

《从0开始学大数据》的启示

《从0开始学大数据》学习后感方法论与哲学学习的目的以及形成思维体系抽象能力,为什么是A而不是B?从MR-Spark看产品思维模式思维大数据发展历史分布式计算的核心思想——移动计算而非移动数据大数据系统与大型网... 查看详情

从0开始学大数据-java运算符

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节了解Java基础语法,本节我们... 查看详情

《从0开始学大数据》之hdfs是如何实现大数据高速可靠的存储和访问

Hadoop分布式文件系统HDFS的设计目标是管理数以千计的服务器、数以万计的磁盘,将这么大规模的服务器计算资源当作一个单一的存储系统进行管理,对应用程序提供数以PB计的存储容量,让应用程序像使用普通文件系... 查看详情

从0开始学大数据-java基础-三元运算符/键盘录入

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节了解Java运算符,其中三元运... 查看详情

spark快速入门之rdd编程模型(代码片段)

RDD(ResilientDistributedDataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个可分区,不可变,里面的元素可并行计算的结合。RDD具有自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显示地将工作... 查看详情

从零开始学大数据-java基础-switch语句

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节学习了流程控制语句,本节... 查看详情

从零开始学大数据-java基础-流程控制语句

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop、Spark、Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习。上一节学习了三元运算符/键盘录入... 查看详情

spark编程模型(中)

 先在IDEA新建一个maven项目我这里用的是jdk1.8,选择相应的骨架这里选择本地在window下安装的maven  新的项目创建成功  我的开始pom.xml文件配置<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XM 查看详情

spark之rdd编程(代码片段)

  Spark对数据的核心抽象——弹性分布式数据集(ResilientDistributedDataset),简称RDD。RDD其实就是分布式的元素集合。在Spark中,对数据的所有操作不外乎创建RDD、转化已有RDD以及调用RDD操作进行求值。而在这背后,Spark会... 查看详情

并发编程之内存模型(代码片段)

...存存原理如下图:  当有了多级缓存后,CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存,三级缓存没有就去主内存中查找。   查看详情

spark编程模型(中)

...是惰性求值的。这意味着在被调用行动操作之前Spark不会开始计算●读取数据到RDD的操作也是惰性的●惰性求值的好处:Spark使用惰性求值可以把一些操作合并到一起来减少计算数据的步骤。在类似HadoopMapReduce的系统中,开发者... 查看详情

spark基础编程学习01(代码片段)

文章目录Spark介绍启动工作(单机伪分布式)数据以学生成绩数据创建RDD从内存中已有数据创建RDDparallelizemakeRDD从外部存储创建RDD从HDFS文件创建RDD从Linux本地文件创建RDD任务实现查询学生成绩表中的前5名使用map转换数据... 查看详情

语法-指针(代码片段)

...便于访问,给每个字节单元有一个唯一的编号,编号从0开始,第一字节单元编号为0,以后各单元按顺序连续编号,这些单元的编号叫做地址。1.数据类型有字节的差别,假设从0开始编号(一般不会从0开始编号的)。比如int4个... 查看详情

从0开始的python学习014面向对象编程(代码片段)

 简介到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。类和对象是面向对象编... 查看详情

想学大数据?一篇长文带你走进大数据|spark的基础知识与操作(代码片段)

目录1.Spark概述1.1背景1.2特点1.3使用趋势2.Spark生态系统2.1Spark与Hadoop的对比。2.2Job2.3容错率2.4通用性2.5实际应用2.6Spark生态系统组件的应用场景2.7Spark组件2.7.1SparkCore2.7.2SparkSQL2.7.3SparkStreaming2.7.4MLlib2.7.5Graphx2.7.6ClusterManagers3 查看详情