ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:786.41KB ,
资源ID:18409996      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18409996.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MapReduce实验报告Word文档格式.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MapReduce实验报告Word文档格式.docx

1、5.(选做)假设我们同时监控100个用户的心率,是否能够利用Spark的RDD的特性,并行地计算SD1和SD2?(提示:把每一个用户的心率数据作为RDD里面的一个元素,RDD中不同的元素表示不同用户的心率数据,利用map对每一个用户的心率数据进行并行分析)。请描述设计思路,并尽可能实现一个多用户心率监控的计算程序。二 题目实现第一题:本题就是利用Hadoop的MapReduce框架编写程序,计算出总测量时间和平均心跳间期,即求和与求平均,程序代码如下:package cn.ideas.item1;import java.io.DataInput;import java.io.DataOutpu

2、t;import java.io.IOException;import org.apache.hadoop.io.Writable;public class InfoBean implements Writable private double sumHeartRate; private double avgHeartRate; public double getSumHeartRate() return sumHeartRate; Override public String toString() return sumHeartRatet+this.sumHeartRate+tavgHear

3、tRatet+this.avgHeartRate; public void setSumHeartRate(double sumHeartRate) this.sumHeartRate = sumHeartRate; public double getAvgHeartRate() return avgHeartRate; public void setAvgHeartRate(double avgHeartRate) this.avgHeartRate = avgHeartRate; public void set(double sumHeartRate, double avgHeartRat

4、e) public void readFields(DataInput in) throws IOException this.sumHeartRate = in.readDouble(); this.avgHeartRate = in.readDouble(); public void write(DataOutput out) throws IOException out.writeDouble(this.sumHeartRate); out.writeDouble(this.avgHeartRate);import org.apache.hadoop.conf.Configuration

5、;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Job;import org.apache.hadoop.mapreduce.Mapper;import org.apache.hadoop.mapreduce.Reducer;import org.apache.hadoop.mapreduce.Reducer.Context;import org.apache

6、.hadoop.mapreduce.lib.input.FileInputFormat;import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class SumStep public static class SumMapper extends Mapper private Text K = new Text(); private InfoBean V = new InfoBean(); Override protected void map(LongWritable key, Text value, org

7、.apache.hadoop.mapreduce.Mapper.Context context) throws IOException, InterruptedException String line = value.toString(); double sum = Double.parseDouble(line); K.set(sum); V.set(sum,0.0); context.write(K, V); public static class SumReducer extends Reducer private InfoBean v = new InfoBean(); protec

8、ted void reduce(Text key, Iterable values, Context context) double in_sum = 0; int count = 0; for(InfoBean bean : values) in_sum += bean.getSumHeartRate(); count+; v.set(in_sum,in_sum/count); context.write(key, v); public static void main(String args) throws Exception Configuration conf = new Config

9、uration(); Job job = Job.getInstance(conf); job.setJarByClass(SumStep.class); job.setMapperClass(SumMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(InfoBean.class); FileInputFormat.setInputPaths(job, new Path(args0); job.setReducerClass(SumReducer.class); job.setOutpu

10、tKeyClass(Text.class); job.setOutputValueClass(InfoBean.class); FileOutputFormat.setOutputPath(job,new Path(args1); job.waitForCompletion(true);本题设计思路相当简单,InfoBean中封装了两个属性sumHeartRate 和avgHeartRate,分别表示了总的心率和平均心率,因为在传输过程中要保证对象是可序列化的,所以实现了Writable接口。在map中的处理,只是将读取的文本中的值进行了转型,我这里处理的是double类型,然后,将所有的键同

11、一位”sum” 以便在reduce的时候将所有的对象放在一个集合中。Reduce中实现的就是对map传过来合并后的集合进行一个遍历,累加求和,顺便用count计数,最后实现平均值的计算将程序打包后上传到linux系统,把数据上传到hdfs下,然后执行,结果如图所示:第二题:mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区,也就是把每个分区中的内容作为整体来处理的。它的函数定义为:def mapPartitionsU: ClassTag(f: IteratorT = IteratorU, preserv

12、esPartitioning: Boolean = false): RDDUf即为输入函数,它处理每个分区里面的内容。每个分区中的内容将以IteratorT传递给输入函数f,f的输出结果是IteratorU。最终的RDD由所有分区经过输入函数处理后的结果合并起来的。实验例子上述例子中的函数myfunc是把分区中一个元素和它的下一个元素组成一个Tuple。因为分区中最后一个元素没有下一个元素了,所以(3,4)和(6,7)不在结果中。mapPartitions主要是对不同分区进行处理,应用场景:当对大量数据进行处理的时候,我们一般是采用分区的手段,将分区后的数据分发到分布式系统的不同机器上,然后用

13、mapPartitions来处理不同的分区,这样效率会更加快,体现出mapPartitions的优势了。第三题:faltMap与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。举例:对原RDD中的每个元素x产生y个元素(从1到y,y为元素x的值)通过flatMap我们可以处理元素是序列的列表。将提供的函数应用于每个序列元素会返回包含原始列表所有序列内的元素的列表。例2:我们可以看到有list4的元素是两个列表。我们调用flatMap分别处理这两个列表,并用map将这两个列表的元素平方,最后的结果是一个包含所

14、有元素的平坦的列表。flatMap还可以去除无用的None,例3:总的来说,flatMap就是对序列进行处理的函数,场景大致就是上面三种情况,从上面例子可以看出,flatMap在处理序列方面是相当方便的,故用之。第四题:通过论文,我们可以得出:由论文提取公式,我们知道这是一个纯数学题了,接下来编写算法实现代码:val inFile=sc.textFile(/rate.txt)var rates=inFile. map (_. toDouble).toArrayvar length = rates.length-1var yavg=(rates.sum-rates(0)/lengthvar xa

15、vg = (rates.sum-rates(length)/lengthdef myfunc(iter: IteratorDouble,sd:Int) : Double = var SDsum=0.0; var temp=0.0; var pre= iter.next; while (iter.hasNext) var cur = iter.next; if(sd = 1) temp =(pre - cur)+(yavg - xavg); else if(sd = 2) temp =(pre + cur)-(yavg + xavg); var Xi = math.pow(temp,2)/2;

16、SDsum+=Xi; pre = cur; math.sqrt(SDsum/length)var SD1= myfunc(rates.iterator,1)var SD2= myfunc(rates.iterator,2)运行过程:实验结果:.0355*SD2 = 0.199*863102第五题:由于spark 中RDD的分布式特点,RDD的数据是分布在集群中的不同机器上,我们利用RDD来存储数据则可获取到分布式计算的优点。题目要求实现多用户的心率数据测试,而目前测试数据只有一个(不是重点,重要的是思路),我就将其复制为5份,分别命名为rate1.txt、rate2.txt、rate3.txt

17、、rate4.txt、rate5.txt,将它们上传到HDFS中,然后利用循环来读取这几个文件,将其存入Listorg.apache.spark.rdd.RDDString()中,最后利用map函数对list中的各个RDD都进行心率计算(计算逻辑是和第四题是一样的),这样便实现了多用户心率的并行计算。var listRDD = Listorg.apache.spark.rdd.RDDString();for(ivar rates=rdd.map(_.toDouble).toArray;var length=rates.length-1;var yavg=(rates.sum-rates(0)/

18、length;var xavg = (rates.sum-rates(length)/length;var SD1= myfunc(rates.iterator,1);SD1)var SD2= myfunc(rates.iterator,2);SD2)5个用户的SD1数据为:List(0.03552829191459,0.03552829191459,0.03552829191459,0.03552829191459,0.03552829191459)5个用户的SD2数据为:List(0.19914955267863102,0.19914955267863102,0.19914955267863102,0.19914955267863102,0.19914955267863102)数据都是复制第一份的,所以5个用户的结果是一样的。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1