Spark系统的概述
mapredcue
是一个简单通用和自动容错的批处理计算模型
劣势:
交互式和流式计算
使用Storm,Impala结合hadoop的不足:
•重复工作
•组合问题
•使用范围的局限性
•资源分配
•管理问题
为什么有了MapReduce还需要Spark?
因为MapReduce中缺乏一种特性,即在并行计算的各个阶段进行有效的数据共享,这就是RDD的本质。
Mapreduce是将计算构建成为一个有向无环图的任务集,只允许他们有效的重新计算部分DAG,在单独的计算之间,只有复制文件,没有提供其他的存储对象,RDD可以适应当前大部分的数据并行算法和编程模型。
RDD表达能力
模型中,RDD能够取得和专有系统同样的性能,还能提供包括容错处理和滞后节点处理等这些转悠系统缺乏的特性
模型:
•迭代算法;适用于图处理和机器学习
•关系型查询:实现许多通用的数据库引擎特性
•MapReduce批处理:RDD提供的接口是MapReduce的超集
•流式处理:D-Stream可以将流式计算当作一系列的短小而确定的批处理操作,解决了目前流式系统只能提供有限的容错处理,销毁非常大的拷贝代价和非常长的容错时间。
Spark子系统
大数据的场景划分如下;
•复杂的批量数据处理,通常时间跨度是数十分制到数小时
•基于历史数据的交互式查询,通常时间跨度为数十秒到数分钟
•基于实时数据流的数据处理,通常时间跨度为数百毫秒到数秒
•spark core:基于RDD提供丰富的操作接口,利用DAG进行统一的任务规划
•Shark/Spark SQL;兼容Hive的接口HQL,提供比Hive高10-100倍的查询速度分布式SQL引擎
•Spark Streaming:将流式计算分解成一系列的短小的批处理作业
–利用Spark的轻量级和低延迟的调度框架
–数据源:
•kafka,flume,twitter,TCP sockets
•GraphX:基于saprk的图计算框架,兼容Pregel和GraphLab接口,增强了图构建以及图转换功能
•MLlib:Spark Core适合迭代式运算,目前常用:分类,聚类,推荐等。
Spark生态系统的目标就是将批处理和交互式处理,流式处理融合一起,最终特性如下;
•saprk兼容hadoop(HDFS和YARN)
•spark生态学习成本低
•saprk 目前有强大的社区支持
•saprk性能优异
–在多任务计算以及迭代计算中能够大量减少磁盘I/O的时间,针对每个任务启动的式线程,不是进程
Spark RDD及编程接口
开发者可以利用Spark接口非常容易的编写出复杂的数据处理流水线
Demo
java实现;
推荐scala实现:
•为什么需要先建立上下文?
–程序需要向集群申请资源以及构建相应的运行环境
–创建saprk Context对象需传入四个变量
•集群地址(saprk://localhost:7077/假设集群在本地启动监听的式7077端口)
•程序标识
•spark的安装路径
•传入spark程序的jar包路径
•通过textfile接口从HDFS文件系统中读入log文件
•传入转换算子,生成一个新的变量
•若是需要多次使用这个算子,可以进行cache,以便后续可以继续使用这个变量,减少重复计算过程
•用count触发算子触发运行,返还给Drive端
Demo出现的概念:
•弹性分布式数据集RDD
•创建操作:spark Context
•转换操作:
•持久化操作:
•触发操作:
RDD
•一个RDD代表一个倍分区的只读数据集
•RDD的生成途径:
–内存集合和外部存储系统
–转换操作:其他RDD:map,Fliter,join等等
•RDD接口只支持粗粒度的操作,记录RDD之间的关系,构建RDD的相互的继承关系,有效容错,丢失或操作失败可以重建
•控制操作;
–持久化
•开发者可以指明他们需要重用哪些RDD,选择存储策略
–分区
•可以让RDD根据记录中的键值在集群的机器之间重新分区
•抽象RDD的五个接口
–
•RDD分区
–对于RDD而言分区的多少涉及到并行计算的粒度
–用户可以指定分区,若没有指定,可以使用默认值,利用RDD的成员变量partitions所返回的partition数组的大小查询RDD被划分的分区数
•指定分区数
–
–
•1-100数组分区数为2
–
–
•默认分区数是这个程序所分配到的资源的CPU核的个数
•RDD优先位置
–计算向数据移动,在sparp进行任务调度的时候,尽可能讲任务分配到其它数据块所存储的位置
–通过SparkContext的textFile函数读取一个17G的文件bigfile,生成一个类型为MappedRDD的rdd,然后通过依赖关系找到原始的hadoopRDD,hadoopRDD的partition的个数是254个,对于第一个partition而言,其preferredLocations返回了三个机器地址,以便后续调度的程序根据这个地址更加有效分配任务
•RDD依赖关系
–窄依赖;每一个父RDD的分区最多只被子RDD的一个分区所使用
–宽依赖:多个子RDD分区会依赖于一个父RDD的分区
–明确两个依赖的关系的原因:
•窄依赖可以在集群的一个节点上若流水线一般执行,计算所有父RDD的分区,相反,宽依赖需要取得父RDD的所有分区,上的数据进行计算,类似mapReduce一样的Shuffle操作
•对于窄依赖,节点计算失败后恢复更有效,只需重新计算对应的父RDD的分区,可以在其他节点上并行计算,相反,宽依赖继承关系,一个节点的失败会导致其父RDD的多个分区重新计算,这个代价比较高
–
–
–
–
•利用Spark丰富的RDD接口,可以非常方便的实现PageRarnk算法
•RDD分区计算
–对于每个RDD的计算都是以Partition为单位的,并RDD中的compute函数都是对迭代器复合,不需要保存每次计算的结果
•RDD分区函数
–partiton就是RDD分区函数,目前在Spark中实现了两种类型的分区函数就是;
•Hashpartition(哈希分区)
•RangPatitioner(区域分区)
–都是存在k,v类型的RDD中,对于非k,v类型的partiton的值就是None,
–partition函数决定了RDD本身的分区数量,也可以作为其父RDD Shuffle的输出中,每个分区进行数据切割的依据