rdd

RDD()——序列化问题

若如初见. 提交于 2020-02-27 13:22:21
在实际开发中我们往往需要自己定义一些对于 RDD的操作,那么此时需要考虑的主要问题是,初始化工作是在 Driver端进行的,而实际运行程序是在 Executor端进行的,这就涉及到了跨进程通信,是需要序列化的。 传递一个方法 import org.apache.spark.rdd.RDD class Search(query:String) { //过滤出包含字符串的数据 def isMatch(s: String): Boolean = { s.contains(query) } //过滤出包含字符串的RDD def getMatch1 (rdd: RDD[String]): RDD[String] = { rdd.filter(isMatch) } //过滤出包含字符串的RDD def getMatche2(rdd: RDD[String]): RDD[String] = { rdd.filter(x => x.contains(query)) } } 创建 Spark主程序 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} object SeriTest { def main(args: Array[String]): Unit = { //1

大数据学习(二十二) DataFrame

我们两清 提交于 2020-02-27 06:48:30
文章目录 简介 DataFrame和RDD区别 Datasets : DF之上的更高级抽象 DataFrames SparkSession DataFrame中使用SQL语句 视图 简介 spark SQL部分,DF是很重要的一个操作单位。 DataFrame是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames可以从各种来源构建: 结构化数据文件 hive中的表 外部数据库或现有RDDs DataFrame和RDD区别 总的来说,DataFrame多了数据的结构信息,也就是schema,可以理解为每一个表的元数据或者说表结构信息。 他大体上就是这样一个关系: DF= RDD + schema 优点: DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化。 Datasets : DF之上的更高级抽象 Datasets是在Spark1.6中添加的一个新的接口。 首先Datasets提供了RDD的优点,强类型化,使用了lambda等等。 并且Datasets可以从JVM对象进行构造,兼容性更好,并且可以使用map等函数去操作。 DataFrames 总的来说有两种方法来创建DataFrames (*)Case Class

Spark RDD

*爱你&永不变心* 提交于 2020-02-27 05:06:35
对 RDD 的学习进行一下整理 RDD: 基于内存的集群计算容错抽象 分布式内存抽象的概念 --- 弹性分布式数据集( RDD ),它具备 MapReduce 等数据流模型的容错特性,并且允许开发人员在大型集群上执行基于内存的计算。 为了有效地实现容错, RDD 提供了一种高度受限的共享内存,即 RDD 是只读的,并且只能通过其他 RDD 上的批量操作来创建。 RDD 基于工作集的应用,同时具有数据流模型的特点:自动容错、位置感知调度和可伸缩性。允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,提升了查询速度 RDD 提供了一种高度受限的共享内存模型,即 RDD 是只读的记录分区的集合,只能通过在其他 RDD 执行确定的转换操作 ( 如 map 、 join 和 group by) 而创建,然而这些限制使得实现容错的开销很低。与分布式共享内存系统需要付出高昂代价的检查点和回滚机制不同, RDD 通过 Lineage 来重建丢失的分区:一个 RDD 中包含了如何从其他 RDD 衍生所必需的相关信息,从而不需要检查点操作就可以重构丢失的数据分区。 编程模型 a) 在 Spark 中, RDD 被表示为对象,通过这些对象上的方法 ( 或函数 ) 调用转换。 b) 定义 RDD 后,可在动作中使用 RDD 。动作是向应用程序返回值,或向存储系统导出数据的那些操作

Spark面试题

扶醉桌前 提交于 2020-02-26 23:12:53
RDD怎么理解? RDD 是 Spark 的灵魂,也称为弹性分布式数据集。一个 RDD 代表一个可以被分区的只读数据集。RDD 内部可以有许多分区(partitions),每个分区又拥有大量的记录(records)。Rdd的五个特征: 1. dependencies: 建立 RDD 的依赖关系,主要 RDD 之间是宽窄依赖的关系,具有窄依赖关系的 RDD 可以在同一个 stage 中进行计算。 2. partition: 一个 RDD 会有若干个分区,分区的大小决定了对这个 RDD 计算的粒度,每个 RDD 的分区的计算都在一个单独的任务中进行。 3. preferedlocations: 按照“移动数据不如移动计算”原则,在 Spark 进行任务调度的时候,优先将任务分配到数据块存储的位置。 4. compute: Spark 中的计算都是以分区为基本单位的,compute 函数只是对迭代器进行复合,并不保存单次计算的结果。 5. partitioner: 只存在于(K,V)类型的 RDD 中,非(K,V)类型的 partitioner 的值就是 None。 RDD 的算子主要分成2类,action 和 transformation。这里的算子概念,可以理解成就是对数据集的变换。action 会触发真正的作业提交,而 transformation 算子是不会立即触发作业提交的

Spark 源码解析 : DAGScheduler中的DAG划分与提交

痞子三分冷 提交于 2020-02-26 02:24:54
一、Spark 运行架构 Spark 运行架构如下图: 各个RDD之间存在着依赖关系,这些依赖关系形成有向无环图DAG,DAGScheduler对这些依赖关系形成的DAG,进行Stage划分,划分的规则很简单,从后往前回溯,遇到窄依赖加入本stage,遇见宽依赖进行Stage切分。完成了Stage的划分,DAGScheduler基于每个Stage生成TaskSet,并将TaskSet提交给TaskScheduler。TaskScheduler 负责具体的task调度,在Worker节点上启动task。 二、源码解析:DAGScheduler中的DAG划分 当RDD触发一个Action操作(如:colllect)后,导致SparkContext.runJob的执行。而在SparkContext的run方法中会调用DAGScheduler的run方法最终调用了DAGScheduler的submit方法: def submitJob[T, U]( rdd: RDD[T], func: (TaskContext, Iterator[T]) => U, partitions: Seq[Int], callSite: CallSite, resultHandler: (Int, U) => Unit, properties: Properties): JobWaiter[U] = { //

Spark学习四:Spark架构设计和RDD的stage划分

不羁的心 提交于 2020-02-26 00:32:29
文章目录 架构设计 Spark运行基本流程 RDD之间的依赖关系 stage的划分 RDD运行过程 参考网址 架构设计 学习完 Spark学习二:spark基础理论知识 ,我们可以对Spark的一些组件和术语应该有了基本的认识,下面介绍Spark的架构设计。本节内容主要参考 厦门大学林子雨老师的Spark课程 。非常感谢林子雨老师! 如下图所示。 Spark运行架构包括集群资源管理器( Cluster Manager )、运行作业任务的工作节点( Worker Node )、每个应用的任务控制节点( driver program )和每个工作节点上负责具体任务的执行进程( Executor )。其中,集群资源管理器可以是Spark自带的资源管理器,也可以是YARN或Mesos等资源管理框架。 与Hadoop MapReduce计算框架相比,Spark所采用的Executor有两个优点: 一是利用多线程来执行具体的任务(Hadoop MapReduce采用的是进程模型) (Spark和MapReduce的运行模式在 Spark学习二:spark基础理论知识 里也详细说明过),减少任务的启动开销; 二是Executor中有一个BlockManager存储模块 ,会将内存和磁盘共同作为存储设备,当需要多轮迭代计算时,可以将中间结果存储到这个存储模块里,下次需要时

分布式计算框架

北战南征 提交于 2020-02-25 22:21:23
MapReduce 简介 概念 面向批处理的分布式计算框架 一种编程模型: MapReduce程序被分为Map(映射)和Reduce(化简)阶段 核心思想 分而治之, 并行计算 移动计算而非移动数据 特点 MapReduce有几个特点: 移动计算而不移动数据:分布式计算,计算跟着数据走,数据存放在哪就在哪里进行计算,极大的减少了IO的开销。 良好的扩展性:分布式计算框架拥有相当良好的扩展性,随着节点数量的增加,单个节点的计算量减小,整体的计算能力近乎线性的递增。 高容错性:计算任务失败,会自动恢复计算,拥有良好的容错性。 状态监控:提交任务之后,任务具体执行在哪个节点,具体执行到哪个阶段,在后台或者监控界面,我们都能实时的进行监控。 适合于海量数据的离线批处理:MapReduce在设计之初的目标就是面向离线批处理,特别是大吞吐量的离线处理场景,更适合于MapReduce。 降低了分布式编程的门槛:大部分操作MapReduce已经实现,我们仅仅需要在特定的部分编写我们自己的业务逻辑,极大的减少了工作量,同时也降低了编程的门槛。 MR原理 1. 作业(job):作业是客户端提交请求执行的一个单元,它包括数据、计算框架以及一些配置信息等。 2. 任务(task):是作业细分之后的细分工作单元,如MapReduce中的Map Task和Reduce Task。

spark实现WordCount(多种实现方式)

若如初见. 提交于 2020-02-21 19:02:27
第一种方式: 文件内容: object WordCount { def main ( args : Array [ String ] ) : Unit = { val conf : SparkConf = new SparkConf ( ) . setMaster ( "local" ) . setAppName ( "WordCount" ) /// 创建Spark上下文对象 val sc = new SparkContext ( conf ) // 读取文件种的数据 val textRDD : RDD [ String ] = sc . textFile ( "in" ) // 扁平化, 按照" "来切割 val wordRDD : RDD [ String ] = textRDD . flatMap { case x = > { x . split ( " " ) } } // 转换结构 val mapRDD : RDD [ ( String , Int ) ] = wordRDD . map { case x = > { ( x , 1 ) } } val rdRDD : RDD [ ( String , Int ) ] = mapRDD . reduceByKey { case ( x , y ) = > { x + y } } //收集遍历 rdRDD .

RDD、DataFrame和DataSet

荒凉一梦 提交于 2020-02-20 07:49:38
https://blog.csdn.net/weixin_43087634/article/details/84398036 2、什么是DataFrame 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。 3、RDD和DataFrame的区别 DataFrame与RDD的主要区别在于,DataFrame带有schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型。使得Spark SQL得以洞察更多的结构信息,从而对藏于DataFrame背后的数据源以及作用于DataFrame之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core只能在stage层面进行简单、通用的流水线优化。 DataFrame底层是以RDD为基础的分布式数据集,和RDD的主要区别的是:RDD中没有schema信息,而DataFrame中数据每一行都包含schema DataFrame = RDD[Row] + shcema 4、什么是DataSet Dataset是一个由特定领域的对象组成强类型(typedrel)集合,可以使用函数(DSL)或关系运算(SQL)进行并行的转换操作。 每个Dataset 还有一个称为“DataFrame”的无类型

Creating a Pyspark Schema involving an ArrayType

两盒软妹~` 提交于 2020-02-19 10:33:12
问题 I'm trying to create a schema for my new DataFrame and have tried various combinations of brackets and keywords but have been unable to figure out how to make this work. My current attempt: from pyspark.sql.types import * schema = StructType([ StructField("User", IntegerType()), ArrayType(StructType([ StructField("user", StringType()), StructField("product", StringType()), StructField("rating", DoubleType())])) ]) Comes back with the error: elementType should be DataType Traceback (most