当前课程知识点:高级大数据系统 > In-memory Processing > Spark > Video
我们说了
in-memory data processing
变得非常重要
由于大家都需要进行迭代化
和这种交互性的这种数据操作
那么在
in-memory data processing
这些系统当中
有一个非常流行的系统叫做spark
那么我们接下来时间
就会去介绍一下spark
它的一些设计的原则
以及它是怎么样来对内存中的
这种数据进行管理
以及它是怎么样去
进行数据的处理的
那么spark是UC Berkeley AMPLab
做的一个项目
那么他们最开始做这个项目的
motivation
我们刚才已经介绍过
由于大量的迭代化
大量的交互性的
这种数据操作的存在
那么他们对这种内存中的数据集
进行了一定的这个抽象
然后使得数据
可以有效地在内存中
进行缓存进行操作
然后免除了很多storage
到storage的这种数据的
这种往返的读写
那么spark
它是一个大数据分析的一个引擎
和map-reduce和类似
那么map-reduce提供了
map和reduce的两个
操作这个抽象
那么spark也提供了一系列
操作的这种抽象
供上层的这个数据分析师
或者是工程师来对数据进行处理
在某一些这个特定的任务底下
我们由于这种数据迭代和
数据交互的存在
spark可以非常有效的
提升数据处理的速度
那么比如说他在一些内存化的
这种数据处理当中
可以几十倍
甚至上百倍的超过map-reduce
在这些数据处理任务上
同时它除了支持spark
除了支持map-reduce
的这种批量的数据处理
他对这种迭代和交互的数据处理
都会有很好的支持
比如说在交互数据处理里面
用户可以像用命令行一样
去操作spark
可以反复的去思考
去尝试
去试错
各种各样数据处理的这个结果
那么我们来看spark
它在设计的时候
它的一个目标是什么样的呢
它的目标是要提供一个
memory的抽象化
能够使用户在处理内存中的数据
处理分布式文件系统中的
数据的时候
有一个新的这种内存的
抽象化的考虑
比如说用户可以指定
数据在内存中以cache的形式存在
那么在后续的处理当中
这种cache的数据
就可以很快的速度
满足后面的分析的需要
同时它还要满足原来map-reduce
已经做到的一些优势
比如说
当系统中出现一些错误的时候
整个系统要能够容错
当数据在系统中
有一些差异化的分布的时候
我们整个计算的过程
能够照顾到数据的locality
能够就近进行数据的处理
而避免数据的搬移
然后能够进行
seamless的scale
能够让整个系统当硬件设备
和网络设备在增加的时候
系统的性能能够无缝的提升
那么这是最原始的一些需求
那么在达到这个需求的探索当中
spark提出了一种新的数据
模型叫做RDD
RDD的全称
是resilient distributed datasets
它的意思就是要在内存中
构建一种可伸缩的数据集
那么它的一个基本的概念
是把我们在处理的数据集
给抽象成一个一个的对象
那么这些对象本身不能发生变化
它可以在内存中缓存
它可以执行一系列类似于map-reduce
这样的操作来生成新的数据集
和新的操作的流程
那我们就来看它的核心的RDD
是怎么样满足spark
来进行数据的操作的
那么在介绍RDD之前
我们给大家看了一下spark
它的一个overview
实际上spark它运行在一个
叫做mesos
的这样一个集群的资源管理之上
那么和hadoop类似
它也能够有效的对底层的计算和
存储资源进行有效的一个利用
同时spark也可以去使用
传统的HDFS的文件系统
就是说你原来的一些任务
如果是由Hadoop生成的数据的话
实际上可以比较容易的迁移到
spark上去进行
那么spark的默认的语言是scala
所以大家在使用spark的时候
如果能够对Java Scala
有一定的了解的话
可能用起来就会非常容易上手
总之今天的spark实际上
由于受到它这个Databricks
这个商业化公司的一个支撑
已经慢慢地形成了自己的
一个生态系统
在这个生态系统当中
以spark为核心
发展出了它的数据库
它的上层的数据仓库
以及底层的一些内存文件系统
以及底层的资源管理的方式
那么这些是大家在后续的阅读当中
可以去进一步了解的
我们来重点介绍spark的
一个核心概念RDD
这种可伸缩的分布式数据集
那我们来看RDD
它的一些基本特征是什么样的
RDD实际上支撑了整个spark的操作
和spark对数据的一个处理
那么它能支持传统的
这种数据处理的流程
比如说map-reduce
比如说SQL的一些流程
同时它还针对一些特殊的
处理进行了优化
比如说图的处理
比如说迭代化的这种Hadoop的处理
它进行了一些这种特别的考虑
那我们来看spark
怎么样通过RDD
来实现这种相对比较丰富的
这种数据处理操作的这样
一个支持的
那么在这个spark里面
实际上它把这个过程
通过了对RDD的一个定义来实现的
首先它对RDD的一个定义是
RDD是一个一个独立的
不可改变的这样一个
内存中的对象
这些对象不能改变
它和传统分布式文件
系统里面的文件
是不太一样
文件我们可以对文件进行增添
我们可以对文件中的某一些字段
进行修改
那么RDD他一旦生成之后
它本身是不能发生变化的
你想对他变化之后不可避免
就会形成一个新的RDD
那么这是RDD的一个特征
这个不可变
那么RDD要想进行操作
怎么办
我们只能对它进行一些叫做
transforming的这样一个操作
对它进行一些形变
那么形变会让一个RDD
变成另外的RDD
或者是会让多个RDD
变成另外的一些RDD
同时我们会对RDD
进行一些控制
比如说我们可以让它输出到文件
我们可以让它cache到内存当中
为了后续的迭代处理
那么这是RDD的一些特征
在RDD里面为了满足我们提到的
这样一些分布式的操作
实际上它的一些操作类似于map和reduce
它也有一些这种分布化的这种过程
比如说它可以进行reduce
类似于map-reduce中的reduce
它可以进行collect
把数据收集到用户的终端
或者用户的这个磁盘
它可以进行统计用count
然后它可以进行save
把数据存到分布式文件系统
或者是用户的这个本地
那么这是RDD
它在考虑的时候将更多复杂的元素
放到了一块
那么我们给一些这个具体的介绍
针对这样的一些概念
那么RDD
一个非常重要的概念
就是它的这个transformation
transform实际上是将RDD
从一种类型变成
另外一种类型的操作
那么在这个操作当中
你可以蕴含比较复杂的
这种数据的变化
或者是利用spark支撑的
一些基础的变化来
组合出比较复杂的
数据操作的过程
那么它的一个基本的描述是这样
它会用一系列的这个原始
RDD作为它的输入
同时它会生成一个新的RDD
然后这个RDD
可以供后续的这个操作
我们来给一些例子
基于单一的RDD
它能做一些什么样的变化
什么样的transform
比如说在这个例子当中
我们需要找着一个RDD的
这个数据集中
它的这种独立的元素
我们来看它的原始的数据是apple
apple和banana
那么它经过形变之后
就变成了apple和banana
实际上这个操作在我们处理出去的
过程中可能会比较常用
我们会把一些
这个重复的元素去掉
让他形成一个集合
这是一个single RDD的一个变化的一个例子
同时我们可以进行sample
那么这也是我们在大数据处理里面
可能会常用的
假设我们想要对数据集的一部分元素
进行查看的时候
我们不需要考察整个数据集
这时候我们可以进行一个
sample的操作
那么sample之后我们发现
它可以把数据集中的某一些元素
给提取出来
而把另外的一些元素给丢掉
在实际的操作当中就可以给定
我要以多大的
这样一个sample的比例
或者是其他的条件来进行sample
那么这是单一RDD操作的一些例子
那么当我们的输入是多个RDD的时候
我们可以进行什么操作呢
这边也给了几个例子
我们输入的RDD有dataset A和
dataset B
那么在A里面我们有apple
等这3个元素
在B里面我们有另外的3个元素
我们来看
当我们的输入是A和B的时候
我们能做哪些操作
我们可以去做并集
大家可以很容易的发现
我们可以把A和B中的元素
给并到一块
但是在spark里面
大家可以注意到这个union
实际上并没有把单一的元素
给过滤出来
而是将banala出现了两次
实际上大家可以再用一次
这个uniq
把这个重复的元素给去掉
这是在并集上面
我们能做的一些事情
那么在交集上
我们可以把两个集合
同时出现的元素给取出来
我们还可以做集合上的减
数据集上的一个减
我们把出现在A中
但是不出现在B中的
元素给提取出来
我们也可以做他的这个cartesian
我们将两个集合进行组合
达到一个新的这种集合的一个目标
比如说我们可以看到底下有括号
把两个集合中的元素
排列到了一块
大家要有一个概念
就是当我们在做这些操作的时候
实际上你的集合可能要
远远比我们举的例子要复杂得多
他们可以是GB或者是TB级的
这样一个数据集
那么不需要你去关心底下的
这种数据的并行
而直接将这些数据组合到一块
我们还可以对另外一种形态的
RDD进行transform
它叫做这个Pair-RDD
所谓Pair-RDD
就是说在这个RDD里面
它有一些分裂的这样一个元素
比如说在我们的这个
myRDD里面
它有一个列叫做name
另一个列叫做age
那我们当进行一个Pair-RDD的
这个transformation的时候
我们会做一件什么事情
我们可以看到Pair-RDD的transformation
有一个例子叫做groupByKey
就是说按照它的key
来进行一个分组
那么在这里面我们把放在前面的这个元素
也就是name作为它的key
当我们对name
进行一个group的时候
我们发现那个sara
实际上它有两个对应的元素
分别是31和40
他们就会组织成一个新的列表
作为新的这个value
加入到新的
形变出来的这个RDD里面
在这种操作里面
实际上对于很多业务上的
要求其实还是能够满足的
在很多业务里面他们的确是需要
对value或者对key
进行一定的这种整理
也很像我们在SQL里面
所做的一些操作
这是大家可以在后续可以去挖掘
哪一些transformation
大家可以在实际的使用中去用到
那么transformation实际上
它只负责将一个RDD
转换成另外一个RDD
这个过程不断的进行
那么你生成了
很多很多的这个RDD
在spark的这个系统当中
那么RDD的操作
还有另外一个叫做action
实际上它就是具体
去实施一个动作
那么当你实施一个
action的时候
其实整个计算就会被触发
那么在transformation的时候
你会发现整个spark系统
可能并没有发生什么动作
但是当你在做action的时候
这些动作就会真的发生了
那么他会做一些什么事情呢
比如说你可以要求他把一些结果
打印在屏幕上
你可以要求把某些RDD的结果
输入到文件分布式文件系统
这些都是action去做的
那在我们这个例子里面
我们可以看到一个
action的这个例子
是叫做count
count实际上是要把一个RDD里面
数据的元素给输出到
用户的这个屏幕
那么我们发现
当我的RDD中有5个元素
而我执行count的时候
那么spark就会真正地去
运行这个任务
这个过程也可能会是在
多台服务器上并发的进行的
那么在我们的这个结果当中
具体就输出了一个数字5
说明它有5条记录
那么其他的一些count的
这个例子还包括countByValue
我们可以按照value把这个
countd的这个RDD中的元素
进行一个统计输出到屏幕
我们可以collect
collect指的是什么呢
我们可以把整个RDD中的
数据集打印到屏幕上
一条一条打印出来
那么这也是需要spark
具体去做一些事了
那么我可以take
take是让我们可以
只打印出RDD中的N条
那么当数据比较大的时候
我们可以用这个方法
来做一个采样
做一个简单的查看
我们可以作reduce
这个reduce和map-reduce
reduce中的reduce类似
他们可以对数据
进行一个整合的操作
根据你提供的一个函数来进行
一个reduce的操作
我们可以对数据中的每一条
进行某一个函数叫做for each
那么这样也可以达到对数据进行
实际的处理的任务
我们可以把它保存成text file
让整个数据写入到
分布式文件系统
或者是写入到某一个位置
总之action和transformation的
区别就在于action
可以将RDD进行一个具体的操作
而transformation实际上
只是告诉了spark
我将要进行什么样的操作
由于你并不希望在transformation
看到这个结果
所以spark
并没有去真正的执行一些任务
只有当它发生了action之后
这些任务才会被回朔的
迭代的执行
这个过程叫做laziness的
这个执行
我们在后面会给大家介绍
-What is big data and what is big data system?
--Video
-Problems in big data systems?
--Video
-Overview of the course
--Video
-Principles of big data system design
--Video
-Manipulating Data on Linux
--Video
--Video
--Video
-Basics of Linux Data Processing--Manipulating Data
-Running Commands on a Single Machine
--Video
-Running Commands on a Single Machine--作业
-Using a Linux Cluster
--Video
-Using a Linux Cluster--作业
-Storage for Big Data Computing: Distributed file system
--Video
-Storage for Big Data Computing: Distributed file system--作业
-File system and GFS
--Video
-File system and GFS--作业
-Understanding HDFS using Legos
--Video
-Understanding HDFS using Legos--作业
-File System Implementation and DFS
--Video
--Video
-File System Implementation and DFS--作业
-What is MapReduce and why
--Video
-What is MapReduce and why
-Learn MapReduce by playing with cards
--Video
-Processing pattern
--Video
-Processing pattern--作业
-Hadoop
--Video
-Hadoop--作业
-Algorithms in MapReduce
--Video
-Algorithms in MapReduce--作业
-Tutorial
--Video
-Background
--Video
-Background--作业
-Spark
--Video
-Spark--作业
-Use Spark for data mining
--Video
-Use Spark for data mining--作业
-Spark data processing
--Video
-Spark data processing--作业
-Experiment in Spark
--Video
-Experiment in Spark--作业
-Introduction to streaming data processing
--Video
-Introduction to streaming data processing--作业
-Storm
--Video
--Video
--Video
-Storm--作业
-Spark streaming
--Video
--Video
-Spark streaming--作业
-NoSQL introduction
--Video
-NoSQL introduction--作业
-Common Advantages
--Video
-Common Advantages--作业
-Bigtable
--Video
-Bigtable--作业
-Master Startup
--Video
-Master Startup--作业
-HBase
--Video
-HBase--作业
-What is GraphDB and Graph data processing
--Video
-What is GraphDB and Graph data processing--作业
-Graph systems
--Video
-Graph systems
-Example of a GraphDB
--Video
-Example of a GraphDB--作业
-Mahout
--Video
-Mahout--作业
-Case Study: Recommendation
--Video
-Case Study: Recommendatio作业
-Recommendation in Mahout
--Video
-Recommendation in Mahout--作业