rdd

spark梳理

强颜欢笑 提交于 2020-02-13 01:47:14
​大数据组件,离线用过hadoop,实时用过spark。 Hadoop现在比较稳定了,面试主要就是问Spark。 包括我工作这么多年,都没搞清过底层到底是怎么运行的,但是有些东西 懂的人一说就通了,优化起来也会有思路。 我下面给spark梳理一下。做个基本概要,方便面试。 一、spark运行原理: 1.提交spark任务,构建spark application运行环境,启动sparkContext。 2.sparkContext向资源管理器(可以使Standalone,Mesos,Yarn)申请运行Executor资源,并启动StandaloneExecutorbackend(后台监控程序)。 注: a.每个节点可以起一个或多个Executor。 3.Executor向SparkContext申请Task。 注: a.每个Executor由若干core组成,每个Executor的每个core一次只能执行一个Task。 b.每个Task执行的结果就是生产了目标RDD的一个partition。 c.这里的core是虚拟机的core而不是机器的物理CPU核,可以理解为就是Executor的一个工作线程。 d.Task被执行并发度(并发度不等于task数量)=Executor数目*每个Executor核数(=core总个数) e.partition数目在map阶段保持不变

第 6 章 Spark 内存管理

北城余情 提交于 2020-02-12 21:17:41
上篇: 第 5 章 Spark Shuffle解析 Spark 内存管理 在执行Spark 的应用程序时,Spark 集群会启动 Driver 和 Executor 两种 JVM 进程,前者为主控进程,负责创建 Spark 上下文,提交 Spark 作业(Job),并将作业转化为计算任务(Task),在各个 Executor 进程间协调任务的调度,后者负责在工作节点上执行具体的计算任务,并将结果返回给 Driver,同时为需要持久化的 RDD 提供存储功能。由于 Driver 的内存管理相对来说较为简单,本节主要对 Executor 的内存管理进行分析,下文中的 Spark 内存均特指 Executor 的内存。 1、堆内和堆外内存规划 作为一个 JVM 进程, Executor 的内存管理建立在 JVM 的内存管理之上,Spark 对 JVM 的堆内(On-heap)空间进行了更为详细的分配,以充分利用内存。同时,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的系统内存中开辟空间,进一步优化了内存的使用 。 堆内内存受到JVM统一管理,堆外内存是直接向操作系统进行内存的申请和释放。 堆内内存 堆内内存的大小,由 Spark 应用程序启动时的 –executor-memory 或 spark.executor.memory 参数配置。Executor

spark sql

不问归期 提交于 2020-02-11 14:18:02
Spark 用来操作结构化和半结构化数据的接口——Spark SQL。结构化数据是指任何有结构信息的数据。所谓结构信息,就是每条记录共用的已知的字段集合。当数据符合这样的条件时,Spark SQL 就会使得针对这些数据的读取和查询变得更加简单高效。 Spark SQL 提供了以下三大功能: (1) Spark SQL 可以从各种结构化数据源(例如JSON、Hive、Parquet 等)中读取数据。 (2) Spark SQL 不仅支持在Spark 程序内使用SQL 语句进行数据查询,也支持从类似商业智能软件Tableau 这样的外部工具中通过标准数据库连接器(JDBC/ODBC)连接SparkSQL 进行查询。 (3) 当在Spark 程序内使用Spark SQL 时,Spark SQL 支持SQL 与常规的Python/Java/Scala代码高度整合,包括连接RDD 与SQL 表、公开的自定义SQL 函数接口等。这样一来,许多工作都更容易实现了。 为了实现这些功能,Spark SQL 提供了一种特殊的RDD,叫作SchemaRDD。SchemaRDD是存放Row 对象的RDD,每个Row 对象代表一行记录。SchemaRDD 还包含记录的结构信息(即数据字段)。SchemaRDD 看起来和普通的RDD 很像,但是在内部,SchemaRDD 可以利用结构信息更加高效地存储数据

Spark复习 Day03:SparkSQL

你。 提交于 2020-02-10 21:52:28
Spark复习 Day03:SparkSQL 1. 什么是SparkSQL ----------------------------------------------- - SparkSQL是Spark用来处理结构化[表]数据的一个模块。 - 它提供了两个编程抽象:DataFrame和DataSet,底层还是RDD操作 2. DataFrame、DataSet 介绍 ------------------------------------------------ - DataFrame 1. 与RDD类似,DataFrame也是一个分布式数据容器 2. 不同的是,DataFrame更像是传统数据库的二维表格 3. 除了记录了数据以外,还记录了数据的结构信息,即Schema 4. 与Hive一样,DataFrame也支持嵌套数据类型[struct,array,map] 5. DataFrame的API 比 RDD的API更加好用 6. DataFrame是为数据提供了Schema的视图,可以把它当做数据库的一张表来对待 - DataSet 1. Dataset是DataFrameAPI的一个拓展,是Spark最新的数据抽象。DataFrame的升级版 2. 用户友好的API风格,既有类型的安全检查,収DataFrame的查询优化特性 3. DataSet支持编解码器

Spark编程基础_RDD初级编程

牧云@^-^@ 提交于 2020-02-10 17:26:44
摘要:Spark编程基础_RDD初级编程 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。 1.RDD编程基础 1.1 RDD创建 【1】从文件系统中加载数据创建RDD Spark采用textFile()方法来从文件系统中加载数据创建RDD 该方法把文件的URL作为参数,这个URL可以是: 本地文件系统的地址 或者是Amazon S3的地址等等 (1)创建RDD之前的准备工作 在即将进行相关的实践操作前,我们首先要登录linux系统,然后,打开命令行“终端”,输入 cd /usr/local/hadoop 进入相应文件夹 然后: ./sbin/start-dfs.sh 然后启动spark-shell 输入 cd /usr/local/spark ./bin/spark-shell 之后新建空白终端,进入“/usr/local/spark/mycode”目录,在这个文件夹下创建新的rdd子目录用来存放相关代码及文件; cd /usr/local/spark/mycode/ mkdir

寒假学习笔记05

五迷三道 提交于 2020-02-10 16:14:34
Spark Shell Spark 的 shell 作为一个强大的交互式数据分析工具,提供了一个简单的方式来学习 API。它可以使用 Scala(在 Java 虚拟机上运行现有的 Java 库的一个很好方式) 或 Python。在 Spark 目录里使用下面的方式开始运行: ./bin/spark-shell    Spark 最主要的抽象是叫Resilient Distributed Dataset(RDD) 的弹性分布式集合。RDDs 可以使用 Hadoop InputFormats(例如 HDFS 文件)创建,也可以从其他的 RDDs 转换。让我们在 Spark 源代码目录从 README 文本文件中创建一个新的 RDD。 scala> val textFile = sc.textFile("README.md") textFile: spark.RDD[String] = spark.MappedRDD@2ee9b6e3   RDD 的 actions 从 RDD 中返回值, transformations 可以转换成一个新 RDD 并返回它的引用。 让我们开始使用几个操作: scala> textFile.count() // RDD 的数据条数 res0: Long = 126 scala> textFile.first() // RDD 的第一行数据 res1:

2月9日学习记录

ぃ、小莉子 提交于 2020-02-10 00:39:03
1,背诵单词:obstacle:障碍物 gum:口香糖 fridge:电冰箱 combination:结合 fasten:系牢 purchase:购买 leak:漏出 inhabitant:居民 express:快递 conceal:隐瞒 digest:消化 beggar:乞丐 apology:道歉认错 suspicion:怀疑 aid:帮助 yield:投降 dew:水珠 transmit:传输 stable:稳定的 spot:点 2,做spark实验4,回顾了之前学习的RDD操作等 map(func) 作用: 返回一个新的 RDD ,该 RDD 由每一个输入元素经过 func 函数转换后组成 mapPartitions(func) 作用:类似于 map ,但独立地在 RDD 的每一个分片上运行,因此在类型为 T 的 RDD 上运行时, func 的函数类型必须是 Iterator[T] => Iterator[U] 。 假设有 N 个元素 , 有 M 个分区,那么 map 的函数的将被调用 N 次 , 而 mapPartitions 被调用 M 次 , 一个函数一次处理所有分区。 mapPartitionsWithIndex(func) 作用:类似于 mapPartitions ,但 func 带有一个整数参数表示分片的索引值,因此在类型为 T 的 RDD 上运行时, func

Spark中的RDD和DataFrame

╄→尐↘猪︶ㄣ 提交于 2020-02-08 18:13:14
什么是DataFrame 在Spark中,DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。 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 RDD转DataFrame原因及方式 可以将RDD转成DataFrame之后,借用sparksql和sql以及HQL语句快速方便的使用sql语句统计和查询,比如说分组排名(row_number() over()) 分析函数和窗口函数去实现占比分析。 将RDD转化为DataFrame有两种方式: 方式一:通过反射推断schema 要求:RDD的元素类型必须是case

第5章 RDD编程进阶

社会主义新天地 提交于 2020-02-08 17:08:01
上篇: 第4章 大数据Spark连接HBase数据读取与保存 Spark 三大数据结构 RDD:分布式数据集 广播变量:分布式只读共享变量 累加器: 分布式只写共享变量 1、累加器 累加器用来对信息进行聚合,通常在向 Spark传递函数时,比如使用 map() 函数或者用 filter() 传条件时,可以使用驱动器程序中定义的变量,但是集群中运行的每个任务都会得到这些变量的一份新的副本,更新这些副本的值也不会影响驱动器中的对应变量。如果我们想实现所有分片处理时更新共享变量的功能,那么累加器可以实现我们想要的效果。 代码具体实现: package com . study . bigdatabase import org . apache . hadoop . hbase . HBaseConfiguration import org . apache . hadoop . hbase . client . Put import org . apache . hadoop . hbase . io . ImmutableBytesWritable import org . apache . hadoop . hbase . mapred . TableOutputFormat import org . apache . hadoop . hbase . util . Bytes

spark RDD基础装换操作--zip操作

杀马特。学长 韩版系。学妹 提交于 2020-02-08 10:13:59
14.zip操作 将数字1~3组成的RDD,与字母A到C组成的RDD应用拉链(zip)操作,合并到一个新的RDD中。 scala> val rddData1 = sc.parallelize(1 to 10,5) rddData1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[32] at parallelize at <console>:24 scala> val rddData2 = rddData1.glom rddData2: org.apache.spark.rdd.RDD[Array[Int]] = MapPartitionsRDD[33] at glom at <console>:26 scala> rddData2.collect res13: Array[Array[Int]] = Array(Array(1, 2), Array(3, 4), Array(5, 6), Array(7, 8), Array(9, 10)) scala> val rddData1 = sc.parallelize(1 to 3, 2) rddData1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[34] at parallelize at