冠县网站建设公司,企业网站分类举例,登录网站显示系统维护怎么做,小企业官方网站制作目录前言#xff1a;1、Spark概述1.1、什么是Spark#xff08;官网#xff1a;http://spark.apache.org#xff09;1.2、为什么要学Spark1.3、Spark特点 2、RDD概述2.1、什么是RDD2.2、RDD的属性2.3、创建RDD的两种方式2.4、RDD编程API2.5、RDD的依赖关系2.6、RDD的缓存2.7…目录前言1、Spark概述1.1、什么是Spark官网http://spark.apache.org1.2、为什么要学Spark1.3、Spark特点 2、RDD概述2.1、什么是RDD2.2、RDD的属性2.3、创建RDD的两种方式2.4、RDD编程API2.5、RDD的依赖关系2.6、RDD的缓存2.7、DAG的生成 总结 目录
前言
本篇文章只是简单介绍下Spark然后对Spark的RDD在做一个全面的介绍。由于博主知识有限这里只是做一个简单的介绍。若有些地方有问题请大家及时指出。后续随着深入的学习会再进一步总结自己的学习成果。
1、Spark概述
1.1、什么是Spark官网http://spark.apache.org Spark是一种快速、通用、可扩展的大数据分析引擎2009年诞生于加州大学伯克利分校AMPLab2010年开源2013年6月成为Apache孵化项目2014年2月成为Apache顶级项目。目前Spark生态系统已经发展成为一个包含多个子项目的集合其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目Spark是基于内存计算的大数据并行计算框架。Spark基于内存计算提高了在大数据环境下数据处理的实时性同时保证了高容错性和高可伸缩性允许用户将Spark部署在大量廉价硬件之上形成集群。Spark得到了众多大数据公司的支持这些公司包括Hortonworks、IBM、Intel、Cloudera、MapR、Pivotal、百度、阿里、腾讯、京东、携程、优酷土豆。当前百度的Spark已应用于凤巢、大搜索、直达号、百度大数据等业务阿里利用GraphX构建了大规模的图计算和图挖掘系统实现了很多生产系统的推荐算法腾讯Spark集群达到8000台的规模是当前已知的世界上最大的Spark集群。
1.2、为什么要学Spark
中间结果输出基于MapReduce的计算引擎通常会将中间结果输出到磁盘上进行存储和容错。出于任务管道承接的考虑当一些查询翻译到MapReduce任务时往往会产生多个Stage而这些串联的Stage又依赖于底层文件系统如HDFS来存储每一个Stage的输出结果 Spark是MapReduce的替代方案而且兼容HDFS、Hive可融入Hadoop的生态系统以弥补MapReduce的不足。
1.3、Spark特点
1.3.1、快 与Hadoop的MapReduce相比Spark基于内存的运算要快100倍以上基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎可以通过基于内存来高效处理数据流。 1.3.2、易用 Spark支持Java、Python和Scala的API还支持超过80种高级算法使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的shell可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法。 1.3.3、通用 Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询Spark SQL、实时流处理Spark Streaming、机器学习Spark MLlib和图计算GraphX。这些不同类型的处理都可以在同一个应用中无缝使用。Spark统一的解决方案非常具有吸引力毕竟任何公司都想用统一的平台去处理遇到的问题减少开发和维护的人力成本和部署平台的物力成本。 1.3.4、兼容性 Spark可以非常方便地与其他的开源产品进行融合。比如Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器并且可以处理所有Hadoop支持的数据包括HDFS、HBase和Cassandra等。这对于已经部署Hadoop集群的用户特别重要因为不需要做任何数据迁移就可以使用Spark的强大处理能力。Spark也可以不依赖于第三方的资源管理和调度器它实现了Standalone作为其内置的资源管理和调度框架这样进一步降低了Spark的使用门槛使得所有人都可以非常容易地部署和使用Spark。此外Spark还提供了在EC2上部署Standalone的Spark集群的工具。
2、RDD概述
2.1、什么是RDD
RDDResilient Distributed Dataset叫做分布式数据集是Spark中最基本的数据抽象它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中后续的查询能够重用工作集这极大地提升了查询速度。
2.2、RDD的属性 一组分片Partition即数据集的基本组成单位。对于RDD来说每个分片都会被一个计算任务处理并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数如果没有指定那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。一个计算每个分区的函数。Spark中RDD的计算是以分片为单位的每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合不需要保存每次计算的结果。RDD之间的依赖关系。*RDD的每次转换都会生成一个新的RDD所以RDD之间就会形成类似于流水线一样的前后依赖关系。在部分分区数据丢失时Spark可以通过这个依赖关系重新计算丢失的分区数据而不是对RDD的所有分区进行重新计算。*一个Partitioner即RDD的分片函数。当前Spark中实现了两种类型的分片函数一个是基于哈希的HashPartitioner另外一个是基于范围的RangePartitioner。只有对于于key-value的RDD才会有Partitioner非key-value的RDD的Parititioner的值是None。Partitioner函数不但决定了RDD本身的分片数量也决定了parent RDD Shuffle输出时的分片数量。一个列表存储存取每个Partition的优先位置preferred location。对于一个HDFS文件来说这个列表保存的就是每个Partition所在的块的位置。按照“移动数据不如移动计算”的理念Spark在进行任务调度的时候会尽可能地将计算任务分配到其所要处理数据块的存储位置。
2.3、创建RDD的两种方式
由一个已经存在的Scala集合创建。 val rdd1 sc.parallelize(Array(1,2,3,4,5,6,7,8))由外部存储系统的数据集创建包括本地的文件系统还有所有Hadoop支持的数据集比如HDFS、Cassandra、HBase等 val rdd2 sc.textFile(“hdfs://node1.itcast.cn:9000/words.txt”)
2.4、RDD编程API
2.4.1、Transformation RDD中的所有转换都是延迟加载的也就是说它们并不会直接计算结果。相反的它们只是记住这些应用到基础数据集例如一个文件上的转换动作。只有当发生一个要求返回结果给Driver的动作时这些转换才会真正运行。这种设计让Spark更加有效率地运行。
常用的Transformation
转换 含义
map(func) 返回一个新的RDD该RDD由每一个输入元素经过func函数转换后组成
filter(func) 返回一个新的RDD该RDD由经过func函数计算后返回值为true的输入元素组成
flatMap(func) 类似于map但是每一个输入元素可以被映射为0或多个输出元素所以func应该返回一个序列而不是单一元素
mapPartitions(func) 类似于map但独立地在RDD的每一个分片上运行因此在类型为T的RDD上运行时func的函数类型必须是Iterator[T] Iterator[U]
mapPartitionsWithIndex(func) 类似于mapPartitions但func带有一个整数参数表示分片的索引值因此在类型为T的RDD上运行时func的函数类型必须是(Int, Interator[T]) Iterator[U]
sample(withReplacement, fraction, seed) 根据fraction指定的比例对数据进行采样可以选择是否使用随机数进行替换seed用于指定随机数生成器种子
union(otherDataset) 对源RDD和参数RDD求并集后返回一个新的RDD
intersection(otherDataset) 对源RDD和参数RDD求交集后返回一个新的RDD
distinct([numTasks])) 对源RDD进行去重后返回一个新的RDD
groupByKey([numTasks]) 在一个(K,V)的RDD上调用返回一个(K, Iterator[V])的RDD
reduceByKey(func, [numTasks]) 在一个(K,V)的RDD上调用返回一个(K,V)的RDD使用指定的reduce函数将相同key的值聚合到一起与groupByKey类似reduce任务的个数可以通过第二个可选的参数来设置
aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
sortByKey([ascending], [numTasks]) 在一个(K,V)的RDD上调用K必须实现Ordered接口返回一个按照key进行排序的(K,V)的RDD
sortBy(func,[ascending], [numTasks]) 与sortByKey类似但是更灵活
join(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD
cogroup(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用返回一个(K,(IterableV,IterableW))类型的RDD
cartesian(otherDataset) 笛卡尔积
pipe(command, [envVars])
coalesce(numPartitions)
repartition(numPartitions)
repartitionAndSortWithinPartitions(partitioner)
2.4.2、 Action
动作 含义
reduce(func) 通过func函数聚集RDD中的所有元素这个功能必须是课交换且可并联的
collect() 在驱动程序中以数组的形式返回数据集的所有元素
count() 返回RDD的元素个数
first() 返回RDD的第一个元素类似于take(1)
take(n) 返回一个由数据集的前n个元素组成的数组
takeSample(withReplacement,num, [seed]) 返回一个数组该数组由从数据集中随机采样的num个元素组成可以选择是否用随机数替换不足的部分seed用于指定随机数生成器种子
takeOrdered(n, [ordering])
saveAsTextFile(path) 将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统对于每个元素Spark将会调用toString方法将它装换为文件中的文本
saveAsSequenceFile(path) 将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下可以使HDFS或者其他Hadoop支持的文件系统。
saveAsObjectFile(path)
countByKey() 针对(K,V)类型的RDD返回一个(K,Int)的map表示每一个key对应的元素个数。
foreach(func) 在数据集的每一个元素上运行函数func进行更新。
2.5、RDD的依赖关系
RDD和它依赖的父RDDs的关系有两种不同的类型即窄依赖narrow dependency和宽依赖wide dependency。 2.5.1、窄依赖 窄依赖指的是每一个父RDD的Partition最多被子RDD的一个Partition使用 总结窄依赖我们形象的比喻为独生子女 2.5.2、宽依赖 宽依赖指的是多个子RDD的Partition会依赖同一个父RDD的Partition 总结宽依赖我们形象的比喻为超生
2.6、RDD的缓存
Spark速度非常快的原因之一就是在不同操作中可以在内存中持久化或缓存个数据集。当持久化某个RDD后每一个节点都将把计算的分片结果保存在内存中并在对此RDD或衍生出的RDD进行的其他动作中重用。这使得后续的动作变得更加迅速。RDD相关的持久化和缓存是Spark最重要的特征之一。可以说缓存是Spark构建迭代式算法和快速交互式查询的关键。 2.6.1、RDD缓存方式 RDD通过persist方法或cache方法可以将前面的计算结果缓存但是并不是这两个方法被调用时立即缓存而是触发后面的action时该RDD将会被缓存在计算节点的内存中并供后面重用。 通过查看源码发现cache最终也是调用了persist方法默认的存储级别都是仅在内存存储一份Spark的存储级别还有好多种存储级别在object StorageLevel中定义的。 缓存有可能丢失或者存储存储于内存的数据由于内存不足而被删除RDD的缓存容错机制保证了即使缓存丢失也能保证计算的正确执行。通过基于RDD的一系列转换丢失的数据会被重算由于RDD的各个Partition是相对独立的因此只需要计算丢失的部分即可并不需要重算全部Partition。
2.7、DAG的生成
DAG(Directed Acyclic Graph)叫做有向无环图原始的RDD通过一系列的转换就就形成了DAG根据RDD之间的依赖关系的不同将DAG划分成不同的Stage对于窄依赖partition的转换处理在Stage中完成计算。对于宽依赖由于有Shuffle的存在只能在parent RDD处理完成后才能开始接下来的计算因此宽依赖是划分Stage的依据。
总结
关于本篇文章你需要了解以下几个知识点 1、Spark是什么、用来干什么的、有什么特点。 2、RDD是什么、常用的RDD有哪些对应的作用是什么、RDD的依赖关系有哪些。 3、DAG是什么。