rdd

Spark之RDD

送分小仙女□ 提交于 2020-03-25 21:26:40
一:RDD简介 (一)RDD概念 RDD(Resilient Distributed DataSet),弹性分布式数据集, 是Spark中最基本,也是最重要的数据抽象, 它 代表一个不可变、可分区、里面的元素可并行计算的集合 。RDD具有数据流模型的特点:自动容错、位置感知度调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能重用工作集,这极大地提升了查询速度。因为有RDD,所以Spark才支持分布式的计算。RDD由分区组成。 (二)RDD的五个特性 (1)一组分片( Partition ),即数据集的基本组成单位。---RDD会被分片处理,用于并行计算 对于RDD来说,每个分片都会被一个计算任务处理,并决定并行计算的粒度。用户可以在创建RDD时指定RDD的分片个数,如果没有指定,那么就会采用默认值。默认值就是程序所分配到的CPU Core的数目。 (2)一个计算每个分区的函数。---一个对每个split(数据分区)进行计算的函数,也称为RDD的算子 Spark中RDD的计算是以分片为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 (3)RDD之间的依赖关系。(DAG有向无环图调度构造依赖关系) RDD的每次转换都会生成一个新的RDD

Spark2.0-RDD分区原理分析

纵饮孤独 提交于 2020-03-24 09:00:02
3 月,跳不动了?>>> Spark分区原理分析 介绍 分区是指如何把RDD分布在spark集群的各个节点的操作。以及一个RDD能够分多少个分区。 一个分区是大型分布式数据集的逻辑块。 那么思考一下:分区数如何映射到spark的任务数?如何验证?分区和任务如何对应到本地的数据? Spark使用分区来管理数据,这些分区有助于并行化分布式数据处理,并以最少的网络流量在executors之间发送数据。 默认情况下,Spark尝试从靠近它的节点读取数据到RDD。由于Spark通常访问分布式分区数据,为了优化transformation(转换)操作,它创建分区来保存数据块。 存在在HDFS或Cassandra中的分区数据是一一对应的(由于相同的原因进行分区)。 默认情况下,每个HDFS的分区文件(默认分区文件块大小是64M)都会创建一个RDD分区。 默认情况下,不需要程序员干预,RDD会自动进行分区。但有时候你需要为你的应用程序,调整分区的大小,或者使用另一种分区方案。 你可以通过方法 def getPartitions: Array[Partition] 来获取RDD的分区数量。 在spark-shell中执行以下代码: val v = sc.parallelize(1 to 100) scala> v.getNumPartitions res2: Int = 20 /

Unable to get any data when spark streaming program in run taking source as textFileStream

徘徊边缘 提交于 2020-03-24 00:02:28
问题 I am running following code on Spark shell >`spark-shell scala> import org.apache.spark.streaming._ import org.apache.spark.streaming._ scala> import org.apache.spark._ import org.apache.spark._ scala> object sparkClient{ | def main(args : Array[String]) | { | val ssc = new StreamingContext(sc,Seconds(1)) | val Dstreaminput = ssc.textFileStream("hdfs:///POC/SPARK/DATA/*") | val transformed = Dstreaminput.flatMap(word => word.split(" ")) | val mapped = transformed.map(word => if(word.contains(

Unable to get any data when spark streaming program in run taking source as textFileStream

拥有回忆 提交于 2020-03-23 23:57:06
问题 I am running following code on Spark shell >`spark-shell scala> import org.apache.spark.streaming._ import org.apache.spark.streaming._ scala> import org.apache.spark._ import org.apache.spark._ scala> object sparkClient{ | def main(args : Array[String]) | { | val ssc = new StreamingContext(sc,Seconds(1)) | val Dstreaminput = ssc.textFileStream("hdfs:///POC/SPARK/DATA/*") | val transformed = Dstreaminput.flatMap(word => word.split(" ")) | val mapped = transformed.map(word => if(word.contains(

Spark学习摘记 —— Spark转化操作API归纳

匆匆过客 提交于 2020-03-22 12:52:47
本文参考 在阅读了《Spark快速大数据分析》动物书后,大概了解到了spark常用的api,不过书中并没有给予所有api详细的案例,而且现在spark的最新版本已经上升到了2.4.5,动物书中的spark版本还停留在1.2.0版本,所以就有了这篇文章,在最新的2.4.5版本下测试常用的api 由于spark的惰性计算特性,RDD只有在第一次行动操作中被用到时才会真正进行计算,因此我打算将文章内容分为"转化操作API"和"行动操作API"两部分,同时因为pair RDD(RDD中的元素是键值对)的部分api较为特殊,所以我打算单独再写一篇文章 本文仅介绍转化操作API,前5个api是针对一个RDD的转化操作,后续的api是针对两个RDD的转化操作 环境 idea + spark 2.4.5 + scala 2.11.12 map()函数 目的: 将函数应用于RDD中的每个元素,将返回值构成新的RDD 代码: val testList = List ( 1 , 2 , 3 , 3 ) val testRdd = sc . parallelize ( testList ) testRdd . map ( ele => ele * ele ). foreach ( ele => print ( s " $ ele " )) 输出: 1 4 9 9 更高效的操作: 每个RDD被分为多个分区

Spark大数据分析框架的核心部件

為{幸葍}努か 提交于 2020-03-20 22:28:41
3 月,跳不动了?>>> Spark大数据分析框架的核心部件 Spark大数据分析框架的核心部件包含RDD内存数据结构、Streaming流计算框架、GraphX图计算与网状数据挖掘、MLlib机器学习支持框架、Spark SQL数据检索语言、Tachyon文件系统、SparkR计算引擎等主要部件。这里做一个简单的介绍。 一、RDD内存数据结构 大数据分析系统一般包括数据获取、数据清洗、数据处理、数据分析、报表输出等子系统。Spark为了方便数据处理、提升性能,专门引入了RDD数据内存结构,这一点与R的机制非常类似。用户程序只需要访问RDD的结构,与存储系统的数据调度、交换都由提供者驱动去实现。RDD可以与Haoop的HBase、HDFS等交互,用作数据存储系统,当然也可以通过扩展支持很多其它的数据存储系统。 因为有了RDD,应用模型就与物理存储分离开来,而且能够更容易地处理大量数据记录遍历搜索的情况,这一点非常重要。因为Hadoop的结构主要适用于顺序处理,要翻回去反复检索数据的话效率就非常低下,而且缺乏一个统一的实现框架,由算法开发者自己去想办法实现。毫无疑问,这具有相当大的难度。RDD的出现,使这一问题得到了一定程度的解决。但正因为RDD是核心部件、实现难度大,这一块的性能、容量、稳定性直接决定着其它算法的实现程度。从目前看,还是经常会出现RDD占用的内存过载出问题的情况。

Spark必背面试题

守給你的承諾、 提交于 2020-03-20 18:27:15
3 月,跳不动了?>>> 1,spark的工作机制 用户在客户`端提交作业后,会由Driver运行main方法并创建SparkContext上下文, SparkContext向资源管理器申请资源, 启动Execotor进程, 并通过执行rdd算子,形成DAG有向无环图,输入DAGscheduler, 然后通过DAGscheduler调度器, 将DAG有向无环图按照rdd之间的依赖关系划分为几个阶段,也就是stage, 输入task scheduler, 然后通过任务调度器taskscheduler将stage划分为task set分发到各个节点的executor中执行。 2,spark中stage是如何划分的 在DAG调度的过程中,Stage阶段的划分是根据是否有shuffle过程,也就是存在ShuffleDependency宽依赖的时候,需要进行shuffle,这时候会将作业job划分成多个Stage 整体思路:从后往前推,遇到宽依赖就断开,划分为一个 stage;遇到窄依赖就将这个 RDD 加入该 stage 中 3, spark的shuffle和调优 Spark中一旦遇到宽依赖就需要进行shuffle的操作,本质就是需要将数据汇总后重新分发的过程, 也就是数据从map task输出到reduce task输入的这段过程, 在分布式情况下,reduce

kafka 分区 spark excutor task rdd

混江龙づ霸主 提交于 2020-03-20 12:36:10
kafka分区,excutor,task,RDD分区的关系: 数据的流:数据流向从kafka>sparkStreaming>RDD 1 kafka中的 topic 的 patition 分区的设置,kafka 的 partition 分区数 ,sparkStreaming 直连方式从kafka中拉数据的话,sparkStreaming 创建的 RDD 的分区数和 kafka partitions分区数是一致的 ,而RDD的分区数对应着集群中的tack的数量,也就是对应着 excutor 的数量和其核数。因此这个要参照集群中的计算资源来进行设置,设置kafka patition。 2 sparkStreaming 的 excutor 数决定着集群并发执行 task 的数量,task用来执行 RDD 的 patition 的数据的,一个task 跑一个RDD 分区数据,因此kafka patition数量设置好了的前提下,尽量让其一批执行完毕。 3 RDD分区,在直连方式下,创建的RDD partitions数与kafka partitions数一致。 来源: https://www.cnblogs.com/Mr--zhao/p/12530749.html

Spark专业术语定义

霸气de小男生 提交于 2020-03-18 04:46:38
1.1.1. Application/App:Spark应用程序 指的是用户编写的Spark应用程序/代码,包含了Driver功能代码和分布在集群中多个节点上运行的Executor代码。 Spark应用程序,由一个或多个作业JOB组成(因为代码中可能会调用多次Action),如下图所示: 1.1.2. Driver:驱动程序 Spark中的Driver即运行上述Application的Main()函数并且创建SparkContext,其中创建SparkContext的目的是为了准备Spark应用程序的运行环境。 在Spark中由SparkContext负责和ClusterManager通信,进行资源的申请、任务的分配和监控等; 当Executor部分运行完毕后,Driver负责将SparkContext关闭。 通常SparkContext代表Driver,如下图所示: 1.1.3. Cluster Manager:资源管理器 指的是在集群上获取资源的外部服务,常用的有: Standalone,Spark原生的资源管理器,由Master负责资源的分配; Haddop Yarn,由Yarn中的ResourcesManager负责资源的分配; Messos,由Messos中的Messos Master负责资源管理, 如下图所示: 1.1.4. Worker:计算节点

Spark MapReduce实现移动聚合操作(移动平均、求和、计数等)

≡放荡痞女 提交于 2020-03-13 01:42:19
1. 需求 在处理时间序列或者是有序数据时候,经常会越到这样的情形:1、求客户最近一个月的平均消费金额;2、求客户最近一个月的消费次数;3、求与客户在最近一个月内发生大额消费的客户数量 上述问题中,问题1与问题2是典型的求指定客户在指定时间段的行为统计值,可以通过客户进行分组然后过滤统计即可,而问题三则是求解与该客户在指定时间段内发生某种行为的客户数量,即没有具体的聚合Key,从而不同按照问题1与问题2进行分组的方式求解,而通过类似时间序列中求一个序列的移动平均方法来求解 针对上述两类情形,下面分别提供了两个函数,这个两个函数,一个是aggregateByKey,根据key聚合,并对聚合后的每一条记录采用窗口函数获取聚合数据,即该函数是对每一个key对应的value进行移动聚合操作。另一个是aggregateByAll,根据key进行排序,通过窗口函数获取结果进行聚合。这两个函数都是根据窗口函数进行聚合操作,但不同点在于作用范围不同。 窗口函数与聚合函数用户定义可以自由定义,通过定义不同的窗口函数与聚合函数,可以实现不同的移动逻辑以及聚合运算。 2. 实现思路 2.1 aggregateByKey aggregateByKey实现起来比较简单,因为一般情况先,单个key对应的value不会很大(单个executor的内存是可以装得下的)