Spark编程核心抽象—RDD
- 什么是RDD?
RDD 是Resilient Distributed Dataset的简称。它是Apache Spark的基本数据结构。它是一个不可变的对象集合,在集群的不同节点上进行计算。
- Resilient:即在RDD lineage(DAG)的帮助下具有容错能力,能够重新计算由于节点故障而丢失或损坏的数据分区。
- Distributed:数据分布在多个节点上。
- Dataset:表示所操作的数据集。用户可以通过JDBC从外部加载数据集,数据集可以是JSON文件、CSV文件、文本文件或数据库
- RDD的特点
1、内存计算:它将中间计算结果存储在分布式内存(RAM)中,而不是磁盘中。
2、延迟计算:Apache Spark中的所有transformation都是惰性的,因为它们不会立即计算结果,它们会记住应用于数据集的那些transformation。直到action出现时,才会真正开始计算。
3、容错性:Spark RDDs能够容错,因为它们跟踪数据沿袭信息,以便在故障时自动重建丢失的数据。
4、不可变性:跨进程共享数据是安全的。它也可以在任何时候创建或检索,这使得缓存、共享和复制变得容易。因此,它是一种在计算中达到一致性的方法。
5、分区性:partition是Spark RDD中并行性的基本单元,每个分区都是数据的逻辑分区。Partition—task一 一对应
6、持久化:用户可以声明他们将重用哪些RDDs,并为它们选择存储策略。
7、数据本地性:RDDs能够定义计算分区的位置首选项。位置首选项是关于RDD位置的信息。
- Spark RDD的操作类型
Apache Spark中的RDD支持两种操作:
- Transformation
- Actions
- Transformation操作:
Spark RDD transformation操作是一个从现有的RDD生成新RDD的函数(方法、算子)。如:map(), filter(), reduceByKey()。
Transformation操作都是延迟计算的操作。
有两种类型transformation:窄变换、宽变换(窄依赖、宽依赖)。
- 窄依赖:它是map、filter这样数据来自一个单独的分区的操作。即输出RDD分区中的数据,来自父RDD中的单个分区。
- 宽依赖:在子RDD单个分区中计算结果所需的数据可能存在于父RDD的多个分区中。类似groupByKey()和reduceByKey()这样的transformation。宽依赖也称为shuffle transformation。
- action操作
Spark中的Action操作,返回RDD计算的最终结果,其结果是一个值,而不是一个RDD。Action触发血缘关系中RDD上的transformation操作的真正计算,计算结果返回Driver端或者写入数据库。
这种设计使Spark运行更加高效。例如:map操作返回的数据集用于reduce操作,返回到driver端的只是reduce的结果值,而不是map操作的数据集。
常见的Action:first(), take(), reduce(), collect(), the count() 。
- 创建RDD(Spark IDEA编程)
三种创建RDDs的方法:
- 使用集合创建RDD
- 使用已有RDD创建RDD
- 从外部数据源创建RDD
在我们学习Spark的初始阶段,RDDs通常是由集合创建的,即在Driver程序中创建集合并将其传递给SparkContext的 parallelize ()方法。这种方法很少在正式环境中使用,因为这种方法的整个数据集位于一台主机上。
首先实例化SparkContext对象
注意:一个JVM中处于激活状态的SparkContext对象
---scala val conf = new SparkConf().setAppName(appName).setMaster(master) val sc=new SparkContext(conf) ---Java SparkConf conf = new SparkConf().setAppName(appName).setMaster(master); JavaSparkContext sc = new JavaSparkContext(conf); |
其中 appName用于显示在Spark集群的webUI上面。Master是一个spark、YARN、mesos集群URL,或者是一个local字符串。实际项目中,在集群上运行时,不会对master进行硬编码。而是用spark-submit启动应用程序,并传递master给应用程序。但是,对于本地测试和单元测试,可以使用local运行Spark。
- 使用集合创建RDD
--scala val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) --java List<Integer> data = Arrays.asList(1, 2, 3, 4, 5); JavaRDD<Integer> distData = sc.parallelize(data); |
- 从外部数据源创建RDD
Spark可以从Hadoop支持的任何存储源创建分布式数据集,包括本地文件系统、HDFS、Cassandra、HBase、Amazon S3等。Spark支持文本文件、SequenceFiles和任何其他Hadoop InputFormat。
- 读取本地文件
文本文件RDDs可以使用SparkContext的textFile方法创建。此方法接受文件的URI(机器上的本地路径或hdfs://、s3a://等URI),并将其作为行集合读取。下面是一个示例调用:
val distFile = sc.textFile("data.txt") |
一旦创建,就可以对distFile进行相应操作。例如,我们可以将所有行的长度相加,使用map和reduce操作:
distFile.map(s => s.length).reduce((a, b) => a + b). |
关于用Spark读取文件的一些注意事项:
- 如果使用本地文件系统上的路径,则必须在worke节点上的同一路径上,此文件可访问。要么将文件复制到所有worker,要么使用一个挂载网络的共享文件系统。
- Spark所有基于文件的输入方法(textFile等),支持在目录、压缩文件和通配符上运行,例如:
textFile("/my/directory"), textFile("/my/directory/*.txt"), textFile("/my/directory/*.gz").
- textFile方法还接受一个可选的第二个参数,用于控制文件的分区数量。默认情况下,Spark为文件的每个块创建一个分区(HDFS中的块默认为128MB),但是您也可以通过传递更大的值来要求更高数量的分区。注意,分区数不能少于块数。
除了文本文件,Spark的Scala API还支持其他几种数据格式:
- SparkContext.wholeTextFiles允许您读取包含多个小文本文件的目录,并将它们作为 (filename, content) 的键值对返回。这与textFile不同,textFile将在每个文件中每行返回一条记录。分区由数据本地性决定,在某些情况下,数据本地性可能导致分区太少。对于这些情况,wholetextfile提供了控制最小分区数量的第二个可选参数。
- 对于SequenceFiles,使用SparkContext的sequenceFile[K, V]方法,其中K和V是文件中的键和值的类型。这些应该是HadoopWritable接口的子类,比如IntWritable和Text。
- 对于其他Hadoop inputformat,您可以使用SparkContext.hadoopRDD方法,它接受任意的JobConf和输入格式类、键类和值类。将这些设置为与使用输入源Hadoop作业相同的方式。您还可以使用SparkContext。基于“new”MapReduce API (org.apache.hadoop.mapreduce)的inputformat的newAPIHadoopRDD。
- 读取HDFS上的数据
- 启动hdfs
- 读取hdfs上的数据
val textFileRDD=sc.textFile("hdfs://bigdata01:9000/testdata/order.txt") val count=textFileRDD.count() println("count:"+count) |
Spark编程核心抽象—RDD相关推荐
- Spark详解(三):Spark编程模型(RDD概述)
1. RDD概述 RDD是Spark的最基本抽象,是对分布式内存的抽象使用,实现了以操作本地集合的方式来操作分布式数据集的抽象实现.RDD是Spark最核心的东西,它表示已被分区,不可变的并能够被并行 ...
- 转: Spark 的核心概念 RDD
转自: https://juejin.im/post/6844903826953076750 1.RDD 概述 1.1 什么是 RDD ? RDD(Resilient Distributed Dat ...
- 《循序渐进学Spark 》Spark 编程模型
本节书摘来自华章出版社<循序渐进学Spark >一书中的第1章,第3节,作者 小象学院 杨 磊,更多章节内容可以访问云栖社区"华章计算机"公众号查看. Spark机制原 ...
- Spark核心编程系列(一)——RDD详解
目录 Spark核心编程系列--RDD详解(一) RDD概念 RDD与IO之间的关系 RDD的核心属性 RDD执行原理 基础编程 RDD创建 RDD的并行度与分区 参考 Spark核心编程系列--RD ...
- 理解Spark的核心RDD
与许多专有的大数据处理平台不同,Spark建立在统一抽象的RDD之上,使得它可以以基本一致的方式应对不同的大数据处理场景,包括MapReduce,Streaming,SQL,Machine Learn ...
- Spark RDD 论文详解(三)Spark 编程接口
前言 本文隶属于专栏<1000个问题搞定大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见1000个问题搞定大数据技 ...
- spark期末大作业RDD编程初级实践
1.需求描述 本次实验需要:系统:linux unbuntu14.04,处理器:至少需要两个处器,一个内核,内存:至少4G,硬盘空间:大小需要20GB.Hadoop:2.7.1以上版本,JDK:1.8 ...
- Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集)
Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集) 铺垫 在hadoop中一个独立的计算,例如在一个迭代过程中,除可复制的文件系统(HDFS)外没有 ...
- Spark 的核心 RDD 以及 Stage 划分细节,运行模式总结
精选30+云产品,助力企业轻松上云!>>> 阅读文本大概需要 5 分钟. 以下内容,部分参考网络资料,也有自己的理解, 图片 99% 为自己制作.如有错误,欢迎留言指出,一起交流. ...
- 【Spark Core】【RDD】【01】核心属性 执行原理
理解RDD 刚从地里挖出来的土豆食材.清洗过后的干净土豆.生薯片.烤熟的薯片,流水线上这些食材的不同形态,就像是 Spark 中 RDD 对于不同数据集合的抽象. RDD 具有 4 大属性,分别是 p ...
最新文章
- html5关于定位功能的实现
- 解决Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径。)问题...
- 微信公众平台开发接口PHP SDK完整版
- 7-5 排列的字典序问题 (10 分)(思路加详解全排列问题+vector容器做法)Come Baby!
- LC和RC滤波电路分析
- 你掉进过“伪敏捷”的陷阱吗?
- uft自动化测试工具安装步骤_自动化测试灵魂三问:是什么、为什么和做什么
- eureka集群 ha_EurekaServer集群配置
- 《Hack与HHVM权威指南》——1.1 为什么使用类型检查器
- json 插入数据_让繁琐的工作自动化——python处理JSON文件
- 企业微信api接口调用-通过手机号或微信好友添加客户
- 爬虫---批量下载美女图片
- tf2 --- 结构化数据建模流程
- 少儿编程微课程14:对称图形的模拟验证
- 使用v-cli创建项目,引入element-ui构建用户管理页面实现增删改查
- Quartus II各版本支持的器件
- 利用摄像头实现人员活动检测(python+openCV)
- python绘制contourf填色图,数值超出色条设定的范围时出现空白区域
- MySQL 8.0 新特性之检查约束(CHECK)
- 关于编程,鲜为人知的真相
热门文章
- 农产品区块链溯源:疫情催使下的农产品认知升级
- 想成功就不要设定目标,你信吗?
- Halcon 识别DataMatrix二维码
- java语音实现_用JAVA实现语音交互的功能(即语音聊天室的功能)
- 携程日处理20亿数据,实时用户行为服务系统架构实践
- 线上连锁线下整合的连锁电商架构 打造店店互推人人分销模式
- 安全策略篇 安全策略发展历程详解
- 局域网对战平台 linux,在Linux下可用Wine安装和运行腾讯对战平台、5E对战平台
- opencv-qr码识别
- 如何使用计算机处理文件夹,电脑打开某些文件夹提示引用了不可用位置怎么解决[多图]...