开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:深入 rdd_定义_出现的背景】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/689/detail/11961
深入 rdd_定义_出现的背景
内容介绍:
一、初步介绍过程
二、rdd 为什么会出现?
一、初步介绍过程
对于 rdd 的定义,需要做一些事情,首先要了解 rdd 为什么会出现?其次要了解 rdd 为了解决原来的问题,有什么样的特点?最终对它整个的概念做定义,下一个结论。
也即是:第一个步要去了解一下在 rdd 之前的计算框架存在的问题。Rdd 为什么会出现会出现?其次要对 rdd 它的特点做一个详细的说明。Rdd 特点这一章节特别的重要,因为许多概念等清楚了之后,后面的内容才更便于去理解。最终要去严格的定义什么叫做弹性,什么叫做分布式,什么叫做数据集,即什么叫做弹性分布式数据集?
二、rdd 为什么会出现?
1.MapReduce 的问题
要了解 rdd 为什么会出现,就应该先去了解在 rdd 之前应用较广泛的 MapReduce,显然 MapReduce 是不够好的,好那么原因是什么?
是因为 MapReduce 只能通过磁盘来进行中间数据的共享,如下图的整个过程,要通过 MapReduce 做一个比较复杂的一个数据处理,那可能一个 MapReduce 没有办法完成,可能需要两个,这时第一个 MapReduce 先去 hdfs 当中读取文件,即 read 操作,它经过 MapReduce 的计算,再经过 MapReduce 归约,最终生成了一个运算结果,这个运算结果不能直接得出,还要再放到hdfs当中,那么这个时候 job1还要再从 hdfs 当中去读数据,读出来以后。
再经过上述重复的操作再放入 hdfs 中,假如后面还有许多数据的话,那么每一次中间都需要经过 hdfs 来数据共享,过程很繁琐,这是 MapReduce 的问题。简单来说,在数据共享的过程中,在 hdfs 中分为俩个步骤,一是读,二是写。
在跟 hdfs 之间,用 io,hdfs 内部也有 io,因此效率会变低。
2. rdd 如何解决 MapReduce 存在的问题?
Rdd 的数据最终还是要存在 hdfs 上,那么 rdd 可以把这些数据从 hdfs 当中读出来,然后进入到整个 spark 的环节,这个环节当中就不再去把数据特定的写到这个硬存储介质,写到磁盘当中,假如说现在是一个 rdd1计算完以后,那rdd2
去计算,再计算完 rdd2以后给 rdd3计算,那么整个计算过程是最终先去计算 rdd3,而 rdd3等于 rdd2,即rdd3=rdd2.func10。Rdd2又与 rdd1有关系,即 rdd2=rdd1.func10.这是大致的的过程。它就不需要再复杂的往磁盘里存数据,而是像管道一样在 rdd1、rdd2、rdd3之间进行交换。
即:rdd3=rdd1.func2.func1。在 rdd3和 rdd2之间没有存储数据的这个过程。
所以减少了大量的 io,所以 rdd 是比较适合做迭代型的计算和交互型的计算,它中间的没有什么,这个一定要去混的这样的一些理由,所以他会减少 io,那比较适合链条比较长的这种计算。
3. 代码
下面滴滴的论文当中去收集的收录的一段代码,这段代码实现的是一个机器学习当中常见的线性回归,这个线性回归的过程和内容不需要过多的去关注,只需要看下图部分中 for 循环,这个 for 循环执行了多少次?会发现大概有一万次,这1万次执行每一个都要通过 mapreduce,都进行计算。假如说有1万个 job 要在里面,要使用也就是去MapReduce,这样的话里面的会变得很多。所以这也是使用 MapReduce 的弊端。
//线性回归
val points = sc.textFile(...)
.map(...)
.persist(...)
valw= randomValue
for (i <-1 to 10000) [
valgradient=points.map p =>p.x *(1/(1+ exp(-p.y * (w dot p.x))) - 1) *p.y) reduce +
W-= gradient
在这个例子中,进行了大致10000次迭代,如果在 MapReduce 中实现,可能需要运行很多 Job,每个 Job 之间都要通过 HDFS 享结果,熟快熟慢一窥便知。
