




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spark编程进阶企业等市场主体是我国经济活动的主要参与者、就业机会的主要提供者、技术进步的主要推动者。在全面建设社会主义现代化国家新征程中,如何为企业培养急需的人才,是教育尤其是高职教育急需解决的重要问题。具体到大数据产业,通过组织相关竞赛对新人进行培养和考察无疑是一个很好的解决方案,竞赛的发展与大数据技术人才的培养是互相促进的。数据竞赛通常会作为高校推进大数据相关学科建设的重要手段,以赛促学,以赛促教,而部分企业也会通过竞赛的方式挖掘优秀人才。通过数据竞赛网站,学生可以浏览和选择合适的竞赛。数据竞赛网站的出现也意味着有相应的用户访问记录;网站运营商通过对用户访问记录的分析,可以对当前网站或竞赛项目进行合理、有效的改良,吸引更多的人参与到竞赛项目中。任务背景某竞赛网站经过几年的运营,保存了众多用户对该网站的访问日志数据。为了依据用户的历史浏览记录研究用户的兴趣爱好,改善用户体验,需要对网站用户的访问日志数据进行分析。现有一份该竞赛网站2020年5月至2021年2月的用户访问日志数据文件raceData.csv,数据字段说明如下表。任务背景字段名称说明id序号content_id网页IDuserid用户IDsessionid会话IDdate_time访问时间page_path网址网站的访问次数分布情况对网站运营商来说是非常重要的指标之一,因此需要针对网站的用户访问日志数据,统计竞赛网站每月的访问量。考虑到网站的用户访问日志数据的数据规模非常庞大,使用一般的数据分析工具处理这些数据的效率很低,因此将使用Spark框架对网站的用户访问日志数据进行统计分析,并且为了模拟真实的生产环境,将使用IntelliJIDEA工具进行Spark编程。首先介绍IntelliJIDEA工具及其Scala插件的安装过程,并介绍在IntelliJIDEA中配置Spark运行环境的过程。再详细介绍如何在开发环境中和集群环境中提交并运行Spark程序,结合竞赛网站用户访问日志数据实例,在IntelliJIDEA中进行Spark编程、实现网站的访问量统计。任务背景1统计分析竞赛网站用户访问日志数据目录搭建Spark开发环境2使用Spark框架进行数据分析需要有合适的编程环境。第3章介绍了Spark编程的基础操作,操作的过程是在spark-shell的交互式环境中进行的,这样的交互式环境会对每个指令做出反馈,适合初学者学习或调试代码时使用。而在真实的生产环境中,完成一个任务通常需要很多行代码,并且需要多个类协作才能实现,因此需要更加适合的开发环境,如IntelliJIDEA。本节的任务如下。下载并安装IntelliJIDEA。在IntelliJIDEA中安装Scala插件,添加Spark开发依赖包,配置Spark运行环境,实现Spark工程的创建。Spark程序的编写与运行。任务描述官网:/下载与安装IntelliJIDEA双击下载的安装包,在弹出的界面选择“Next”按钮设置安装目录并点击“Next”按钮下载与安装IntelliJIDEA安装IDEA步骤点击“Finish”按钮完成安装下载与安装IntelliJIDEA双击桌面生成的IntelliJIDEA图标启动IntelliJIDEA,或在“开始”菜单中,依次单击“JetBrains”→“IntelliJIDEACommunityEdition2018.3.6”启动IntelliJIDEA。下载与安装IntelliJIDEA点击左下角的“SkipAllandSetDefaults”,跳过其他设置并采用默认设置下载与安装IntelliJIDEA设置完成,出现如下所示的界面下载与安装IntelliJIDEA打开IDEA,出现如图所示界面单击右下角的“Configure”按钮选择“Plugins”选项下载与安装IntelliJIDEA打开IntelliJIDEA,打开界面右下角的“Configure”下拉列表,选择“Plugins”选项,如左图。弹出“Plugins”对话框,如右图,直接单击“Scala”下方的“Install”按钮安装Scala插件即可。Scala插件安装与使用安装完成后,单击“RestartIDE”按钮重启IntelliJIDEA。Scala插件安装与使用在“Plugins”对话框中,单击按钮,在下拉列表中选择“Installpluginfromdisk...”选项,弹出下图的界面,选择Scala插件所在路径,单击“OK”按钮进行安装。Scala插件安装与使用2.离线安装scala插件Scala插件安装完成后将出现下图的界面,单击右侧的“RestartIDE”按钮重启IntelliJIDEA。Scala插件安装与使用选择“CreateNewProject”选项,弹出“NewProject”界面。选择左侧窗格的“Scala”选项,再选择右侧项目构建工具窗格的“IDEA”选项,单击“Next”按钮进入下一步。Scala插件安装与使用3.测试Scala插件将工程名称定义为“HelloWorld”,自定义该工程存放路径,并选择工程所用JDK和ScalaSDK版本(如果没有可选择的版本,那么可以单击“Create”按钮选择,并单击“OK”按钮),单击“Finish”按钮,完成Scala工程创建。Scala插件安装与使用Scala工程创建完成后,自动进入IntelliJIDEA主界面,在左侧导航栏可以看到创建好的工程,HelloWorld工程结构如下图。Scala插件安装与使用右键单击HelloWorld工程下的src文件夹,依次选择“New”→“Package”选项,新建一个包,包名为“com.tipdm.scalaDemo”。右键单击com.tipdm.scalaDemo包,依次选择“New”→“ScalaClass”选项,在包下新建一个Scala类。Scala插件安装与使用将Scala类的类名设置为“HelloWorld”,并在“Kind”下拉列表中选择“Object”选项,单击“OK”按钮,完成Scala类的创建。在类HelloWorld中即可编写Scala程序。Scala插件安装与使用选择菜单栏中的“Run”,再依次选择“Run”→“HelloWorld”选项,若控制台输出下图的结果,则证明Scala环境的配置没有问题。Scala插件安装与使用点击菜单栏中的“File”->“ProjectStructure”,打开右上图所示的界面配置Spark运行环境1.配置Spark开发依赖包选择“Libraries”选项,单击“+”按钮,选择“Java”选项在弹出的界面中找到Spark安装目录下的jars文件夹,将整个文件夹导入,如图所示点击“OK”配置Spark运行环境任何Spark程序都是以SparkContext对象开始的,因为SparkContext是Spark应用程序的上下文和入口,无论是Scala、Python、R程序,都是通过SparkContext对象的实例来创建RDD,SparkShell中的sc就是SparkContext对象的实例。因此在实际Spark应用程序的开发中,在main方法中需要创建SparkContext对象,作为Spark应用程序的入口,并在Spark程序结束时关闭SparkContext对象。配置Spark运行环境2.编写Spark程序初始化SparkContext需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数,属性参数是一种键值对的格式,一般可以通过set(属性名,属性设置值)的方法修改属性。其中还包含了设置程序名setAppName、设置运行模式setMaster等方法。如下图所示SparkContext对象的实例创建完成后,就可以通过实例变量转化集合或者读取数据,计算过程中转化操作和行动操作的使用方法与在Shell环境中一致。配置Spark运行环境单词计数编写Spark程序(1)设置运行模式点击“Run”→“EditConfigurations...”,弹出对话框如图所示在VMoptions设置运行模式如果程序有自定义的输入参数,继续点击“Programarguments”参数值设置运行Spark程序1.开发环境下运行Spark运行模式运行Spark程序运行模式含义local使用一个工作线程在本地模式下运行Spark(即非并行)local[K]使用K个工作线程在本地模式下运行Spark(理想情况下,将K设置为机器上的内核数)local[*]在本地模式下运行Spark,工作线程与机器上的逻辑内核一样多spark://HOST:PORT连接到指定端口的Spark独立集群上,默认为7077端口mesos://HOST:PORT连接到指定端口的Mesos集群yarn根据配置的值连接到YARN集群,使用yarn-client或yarn-cluster模式--deploy-modeclient客户端运行模式--deploy-modecluster集群运行模式(2)指定Hadoop安装包的bin文件夹的路径在本地运行Spark程序时还需要指定Hadoop安装包的bin文件夹的路径,有两种方式。第一种是通过设置参数的方式进行设置,对应参数名是“hadoop.home.dir”。第二种是在Windows环境变量的Path变量中添加Hadoop安装包的bin文件夹的路径。在Hadoop安装包的bin文件夹中还需要添加几个Hadoop插件,分别是winutils.exe、winutils.pdb、libwinutils.lib、hadoop.exp、hadoop.lib、hadoop.pdb。运行Spark程序(3)设置自定义输入参数如果程序有自定义的输入参数,那么运行程序之前还需要选择菜单栏中的“Run”→“EditConfigurations...”→“Programarguments”选项进行设置。选择菜单栏中的“Run”→“Run”选项,运行“WordCount”程序即可,控制台的输出结果如下图。运行Spark程序直接在开发环境中运行Spark程序时通常选择的是本地模式。如果数据的规模比较庞大,更常用的方式还是在Spark程序开发测试完成后编译打包为Java归档(JavaArchive,JAR)包,并通过spark-submit命令提交到Spark集群环境中运行。spark-submit的脚本在Spark安装目录的/bin目录下,spark-submit是Spark为所有支持的集群管理器提供的一个提交作业的工具。Spark在/example目录下有Scala、Java、Python和R的示例程序,都可以通过spark-submit运行。运行Spark程序2.在集群环境中运行Sparkspark-submit提交JAR包到集群有一定的格式要求,需要设置一些参数,语法如下。./bin/spark-submit--class<main-class>\--master<master-url>\--deploy-mode<deploy-mode>\--conf<"key=value">\...#otheroptions<application-jar>\[application-arguments]运行Spark程序spark-submit参数解释--class:应用程序的入口点,指主程序。--master:指定要连接的集群URL。可以接收的值如表4‑3所示。--deploy-mode:是否将驱动程序部署在工作节点(cluster)或本地作为外部客户端(client)。--conf:设置任意Spark配置属性,即允许使用key=value格式设置任意的SparkConf配置选项。application-jar:包含应用程序和所有依赖关系的捆绑JAR的路径。application-arguments:传递给主类的main方法的参数。运行Spark程序程序运行模式为打包到集群中运行运行Spark程序(1)在IntelliJIDEA中打包工程(输出JAR包)选择“File”→“ProjectStructure”命令选择“Artifacts”选项选择“+”
下的“JAR”选项中的“Empty”运行Spark程序修改“Name”为自定义的JAR包的名字“word”
,双击右侧栏“HelloWorld”下的“'HelloWorld'compileoutput”,它会转移到左侧运行Spark程序(2)编译生成Artifact选择菜单栏中的“Build”→“BuildArtifacts”命令,如左图在弹出的方框(右图)中选择“word”→“build”运行Spark程序生成Artifact后,在工程目录中会有一个/out目录,可以看到生成的JAR包,如左图。在JAR包处单击右键,在弹出菜单中选择“ShowinExplorer”命令,直接到达JAR包路径下,如右图。运行Spark程序将JAR包上传到Linux的/opt目录下将Windows本地的words.txt文件也上传到/opt目录下将/opt/words.txt上传到HDFS的/user/root下运行Spark程序进入Spark安装目录的/bin目录下,使用spark-submit提交Spark程序至集群中运行。设置运行模式为集群模式,--class设置程序入口。再设置JAR包路径、输入文件路径和输出文件路径。运行Spark程序spark-submit常用的配置项运行Spark程序配置项描述--nameName设置程序名--jarsJARS添加依赖包--driver-memoryMEMDriver程序使用的内存大小--executor-memoryMEMExecutor使用的内存大小--total-executor-coresNUMExecutor使用的总内核数--executor-coresNUM每个Executor使用的内核数--num-executorsNUM启动的Executor数量spark.eventLog.dir保存日志相关信息的路径,可以是“hdfs://”开头的HDFS路径,也可以是“file://”开头的本地路径,路径均需要提前创建spark.eventLog.enabled是否开启日志记录spark.cores.max当应用程序运行在Standalone集群或粗粒度共享模式Mesos集群时,应用程序向集群(不是每台机器,而是整个集群)请求的最大CPU内核总数。如果不设置,那么对于Standalone集群将使用spark.deploy.defaultCores指定的数值,而Mesos集群将使用集群中可用的内核1统计分析竞赛网站用户访问日志数据目录搭建Spark开发环境2网站的访问量是衡量网站吸引力的重要指标,raceData.csv文件中有2020年和2021年共两个年份的数据,按年份统计竞赛网站每月的访问量,展示的结果会更加清晰,方便网站运营人员后续的分析。本节的任务如下。学习Spark的持久化(缓存)和数据分区。在IntelliJIDEA中使用Spark编程统计竞赛网站每月的访问量。按年份分区,将存储结果保存至HDFS中。任务描述由于SparkRDD是惰性求值的,因此如果需要多次使用同一个RDD,那么调用行动操作时每次都需要计算该RDD并执行它依赖的其他转换操作。在需要进行多次迭代的计算中,由于常常需要多次使用同一组数据,因此计算资源消耗会非常大,为了避免多次计算同一个RDD,可以在Spark中设置数据持久化。设置RDD持久化每个RDD一般情况下是由多个分区组成的,RDD的数据分布在多个节点中,因此Spark持久化RDD数据时,由参与计算该RDD的节点各自保存所求出的分区数据。持久化RDD后,再使用该RDD时将不需要重新计算,直接获取各分区保存好的数据即可。如果其中有一个节点因为某种原因出现故障,那么Spark不需要计算所有分区的数据,只需要重新计算丢失的分区数据即可。如果希望节点故障不影响执行速度,那么在内存充足的情况下,可以使用双副本保存的高可靠机制,当其中一个副本有分区数据丢失时,则会从另一个副本中读取数据。设置RDD持久化RDD的持久化操作有cache()和persist()两种方法。每一个RDD都可以用不同的存储级别进行保存,从而允许持久化数据集在硬盘或内存中作为序列化的Java对象,甚至跨节点复制。存储级别是通过org.apache.spark.storage.StorageLevel对象确定的。cache()方法是使用默认存储级别的快捷方法,也就是StorageLevel.MEMORY_ONLY(将反序列化的对象存入内存)设置RDD持久化设置RDD持久化org.apache.spark.storage.StorageLevel中的常用存储级别级别所需内存空间程度所需CPU计算时间程度是否在内存中是否在磁盘上备注MEMORY_ONLY高低是否数据仅保留在内存中MEMOTY_ONLY_SER低高是否数据序列化后保存在内存中MEMORY_AND_DISK高中等部分部分数据先写到内存中,内存放不下则溢写到磁盘上MEMORY_AND_DISK_SER低高部分部分序列化的数据先写到内存中,内存不足则溢写到磁盘上DISK_ONLY低高否是数据仅存在磁盘上转化一个集合为RDD,然后将RDD中的每个值都进行平方,设置存储级别为MEMORY_ONLY,通过RDD的数值计算方法分别计算平均值和求和,并输出结果。如图4-29所示,如果不持久化RDDdata,那么求和和求均值时都会对data进行计算,而持久化RDD后,只有在输出求和结果时会计算data,求均值时是直接从内存中读取数据的。设置RDD持久化SparkRDD是多个分区组成的数据集合,在分布式程序中,通信的代价是很大的,因此控制数据分区、减少网络传输是提高整体性能的一个重要的方面。只有键值对类型的RDD才能设置分区方式,非键值对类型的RDD分区的值是None。系统是根据一个针对键的函数对元素进行分区的,虽然不能控制每个键具体划分到哪个节点,但是可以控制相同的键落在同一个分区。每个RDD的分区ID范围是0~(numPartitions−1),决定这个值是属于哪个分区的,numPartitions是分区的个数。设置分区方式使用的是partitionBy()方法,需要传递一种分区方式作为参数。设置数据分区Spark的系统分区方式哈希分区(HashPartitioner),根据哈希值分区范围分区(RangePartitioner),将一定范围的数据映射到一个分区中用户也可以通过自定义分区器完成特定的分区要求。设置数据分区实现自定义分区器,需要继承org.apache.spark.Partitioner类并实现其中的3个方法。defnumPartitions:Int:这个方法返回想要创建的分区个数defgetPartition(key:Any):这个函数需要对输入的key做处理,然后返回该key的分区ID,范围一定是0~numPartitions-1。equals(other:Any):这个是Java标准的判断相等的函数,之所以要求用户实现这个函数,是因为Spark内部会比较两个RDD的分区是否一样。设置数据分区自定义一个分区器MyPartition,要求根据键的奇偶性将数据分布在两个分区中设置数据分区读取HDFS的数据user.txt,并将第一个值作为键,数据如右图。对RDD进行分区,设置分区方式为自定义的分区器MyPartition,并将结果保存到HDFS,代码如左图。设置数据分区对HelloWorld工程进行重新编译选择菜单栏中的“Build”→“BuildArtifacts”
选项选择“Rebuild”重新编译工程,生成JAR包word.jar将JAR包提交到Linux的/opt目录下后在Spark安装包的/bin目录下通过spark-submit命令运行程序设置数据分区自定义分区运行结果设置数据分区coalesce(numPartitions:Int,shuffle:Boolean=false)该函数用于将RDD进行重分区,使用HashPartitioner分区方式。第一个参数为重分区的数目;第二个为是否进行shuffle,默认为false。shuffle为false时,重设分区个数只能比RDD原有分区数小,如果要重设的分区个数大于RDD原有的分区数目,RDD的分区数将不变如果shuffle为true时,重设的分区数不管比原有的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国IT冷却系统行业市场调研分析及投资战略规划报告
- 2025年脉冲点焊机行业深度研究分析报告
- 2024-2025学年高中英语Unit4Sharing单元加餐练新人教版选修7
- 2025年可折叠电吹风项目投资可行性研究分析报告
- 2024-2025学年高中数学第三章空间向量与立体几何3.2.1用向量方法解决平行问题练习含解析新人教A版选修2-1
- 2024-2025学年高中地理第6章人类与地理环境的协调发展第2节中国的可持续发展实践练习新人教版必修2
- 2024-2025学年高中生物专题4酶的研究与应用课题2探讨加酶洗衣粉的洗涤效果练习含解析新人教版选修1
- 2025年光學打孔玻璃项目投资可行性研究分析报告
- 消毒行业五年发展洞察及发展预测分析报告
- 中国丁字裤行业投资潜力分析及行业发展趋势报告
- 装饰材料复试清单
- 有限公司事业合伙人管理办法
- 工余安健环管理制度
- 某学校食堂服务投标书
- 空调维保服务项目质量保障措施
- 《马克思主义与社会科学方法论》课后思考题答案全
- 急性心肌梗塞
- 八年级地理下期教学计划(星球地图版)
- 休闲农业与乡村旅游(课件)
- 蓝色科技风半导体产业PPT模板
- 院感手卫生培训课件
评论
0/150
提交评论