您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据挖掘与识别 > HadoopMapReduce教程
原文地址教程[一]编辑|删除|权限设置|更多▼更多▲设置置顶推荐日志转为私密日志开心延年发表于2009年11月02日00:15阅读(10)评论(1)分类:搜索与存储权限:公开今天浏览了下hadoop的map/reduce文档,初步感觉这东西太牛逼了,听我在这里给你吹吹。你可以这样理解,假设你有很多台烂机器(假设1000台)1.利用hadoop他会帮你组装成一台超级计算机(集群),你的这台计算机是超多核的(很多个CPU),一个超级大的硬盘,而且容错和写入速度都很快。2.如果你的计算任务可以拆分,那么通过map/Reduce,他可以统一指挥你的那一帮烂机器,让一堆机器帮你一起干活(并行计算),谁干什么,负责什么,他来管理,通常处理个几T的数据,只要你有机器那就小CASE。3.hadoop要分析的数据通常都是巨大的(T级),网络I/O开销不可忽视,但分析程序通常不会很大,所以他传递的是计算方法(程序),而不是数据文件,所以每次计算在物理上都是在相近的节点上进行(同一台机器或同局域网),大大降低的IO消耗,而且计算程序如果要经常使用的话也是可以做缓存的。4.hadoop是一个分布式的文件系统,他就像一个管家,管理你数据的存放,在物理上较远的地方会分别存放(这样一是不同的地方读取数据都很快,也起到了异地容灾的作用),他会动态管理和调动你的数据节点,高强的容错处理,最大程度的降低数据丢失的风险。比较著名的应用:nutch搜索引擎的蜘蛛抓取程序,数据的存储以及pageRank(网页重要程序)计算。QQ空间的日志分析处理(PV,UV)咋样,给他吹的够牛了吧。下面是别人翻译的官方文档,经常做日志分析处理的同学可以研究下。目的这篇教程从用户的角度出发,全面地介绍了HadoopMap/Reduce框架的各个方面。先决条件请先确认Hadoop被正确安装、配置和正常运行中。更多信息见:Hadoop快速入门对初次使用者。Hadoop集群搭建对大规模分布式集群。概述HadoopMap/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。一个Map/Reduce作业(job)通常会把输入的数据集切分为若干独立的数据块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。整个框架负责任务的调度和监控,以及重新执行已经失败的任务。通常,Map/Reduce框架和分布式文件系统是运行在一组相同的节点上的,也就是说,计算节点和存储节点通常在一起。这种配置允许框架在那些已经存好数据的节点上高效地调度任务,这可以使整个集群的网络带宽被非常高效地利用。Map/Reduce框架由一个单独的masterJobTracker和每个集群节点一个slaveTaskTracker共同组成。master负责调度构成一个作业的所有任务,这些任务分布在不同的slave上,master监控它们的执行,重新执行已经失败的任务。而slave仅负责执行由master指派的任务。应用程序至少应该指明输入/输出的位置(路径),并通过实现合适的接口或抽象类提供map和reduce函数。再加上其他作业的参数,就构成了作业配置(jobconfiguration)。然后,Hadoop的jobclient提交作业(jar包/可执行程序等)和配置信息给JobTracker,后者负责分发这些软件和配置信息给slave、调度任务并监控它们的执行,同时提供状态和诊断信息给job-client。虽然Hadoop框架是用JavaTM实现的,但Map/Reduce应用程序则不一定要用Java来写。HadoopStreaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。HadoopPipes是一个与SWIG兼容的C++API(没有基于JNITM技术),它也可用于实现Map/Reduce应用程序。输入与输出Map/Reduce框架运转在key,value键值对上,也就是说,框架把作业的输入看为是一组key,value键值对,同样也产出一组key,value键值对做为作业的输出,这两组键值对的类型可能不同。框架需要对key和value的类(classes)进行序列化操作,因此,这些类需要实现Writable接口。另外,为了方便框架执行排序操作,key类必须实现WritableComparable接口。一个Map/Reduce作业的输入和输出类型如下所示:(input)k1,v1-map-k2,v2-combine-k2,v2-reduce-k3,v3(output)例子:WordCountv1.0在深入细节之前,让我们先看一个Map/Reduce的应用示例,以便对它们的工作方式有一个初步的认识。WordCount是一个简单的应用,它可以计算出指定数据集中每一个单词出现的次数。这个应用适用于单机模式,伪分布式模式或完全分布式模式三种Hadoop安装方式。源代码WordCount.java1.packageorg.myorg;2.3.importjava.io.IOException;4.importjava.util.*;5.6.importorg.apache.hadoop.fs.Path;7.importorg.apache.hadoop.conf.*;8.importorg.apache.hadoop.io.*;9.importorg.apache.hadoop.mapred.*;10.importorg.apache.hadoop.util.*;11.12.publicclassWordCount{13.14.publicstaticclassMapextendsMapReduceBaseimplementsMapperLongWritable,Text,Text,IntWritable{15.privatefinalstaticIntWritableone=newIntWritable(1);16.privateTextword=newText();17.18.publicvoidmap(LongWritablekey,Textvalue,OutputCollectorText,IntWritableoutput,Reporterreporter)throwsIOException{19.Stringline=value.toString();20.StringTokenizertokenizer=newStringTokenizer(line);21.while(tokenizer.hasMoreTokens()){22.word.set(tokenizer.nextToken());23.output.collect(word,one);24.}25.}26.}27.28.publicstaticclassReduceextendsMapReduceBaseimplementsReducerText,IntWritable,Text,IntWritable{29.publicvoidreduce(Textkey,IteratorIntWritablevalues,OutputCollectorText,IntWritableoutput,Reporterreporter)throwsIOException{30.intsum=0;31.while(values.hasNext()){32.sum+=values.next().get();33.}34.output.collect(key,newIntWritable(sum));35.}36.}37.38.publicstaticvoidmain(String[]args)throwsException{39.JobConfconf=newJobConf(WordCount.class);40.conf.setJobName(wordcount);41.42.conf.setOutputKeyClass(Text.class);43.conf.setOutputValueClass(IntWritable.class);44.45.conf.setMapperClass(Map.class);46.conf.setCombinerClass(Reduce.class);47.conf.setReducerClass(Reduce.class);48.49.conf.setInputFormat(TextInputFormat.class);50.conf.setOutputFormat(TextOutputFormat.class);51.52.FileInputFormat.setInputPaths(conf,newPath(args[0]));53.FileOutputFormat.setOutputPath(conf,newPath(args[1]));54.55.JobClient.runJob(conf);57.}58.}59.用法假设环境变量HADOOP_HOME对应安装时的根目录,HADOOP_VERSION对应Hadoop的当前安装版本,编译WordCount.java来创建jar包,可如下操作:$mkdirwordcount_classes$javac-classpath${HADOOP_HOME}/hadoop-${HADOOP_VERSION}-core.jar-dwordcount_classesWordCount.java$jar-cvf/usr/joe/wordcount.jar-Cwordcount_classes/.假设:/usr/joe/wordcount/input-是HDFS中的输入路径/usr/joe/wordcount/output-是HDFS中的输出路径用示例文本文件做为输入:$bin/hadoopdfs-ls/usr/joe/wordcount/input//usr/joe/wordcount/input/file01/usr/joe/wordcount/input/file02$bin/hadoopdfs-cat/usr/joe/wordcount/input/file01HelloWorldByeWorld$bin/hadoopdfs-cat/usr/joe/wordcount/input/file02HelloHadoopGoodbyeHadoop运行应用程序:$bin/hadoopjar/usr/joe/wordcount.jarorg.myorg.WordCount/usr/joe/wordcount/input/usr/joe/wordcount/output输出是:$bin/hadoopdfs-cat/usr/joe/wordcount/output/part-00000Bye1Goodbye1Hadoop2Hello2World2应用程序能够使用-files选项来指定一个由逗号分隔的路径列表,这些路径是task的当前工作目录。使用选项-libjars可以向map和reduce的classpath中添加jar包。使用-archives选项程序可以传递档案文件做为参数,这些档案文件会被解压并且在task的当前工作目录下会创建一个指向解压生成的目录的符号链接(以压缩包的名字命名)。有关命令行选项的更多细节请参考Commandsmanual。使用-libjars和-files运行wordcount例子:had
本文标题:HadoopMapReduce教程
链接地址:https://www.777doc.com/doc-2875808 .html