mapreduce编程学MapReduce先学什么好

mapreduce编程  时间:2021-07-14  阅读:()

Hadoop 请教学习顺序

我不是高手,但我可以告诉你我怎么学习。

①选择一个Hadoop的版本,然后阅读文档了解Hadoop:What's Hadoop, Why Hadoop exists;②安装Hadoop,三种方式都试下;③在Hadoop文档里面有Hadoop Command的资料,mand,mand,尽量试试这两方面的命令;④Hadoop Files,看看Hadoop文件的概念,关注它的分布式特点,然后看看Reduce函数输出的文件;⑤自己写WordCount与Advanced WordCount;⑥写HDFS io,这个例子在《Hadoop In Action》里面有,讲得也不错。

如copy,sequenceFile等;⑦写Sort程序;⑧写MRBench程序(这个网上有很多例子),了解MRBench是什么;⑨使用RandomTextWriter;10.模仿SequenceFileInputFormat、SequenceFileOutputFormat、SequenceFileRecordReader写自己的;11.yahoo有一个Hadoop的教程,英文版的,里面的内容很好;12.《hadoop权威指南》当参考书,自己实战了

mapreduce和spark的区别是什么

mapreduce 是一种编程模型, map是映射, reduce是规约。

也就是说, 有一批数据, map会将这些数据分成好多片小的数据集, 然后进行处理, 然后将所有的结果都合在一起到reduce中去处理, 只不过 spark中不需要像 hadoop中那样每次都是强制性的 mapreduce了, 而是可以灵活地 map.map.map.reduce。

如何用Spark来实现已有的MapReduce程序

本文将简要展示怎样在Spark中重现以上过程,您将发现不需要逐字翻译Mapper和Reducer!   作为元组的键值对   假定我们需要计算大文本中每一行的长度,并且报告每个长度的行数。

在HadoopMapReduce中,我们首先使用一个Mapper,生成为以行的长度作为key,1作为value的键值对。

  public class LineLengthMapper extends   Mapper<LongWritable, Text, IntWritable, IntWritable> {   @Override   protected void map(LongWritable lineNumber, Text line, Context context)   throws IOException, InterruptedException {   context.write(new IntWritable(line.getLength()), new IntWritable(1));   }   }   值得注意的是Mappers和Reducers只对键值对进行操作。

所以由TextInputFormat提供输入给LineLengthMapper,实际上也是以文本中位置为key(很少这么用,但是总是需要有东西作为Key),文本行为值的键值对。

  与之对应的Spark实现:   lines.map(line => (line.length, 1))   Spark中,输入只是String构成的RDD,而不是key-value键值对。

Spark中对key-value键值对的表示是一个Scala的元组,用(A,B)这样的语法来创建。

上面的map操作的结果是(Int,Int)元组的RDD。

当一个RDD包含很多元组,它获得了多个方法,如reduceByKey,这对再现MapReduce行为将是至关重要的。

  Reduce   reduce()与reduceBykey()   统计行的长度的键值对,需要在Reducer中对每种长度作为key,计算其行数的总和作为value。

  public class LineLengthReducer extends   Reducer<IntWritable, IntWritable, IntWritable, IntWritable> {   @Override   protected void reduce(IntWritable length, Iterable<IntWritable> counts,   Context context) throws IOException, InterruptedException {   int sum = 0;   for (IntWritable count : counts) {   sum += count.get();   }   context.write(length, new IntWritable(sum));   }   }   Spark中与上述Mapper,Reducer对应的实现只要一行代码:   val lengthCounts = lines.map(line => (line.length, 1)).reduceByKey(_ + _)   Spark的RDD API有个reduce方法,但是它会将所有key-value键值对reduce为单个value。

这并不是Hadoop MapReduce的行为,Spark中与之对应的是ReduceByKey。

  另外,Reducer的Reduce方法接收多值流,并产生0,1或多个结果。

而reduceByKey,它接受的是一个将两个值转化为一个值的函数,在这里,就是把两个数字映射到它们的和的简单加法函数。

此关联函数可以被调用者用来reduce多个值到一个值。

与Reducer方法相比,他是一个根据Key来Reduce Value的更简单而更精确的API。

  Mapper   map() 与 flatMap()   现在,考虑一个统计以大写字母开头的单词的个数的算法。

对于每行输入文本,Mapper可能产生0个,1个或多个键值对。

  public class CountUppercaseMapper extends   Mapper<LongWritable, Text, Text, IntWritable> {   @Override   protected void map(LongWritable lineNumber, Text line, Context context)   throws IOException, InterruptedException {   for (String word : line.toString().split(" ")) {   if (Character.isUpperCase(word.charAt(0))) {   context.write(new Text(word), new IntWritable(1));   }   }   }   }   Spark对应的写法:   lines.flatMap(   _.split(" ").filter(word => Character.isUpperCase(word(0))).map(word => (word,1))   )   简单的Spark map函数不适用于这种场景,因为map对于每个输入只能产生单个输出,但这个例子中一行需要产生多个输出。

所以,和MapperAPI支持的相比,Spark的map函数语义更简单,应用范围更窄。

  Spark的解决方案是首先将每行映射为一组输出值,这组值可能为空值或多值。

随后会通过flatMap函数被扁平化。

数组中的词会被过滤并被转化为函数中的元组。

这个例子中,真正模仿Mapper行为的是flatMap,而不是map。

  groupByKey()   写一个统计次数的reducer是简单的,在Spark中,reduceByKey可以被用来统计每个单词的总数。

比如出于某种原因要求输出文件中每个单词都要显示为大写字母和其数量,在MapReduce中,实现如下:   public class CountUppercaseReducer extends   Reducer<Text, IntWritable, Text, IntWritable> {   @Override   protected void reduce(Text word, Iterable<IntWritable> counts, Context context)   throws IOException, InterruptedException {   int sum = 0;   for (IntWritable count : counts) {   sum += count.get();   }   context   .write(new Text(word.toString().toUpperCase()), new IntWritable(sum));   }   }   但是redeceByKey不能单独在Spark中工作,因为他保留了原来的key。

为了在Spark中模拟,我们需要一些更像Reducer API的操作。

我们知道Reducer的reduce方法接受一个key和一组值,然后完成一组转换。

groupByKey和一个连续的map操作能够达到这样的目标:   groupByKey().map { case (word,ones) => (word.toUpperCase, ones.sum) }   groupByKey只是将某一个key的所有值收集在一起,并且不提供reduce功能。

以此为基础,任何转换都可以作用在key和一系列值上。

此处,将key转变为大写字母,将values直接求和。

  setup()和cleanup()   在MapReduce中,Mapper和Reducer可以声明一个setup方法,在处理输入之前执行,来进行分配数据库连接等昂贵资源,同时可以用cleanup函数可以释放资源。

  public class SetupCleanupMapper extends   Mapper<LongWritable, Text, Text, IntWritable> {   private Connection dbConnection;   @Override   protected void setup(Context context) {   dbConnection = ...;   }   ...   @Override   protected void cleanup(Context context) {   dbConnection.close();   }   }   Spark中的map和flatMap方法每次只能在一个input上操作,而且没有提供在转换大批值前后执行代码的方法,看起来,似乎可以直接将setup和cleanup代码放在Sparkmap函数调用之前和之后:   val dbConnection = ...   lines.map(... dbConnection.createStatement(...) ...)   dbConnection.close() // Wrong!   然而这种方法却不可行,原因在于:   · 它将对象dbConnection放在map函数的闭包中,这需要他是可序列化的(比如,通过java.io.Serializable实现)。

而数据库连接这种对象一般不能被序列化。

  · map是一种转换,而不是操作,并且拖延执行。

连接对象不能被及时关闭。

  · 即便如此,它也只能关闭driver上的连接,而不是释放被序列化拷贝版本分配的资源连接。

  事实上,map和flatMap都不是Spark中Mapper的最接近的对应函数,Spark中Mapper的最接近的对应函数是十分重要的mapPartitions()方法,这个方法能够不仅完成单值对单值的映射,也能完成一组值对另一组值的映射,很像一个批映射(bulkmap)方法。

这意味着mapPartitions()方法能够在开始时从本地分配资源,并在批映射结束时释放资源。

  添加setup方法是简单的,添加cleanup会更困难,这是由于检测转换完成仍然是困难的。

例如,这样是能工作的:   lines.mapPartitions { valueIterator =>   val dbConnection = ... // OK   val transformedIterator = valueIterator.map(... dbConnection ...)   dbConnection.close() // Still wrong! May not have evaluated iterator   transformedIterator   } 转载

MapReduce代码实现问题,能否在key值上拼接字符串显示出来

输入文件中数据进行排序。

输入文件中的每行内容均为一个数字,即一个数据。

要求在输出中每行有两个间隔的数字,其中,第一个代表原始数据在原始数据集中的位次,第二个代表原始数据。

学MapReduce先学什么好

mapreduce学习 最近写分布式操作系统作业,想写个分布式的图形学的应用,顺便学习一下mapreduce。

mapreduce适合的应用的特点是有哪些呢? 1、输入数据很大,而且与一个输出数据相关的输入数据并不是很多。

这个特点就可以将数据分布到不同的机器中去,而且由输入数据计算得到输出数据时也并不需要过多的进行交互,网络带宽不是很高。

2、输出数据之间的相关性不是很大。

如果输出数据之间的相关性很大,那么就需要采用迭代的方法,比如pagerank算法。

我本来想用mapreduce来实现最短路径算法,现在觉着这并不是个很好的实例。

使用mapreduce实现shortest path的算法是parallel bfs,这个算法会导致浪费很多扩展路径。

比如计算A到所有节点的最短路径,在某一个过程中得到B的最短距离为d,然后以后会根据这个d来对B节点进行扩展,而在后面的某步中得到B的新的距离d’,这时前面对B进行的扩展就白费了……。

所以在某些极端的情况下,mapreduce花费的时间会和dijkstra算法一样。

HostYun 新增可选洛杉矶/日本机房 全场9折月付19.8元起

关于HostYun主机商在之前也有几次分享,这个前身是我们可能熟悉的小众的HostShare商家,主要就是提供廉价主机,那时候官方还声称选择这个品牌的机器不要用于正式生产项目,如今这个品牌重新转变成Hostyun。目前提供的VPS主机包括KVM和XEN架构,数据中心可选日本、韩国、香港和美国的多个地区机房,电信双程CN2 GIA线路,香港和日本机房,均为国内直连线路,访问质量不错。今天和大家分享下...

麻花云-香港CN2云服务器,安徽BGP线路,安徽移动大带宽!全系6折!

一、麻花云官网点击直达麻花云官方网站二、活动方案优惠码:专属优惠码:F1B07B 享受85折优惠。点击访问活动链接最新活动 :五一狂欢 惠战到底 香港云主机 1.9折起香港特价体验云主机CN2 云服务器最新上线KVM架构,,默认40G SSD,+10G自带一个IPv4,免费10Gbps防御,CPU内存带宽价格购买1核1G1M19元首月链接2核2G 2M92元/3个月链接2核4G3M112元/3个月...

轻云互联-618钜惠秒杀,香港CN2大宽带KVM架构云服务器月付22元,美国圣何塞精品云月付19元爆款!海量产品好货超值促销进行中!

官方网站:点击访问青云互联活动官网优惠码:终身88折扣优惠码:WN789-2021香港测试IP:154.196.254美国测试IP:243.164.1活动方案:用户购买任意全区域云服务器月付以上享受免费更换IP服务;限美国区域云服务器凡是购买均可以提交工单定制天机防火墙高防御保护端口以及保护模式;香港区域购买季度、半年付、年付周期均可免费申请额外1IP;使用优惠码购买后续费周期终身同活动价,价格不...

mapreduce编程为你推荐
0x80070005win7系统恢复时出现0x80070005错误代码怎么办啊bloomfilter如何用Java写一个爬虫洗牌算法c语言编程用扑克牌洗牌和发牌md5值哈希值 散列值 MD5值 都是什么意思啊郭凡生慧聪的董事长是谁?跟马云比,怎么样?bindservice安卓里 remote service到底有什么用layout_gravityandroid 布局中 为什么能够通过android:layout_above 、android:layout_alignTop 、等 还要在之前加入smartuploadSmartUpload组建实现文件上传下载,我要把文件保存到项目中的某个文件夹中,该如何实现?最好有程序参考layoutsubviews如何修改TableViewCell中的ImageView的Frame和大小系统论坛怎么进论坛
重庆网站空间 域名批量查询 cn域名价格 winscp lunarpages raksmart kddi 外国空间 parseerror mysql主机 国外网站代理服务器 免费ftp空间申请 网通ip 免费申请网站 常州联通宽带 独享主机 国内域名 lamp兄弟连 googlevoice 美国十大啦 更多