赞
踩
分布式计算(Distributed Computing),又称分散式计算,指通过分布式系统进行计算的方式。分布式系统中的每一个运算单元存在于不同的计算机/处理器上,通过调度算法进行信息传递、协作以实现一件大而繁的目标。
简单来说,就是一个任务被拆分成很多个小任务,由多个计算机解决后合并。
1. Mapreduce(map-reduce)
一个基于集群的高性能并行计算平台,提供了一个庞大但设计精良的并行计算软件框架,能够自动对运算任务进行并行化处理,自动划分计算数据和计算任务。
Map表示对一个列表(list)的每个元素做计算,reduce表示对一个列表的每个元素做迭代运算。
首先在Map处理杂乱无章的原始数据(此时每条数据之间没有关系);然后进入Reduce阶段,数据是以key后面跟着若干个value来组织的,这若干个value都在一个key下,因此具有关联性。
Tips: 刚读到这里的时候还不太理解value和key的具体含义,查阅资料后解释如下:
Key:偏移量,我们首先计算的 字符串长度 ,然后按照字符串来进行不断分割;
value:每一行的数据。真正对其进行分割的值。
举个栗子
1,2,3,4
a,b,c,d
1,a,2,b
运算流程:
①.一行便是一个map的输入值,一般情况下map为3,也就是有3个map值。
②.之后,对三行数据进行划分,这里用到了FileInputFormat(看起来很高大上的词语罢了)进行处理。
第一个map传递的value值便是1,2,3,4
③.之后,进一步划分数据,分割字符串后传递给reduce。
④.reduce进行处理,通俗来讲,这一步其实就是进行计数,看有多少个分区,就有多少个reduce
eg:分区1:2个1
分区2:2个2
分区3:1个b ……
因此:reduce工作:数这里面装几个数据
三行数据会调用map方法3次,
第一次key为0,value为“1,2,3,4”
第二次key为9(7个字符+2个换行符)
第三次key为18(7+2+7+2) value“1,a,2,b”
for (IntWritable val : values)
{
sum += val.get();
System.out.println("val.get():" + val.get());
}
2. Spark(RDD模型)
基于MapReduce算法实现的分布式计算,是专为大规模数据处理而设计的快速通用的计算引擎,一般当需要处理的数据量超过的单机负载,或需要花费大量时间时,选择spark集群。
和MapReduce技术相比,Spark有如下优势:
①. 有一个全面、统一的框架用于管理不同性质(文本数据、图表数据等)数据集和数据源的大数据处理需求
②. 官方吹牛中说将Hadoop集群中的应用在内存中的运行速度提升100倍,甚至能够将应用在磁盘上的运行速度提升10倍
先提出一个新的概念:RDD——抽象弹性分布式数据集(Resiliennt Distributed Datasets,RDD),这使得 Spark 的各个组件可以无缝地进行集成,能够在同一个应用程序中完成大数据处理。
官方解释: 它是一种有容错机制的特殊数据集合,可以分布在集群的结点上,以函数式操作集合的方式进行各种并行操作。
人话: 分布式对象集合,本质上是一个只读的分区记录集合,每个RDD可以分为多个数据集片段(分区),不同分区可以保存在集群的不同节点上,从而在集群中不同节点并行计算。
几个属性 :
只读: 不能修改,只能通过转换操作生成新的RDD。
分布式 :可以分布在多个计算机上并行计算。
弹性 :计算过程中内存不够时他会和磁盘进行数据交换。
基于内存 :可以全部或部分缓存在内存中,在多次计算间重用。
RDD是一种更为通用的迭代并行计算框架,用户可以显示控制计算的中间结果,并将其自由用于之后的计算,因为很多个应用场景中,不同计算阶段之间会重复使用中间结果,即一个阶段的输出结果会作为下一个阶段的输入,刚才所讲的Mapreduce最大的缺点就是它的非循环式的数据流模型,使得在迭代计算时要进行大量的磁盘I/O操作。而RDD不需要用户关注底层数据的分布式特性,只需要将具体的应用逻辑表达为一系列转换就可以实现管道化(我理解为一体化操作),避免了中间结果的拥堵,降低开销。
RDD基本操作: 转化操作和行动操作
转化操作 :从一个RDD产生一个新的RDD
行动操作 :进行实际运算,只有当执行行动操作时才会触发计算任务提交,从而执行相应的计算操作。
构建操作
方式:
从内存里直接读取数据
从文件系统(HDFS分布式文件系统/本地文件系统)中读取数据
转换操作
返回到新的RDD进行操作,注意,这里不对RDD内的数据进行计算,并且许多转换操作都是针对各个元素,也就是转换操作只会操作RDD的一个元素
行动操作
执行计算并按指定的方式输出结果,行动操作接受RDD后,输出结果(数值)
架构:
Spark SQL: 提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
Spark Streaming: 对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
MLlib: 一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
GraphX: 控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作
运行流程:
①. 构建Spark Application的运行环境,启动SparkContext(用于连接Spark集群、创建RDD、累加器(accumlator)、广播变量(broadcast variables))
②. SparkContext向资源管理器(可以是Standalone,Mesos,Yarn)申请运行Executor资源(资源调度器),并启动StandaloneExecutorbackend(建立Executor线程池,开始执行Task,并向SparkContext报告,直至Task完成)
③. Executor向SparkContext申请Task
④. SparkContext将应用程序分发给Executor
⑤. SparkContext构建成DAG图( DAG叫做有向无环图,Spark中的RDD通过一系列的转换算子操作和行动算子操作形成了一个DAG,DAG是一种非常重要的图论数据结构),将DAG图分解成Stage、将Taskset发送给Task Scheduler(任务调度器),最后由Task Scheduler将Task发送给Executor运行
⑥. Task在Executor上运行,运行完释放所有资源
学习参考:http://c.biancheng.net/view/3644.html
https://www.cnblogs.com/cxxjohnson/p/8909578.html
写在最后:经过学习后个人感觉,Spark是MapReduce的升级版,还有很多内容没有在本文中提及,之后的学习笔记将会着重对Spark的计算架构着重研究。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。