spark期末⼤作业RDD编程初级实践
1、需求描述
本次实验需要:系统:linux unbuntu14.04,处理器:⾄少需要两个处器,⼀个内核,内存:⾄少4G,硬盘空间:⼤⼩需要20GB。Hadoop:2.7.1以上版本,JDK:1.8以上版本,Spark:2.4.0以上版本,Python:3.6以上版本。
1、根据的数据分析某⼤学计算机系的成绩
(1)该系总共有多少学⽣;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少⼈选修;
(6)各门课程的平均分是多少;
(7)使⽤累加器计算共有多少⼈选了DataBase这门课。
2、编写独⽴应⽤程序实现数据去重
对于两个输⼊⽂件A和B,编写Spark独⽴应⽤程序,对两个⽂件进⾏合并,并剔除其中重复的内容,得到⼀个新⽂件C
3、编写独⽴应⽤程序实现求平均值问题
每个输⼊⽂件表⽰班级学⽣某个学科的成绩,每⾏内容由两个字段组成,第⼀个是学⽣名字,第⼆个是学⽣的成绩;编写Spark独⽴应⽤程序求出所有学⽣的平均成绩,并输出到⼀个新⽂件中
2、环境介绍
环境准备:
Hadoop下载与安装
1.
(提取码:99bg)进⼊该百度云盘链接后,到Hadoop安装⽂件hadoop-2.7.。
2、下载完后还需要配置必备⼯作才能安装hadoop。
(1)⾸先创建Hadoop⽤户,sudo useradd -m hadoop -s /bin/bash
(2)设置Hadoop⽤户密码,sudo passwd Hadoop
(3)为Hadoop⽤户增加管理员权限,sudo adduser hadoop sudo
(4)使⽤Hadoop⽤户登录后需要更新apt,sudo apt-get update
(5)安装vim,sudo apt-get install vim
(6)安装JAVA环境
sudo apt-get install openjdk-7-jre openjdk-7-jdk
(7)安装好 OpenJDK 后,需要到相应的安装路径,这个路径是⽤于配置 JAVA_HOME 环境变量的。
dpkg -L openjdk-7-jdk | grep '/bin/javac'
(8)接着需要配置⼀下 JAVA_HOME 环境变量,为⽅便,我们在 ~/.bashrc 中进⾏设置, sudo vim ~/.bashrc
(9)在⽂件最前⾯添加如下单独⼀⾏(注意 = 号前后不能有空格),将“JDK安装路径”改为上述命令得到的路径,并保存:
(10)刷新环境变量,source ~/.bashrc
(11)安装Hadoop,我们选择将 Hadoop 安装⾄ /usr/local/ 中
sudo tar -zxf ~/下载/hadoop-2.6. -C /usr/local
# 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.6.0/ ./hadoop    # 将⽂件夹名改为hadoop
sudo chown -R hadoop ./hadoop      # 修改⽂件权限
(12)Hadoop 解压后即可使⽤。输⼊如下命令来检查 Hadoop 是否可⽤,成功则会显⽰ Hadoop 版本信息:
cd /usr/local/hadoop
./bin/hadoop version
Spark的下载安装
(2)这⾥是Local模式(单机模式)的 Spark安装。我们选择Spark 1.6.2版本,并且假设当前使⽤⽤户名hadoop登录了Linux操作系统。sudo tar -zxf ~/下载/spark-1. -C /usr/local/  #解压
cd /usr/local
sudo mv ./spark-1.6.2-bin-without-hadoop/ ./spark #移动⽂件
sudo chown -R hadoop:hadoop ./spark  #此处的hadoop 为你的⽤户名授权
(3)安装后,还需要修改Spark的配置⽂件spark-env.sh
lambda编程cd /usr/local/spark
cp ./conf/plate ./conf/spark-env.sh
(4)编辑spark-env.sh⽂件(vim ./conf/spark-env.sh),在第⼀⾏添加以下配置信息:
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)
有了上⾯的配置信息以后,Spark就可以把数据存储到Hadoop分布式⽂件系统HDFS中,也可以从HDFS中读取数据。如果没有配置上⾯信息,Spark就只能读写本地数据,⽆法读写HDFS数据。配置完成后就可以直接使⽤,不需要像Hadoop运⾏启动命令。
3、数据来源描述
数据来源于期末⼤作业素材,分别是A.txt,,B.txt,,,六个⽂件,由于学校系统不⽀持双向复制粘贴(⽀持双向复制粘贴跳过),所以在windows系统中使⽤FileZilla软件传输到virtualbox虚拟机上,具体步骤如下:
1. 在虚拟机⽹络设置为桥接模式,并打开虚拟机终端输⼊ifconfig,查看本地ip并复制,如⽆请刷新⽹络重试。
2. 打开FileZilla,打开⽂件,站点管理器,新建站点,主机输⼊刚刚复制的ip地址,⽤户名输⼊hadoop,密码输⼊你虚拟机hadoop⽤
户下的密码,点击连接。
连接成功便可以传输⽂件了。
4、数据上传及上传结果查看
5、数据处理过程描述
交互式编程
1、该系总共有多少学⽣:
File(“file:///usr/local/spark/”)//获取⽂件
res = lines.map(lambda x:x.split(“,”)).map(lambda x: x[0]) //获取每⾏数据的第1列
sum = res.distinct()// distinct去重
2、该系共开设了多少门课程;
lines = sc.textFile(“file:///usr/local/spark/”) //获取⽂件
res = lines.map(lambda x:x.split(“,”)).map(lambda x:x[1]) //获取每⾏数据的第2列
dis_res = res.distinct()//distinct去重
unt()//取元素总个数8
3、Tom同学的总成绩平均分是多少;
File(“file:///usr/local/spark/”) //获取⽂件
res = lines.map(lambda x:x.split(“,”)).filter(lambda x:x[0]==”Tom”) //筛选出Tom同学的成绩信息res.foreach(print)//循环输出
score = res.map(lambda x:int(x[2]))//提取Tom同学的每门成绩,并转换为int类型
num = unt() //Tom同学选课门数
sum_score = duce(lambda x,y:x+y) //Tom同学的总成绩
avg = sum_score/num // 总成绩/门数=平均分
print(avg)//输出平均分
4、求每名同学的选修的课程门数;
File(“file:///usr/local/spark/”) //获取⽂件
res = lines.map(lambda x:x.split(“,”)).map(lambda x:(x[0],1)) //学⽣每门课程都对应(学⽣姓名,1),学⽣有n门课程则有n个(学⽣姓名,1) each_res = duceByKey(lambda x,y: x+y) //按学⽣姓名获取每个学⽣的选课总数
each_res.foreach(print)//循环输出
5、该系DataBase课程共有多少⼈选修;
File(“file:///usr/local/spark/”) //获取⽂件
res=lines.map(lambdax:x.split(“,”)).filter(lambda x:x[1]==”DataBase”)
6、各门课程的平均分是多少;
File(“file:///usr/local/spark/”) //获取⽂件
res=lines.map(lambdax:x.split(“,”)).map(lambdax:(x[1],(int(x[2]),1))) //为每门课程的分数后⾯新增⼀列1,表⽰1个学⽣选择了该课程。temp = duceByKey(lambda x,y:(x[0]+y[0],x[1]+y[1])) //按课程名聚合课程总分和选课⼈数。格式如(‘ComputerNetwork’, (7370, 142)) avg = temp.map(lambda x:(x[0], round(x[1][0]/x[1][1],2)))//课程总分/选课⼈数 = 平均分,并利⽤round(x,2)保留两位⼩数
avg.foreach(print)//循环输出
7、使⽤累加器计算共有多少⼈选了DataBase这门课。
File(“file:///usr/local/spark/”) //获取⽂件
res=lines.map(lambdax:x.split(“,”)).filter(lambda x:x[1]==”DataBase”)//筛选出选了DataBase课程的数据
accum = sc.accumulator(0) //定义⼀个从0开始的累加器accum
res.foreach(lambda x:accum.add(1))//遍历res,每扫描⼀条数据,累加器加1
accum.value //输出累加器的最终值1764
编写独⽴应⽤程序实现数据去重
1、  导⼊SparkContext包
2、  初始化SparkContext
3、  加载两个⽂件A和B
4、  使⽤union合并两个⽂件的内容
5、  使⽤distinct去重操作
6、  使⽤sortBy排序操作
7、  将结果写⼊result⽂件中,repartition(1)的作⽤是让结果合并到⼀个⽂件中,不加的话会结果写⼊到两个⽂件

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。