《《Spark大数据技术与应用案例教程》教案第4课读取学生成绩创建RDD.docx》由会员分享,可在线阅读,更多相关《《Spark大数据技术与应用案例教程》教案第4课读取学生成绩创建RDD.docx(6页珍藏版)》请在优知文库上搜索。
1、课题读取学生成绩创建RDD课时2课时(90min)教学目标知识技能目标:(1)掌握RDD的执行过程和依赖关系(2)掌握SparkRDD的创建方法素质目标:促使学生学习SparkRDD的执行过程、RDD之间的依赖关系,以及创建RDD的不同方法,培养学生创建SparkRDD弹性分布式数据集,使用Spark分析和统计学生成绩教学重难点教学重点:RDD的执行过程和依赖关系,SparkRDD的创建方法教学难点:能读取数据创建RDD教学方法案例分析法、问答法、讨论法、讲授法教学用具电脑、投影仪、多媒体课件、教材教学过程主要教学内容及步骤课前任务【教师】布置课前任务,和学生负责人取得联系,让其提醒同学通过A
2、PP或其他学习软件,完成课前任务请大家了解RDD的相关知识。【学生】完成课前任务考勤【教师】使用APP迸行签到【学生】班干部报请假人员及原因问题导入【教师】提出以下问题:假如让你用Spark分析和统计一个班级的成绩数据,你会如何做?【学生】思考、举手回答传授新知【教师】通过学生的回答引入新知,介绍SparkRDD的执行过程、SparkRDD之间的依赖关系和SparkRDD的创建等知识一、SParkRDD的执行过程【教师】利用多媒体展示“RDD的特性和RDD典型的执行过程”图片,并进行讲解弹性分布式数据集(resilientdistributeddatasets.RDD)是Spark中最基本的抽
3、象概念之一,它是一个不可变的、弹性的、可分区的分布式数据集合。每个RDD可以分成多个分区,每个分区就是一个数据集片段.一个RDD的不同分区可以存储在集群的不同节点上,从而实现分布式计算。RDD的特性如图2-1所示。RDD的每个元素都可以 被序列化,并且RDD本 身也是可以序列化的, 这使得RDD可以在网络 上传输G某个节点或任务发 故障时,RDD可以自动 恢复到正常状态,保证 了 SPark的容错性KDD将数据划分为多? 分区存储,每个分区可 以在不同的节点上进行 计算,从而实现分布式XZ、作DD一旦创建,就不能倒H改,只能通过转换操作生成)相的RDDJZRDD只支持粗粒度修改,即Y只针对整个
4、数据集进行转换J操作,不能针对数据集中的某个元素进行转换操作Z、RDD提供了多种转换操作和行动操作,方便开发人员对,数据进行处理和分析图21RDD的特性RDD屏蔽了复杂的底层分布式计算,为用户提供了方便的数据转换和求值方法,其典型的执行过程如图2-2所示。图2-2RDD典型的执行过程下面对RDD典型的执行过程进行详细介绍。(I)创建RDDeSpark会读取数据源(如本地文件系统、HDFS.数据库等)中的数据创建RDDe(2)转换操作。对已有RDD进行各种转换操作。这些操作都是情性求值的,也就是说不会立即执行,而是在遇到行动操作时才会执行。每次转换操作都会生成一个新的RDD,该RDD会记录其与前
5、一个RDD的依赖关系,并形成T有向无环图(DAG).(3)行动操作。执行针对RDD的行动操作得到值(值也是RDD),可以将颤回给驱动程序或者输出到外部存储系统。【教师】提出问题:如果要重复使用某个RDD,应如何做?【学生】聆听、思考、回答【教师】总结学生的回答如果需要重复使用某个RDD,可以使用持久化操作将其缓存到内存中,以加快后续操作的速度。例如,RDD执行过程的一个实例(详见教材)二、SParkRDD之间的依赖关系【教师】讲解SparkRDD之间有哪些依赖关系在Spark中,不同的操作使不同的RDD之间产生了不同的依赖关系,这些依赖关系可以分为窄依赖(narrowdependency)和宽
6、依赖(widedependency)o在理解依赖关系之前需要了解以下基本概念。(1)父RDDe父RDD是指在Spark中生成当前RDD的原始数据集,每个RDD可以有一个或多个父RDD。(2)子RDDe子RDD指的是通过对父RDD进行转换操作派生出来的新RDDe(3)Shuffle操作。Shuffie操作是指根据某个键(key)对元素进行重新分区和重新组合的过程。Shufe操作将数据从源分区移动到目标分区,并对数据进行排序或聚合等操作.1.窄依赖1 .窄依赖【教师】利用多媒体展示“窄依赖”图片,并进行讲解窄依赖是指父RDD的每个分区最多被子RDD的一个分区所使用,子RDD分区通常对应一个或多个父
7、RDD分区。当RDD执行map()、filterQ、UniOn()和对输入做协同划分的join。等操作时,就会产生窄依赖,如图2-4所示。这些操作不需要改变雌的分布方式,只是对父RDD每个分区中的元素做出一定处理,并将结果写入子RDD分区中即可。图2-4窄依赖map()filter()【教师】提出问题什么是协同划分?【学生】聆听、思考、回答【教师】总结学生的回答协同划分是指多个父RDD的某一分区的所有键(key)只落在子RDD的同一分区内.2 .宽依赖【教师】利用多媒体展示宽依赖”图片,并进行讲解宽依赖是指父RDD的每个分区都可能被子RDD的多个分区所使用,子RDD分区通常对应所有的父RDD分
8、区。当RDD执行groupByKey()和对输入做非协同划分的join。等操作时,就会产生宽依赖,如图2-5所示。这些操作需要对输入雌进行全局排序和合并,并将结果重新分配到不同的节点上进行处理。groupByKey()对输入做非协同划分的join。图2-5宽依赖.(详见教材)三、SParkRDD的创建【教师】讲解SParkRDD的创建方法在Spark中,创建RDD的方法有三种:第一种是集合并行化创建RDD;第二种是读取外部存储系统的数据创建RDD;第三种是对已有的RDD进行转换得到新的RDD(该方法将在后续的RDD转换操作中i锚讲解)1 .集合并行化创建RDDSparkContext是Spar
9、k与集群通信的主要入口点,它支持从不同的数据源加载数据创建RDD,还支持执行不同的RDD操作。在开发独立应用程序时,首先使用SParkConf()方法创建SParkConf对象,然后使用setter方法配置Spark应用程序的相关属性,最后基于上述配置创建一个SparkContexi对象。参考示例如下。frompysparkimportSparkConf,SparkContext#创建SParkCon对象conf=SparkConf().setApName(AppName).setMaster(URL)#创建SparkContext对象sc=SparkContext(Conf=Conf)SPa
10、rkCOnf对象常用的SeIter方法如表2-1所示。表2-1SparkConf对象常用的setter方法方法说明SetAppName(Value)设置SPark应用程序的名称。参数VaIUe为名称setMaster(value)设置Spark应用程序的主节点URL在Spark中,使用SparkContext类中的ParaIIeliZe()方法可以将一个已经存在的Python列表、元组或集合转换为RDD,从而实现并行化处理.该方法的基本格式如下.parallelize(c,numSlices)其中,参数的含义如下。(l)c:要并行化的数据集合,该集合可以是Python列表、元组或集合。(2)n
11、umSlices(可选):分区数,若不设置分区数,则RDD的分区数默认为该程序分配到的资源的CPU核心数。【教师】通过例子,帮助学生掌握集合并行化创建RDD的方法【例2-1使用PaHleHZeo方法创建RDD,然后输出RDD的元素和默认分区数,如图2-6所示。# 进入pyspark交互式执行环境hadoop(bogon$pyspark# 使用ParalIeliZeO创建RDDrdd=sc.arallelize(1,2,3,4,5)# 输出RDD的元素rdd.collect()# 查看RDD默认分区数rdd.getNumPartitions()rdd.collect()1,2,3,4,5)AAA
12、rdd.getNumPartitions()4图2-6RDD的元素和默认分区数【小提示】上述代码中使用了Spark提供的SparkContext对象,名称为sc该SparkContext对象是PySPark启动时自动创建的,在交互式执行环境中可以直接使用。代码中使用的行动操作方法将在后面小节中详细介绍。2.读取外部存储系统的数据创建RDD外部存储系统包括本地文件系统、Hadoop分布式文件系统(Hadoopdistributedfilesystem,HDFS),以及Hadoop支持的其他文件系统.在Spark中,使用SparkContext对象的IeXtFiIeo方法可以从外部存储系统中读取不
13、同格式文件中的数据创建RDD0该方法的基本格式如下。textFile(name.minPartitions,use-unicode)其中,参数的含义如下.(1)name:要读取的数据文件的路径。(2)minPartitions(可选):建议生成的RDD的最小分区数。(3)use_unicode(可选):是否在读取文件时使用Unicode编码。默认值为True,表示使用Unicode编码解析文本文件;如果设置为False,则使用其他编码(如UTF-8)来处理文本数据。【教师】通过例子,帮助学生掌握通过读取外部存储系统的数据创建RDD的方法【例2-2本地文件系统中存放一个usrIOCaI/sapr
14、k/mycode/hello_spark.txt”文件,该文件包含两句话,分别是“HeIIoSpark”和,IloveSparkf,0使用textFile()方法读取本地文件系统中文本文件的数据创建RDD,然后输出RDD的元素,如图2-7所示。(hadoop(bogon$pyspark# 读取本地文件创建RDD# words=sc.textFile(file:/usr/local/spark/mycode/hello_spark.txt,)# 输出RDD的元素words.fbreach(print)words,foreach(print)HelloSparkIloveSpark图2-7输出RD
15、D(words)的元素【小提示】新建heHo_spark.ixt文件,并将内容输入文件中。读取本地文件数据时需要在文件路径前面加上file:/【例2-3在HDFS中创建“ZheHosparlUxt”文件,该文件包含两句话,分别是HeHoSpark”和oIloveSpark”o使用textFile()方法读取HDFS中的文本文件创建RDD,然后输出RDD中的元素,如图2-8所示。# 启动Hadoophadoop()bogon-Cdusrlocalhadoosbinhadoopbogonsbin$./start-dfs.sh科在HDFS中创建hellospark.ixt文件|hadoopbogonsbin!$echo-eHelloSparknIloveSparkhadoopfs-put-/hellospark.txthadoop(3)bogon$pyspark# 读取HDFS中的文本文件创建RDD