版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
开放Hadoop开发者的第二期继续延续着分享、自由、开放这一开源社区Hadoop应用一直是大家关注而又热衷的话题,这一期里原本打算推出Hadoop与搜索引擎这一主题,但遗憾少,难以成刊,只好作罢。从稿件质量看来,《Hado要一些更高水平的稿件,而不能仅仅局限于GettingStart的爱好者的广泛参与,我们在期待大师级文章的出现。公司的“人才猎手”Syvia,得知到业界的很多著名IT公司近几年都在本期执行主编:Barry4 11、HiveSQL手册翻译 Hadoop资讯《Hadoop开发者》Hadoop业界资讯今年1月,InfoWorld授予ApachHadoop公司创造了使用商用硬件上数千兆数据来运行大规模分析计算功能的可能性。有了Hadoop和开源NoSQL数据库来大幅度减少数据处理时会被很多用户用在开源代码的研发上。虽然这还有一段适应的过程,但行业中的很多用户看2.网友观点:SQL和关系型数据库它们并不适合云计算行的云计算重大会议之一。到目前为止,会议一个较大的议题是“不使用关系型数据库来保持数据库上对大规模数据进行操作是兵家大忌,因为在处理数据时S如果你觉得以前好像在哪里听过这种说法,那么我告诉你其实你是对的。早在上世纪90Hadoop资讯《Hadoop开发者》点故障;出身于Facebook,天生为海量数据设计;适用于大量分布式写操作;依托于一个健他关系型数据库加载数据的手段,这意味着那些潜在用户可以考虑尝试将其系统用于今天的MySQL不得不面临许多问题,它在大型应用领域的采用率较低,同时面临4.互联网两巨头PK“云计算”(声明:以上文章均来自互联网,由Barry编辑)Nutch+Hadoop构建商用分布式搜索引擎的问题探究(作者:Barry)个部分:一个分布式文件系统HDFS(HadoopDistributedF现。因此,Hadoop的目标是为开发分布式应用提供一个框架,而不是像OpenAFS,Coda那本文就作者在工作中如何改造Nutch以实现支持海量数据检索2.Nutch工作原理解释基于Nutch的分布式搜索引擎,其构架可取循环重新开始。这个循环过程可以叫做“产生/([1]/new来Index拷贝出来就可以成为独立的一个索引块,这样的索引块在作为一个检件系统中,而不是HDFS上,根据Nutch官方WIki的解释认为,是效率决定,不能将索引文3.利用Nutch构建商用分布式搜索引擎存在的问题思考笔者测试的Nutch集群构建的爬虫方式,效率不高,爬取页面的速Nutch的爬虫提供两种方式,一种是站内爬虫、一种是全网l放在每台机器提供索引服务的Local的索引每块放多大合适?如果是放几块如果上百GB的索引拷贝是非常耗时的!尤其是索引更4.基于Nutch+Hadoop构建商用分布式检索构架问题及其关键点在前文中基本进行了论述。其中设计的技术组件和程序流程见下图所述,其中Heritrix直接写外网路由器交换机B1 交换机C1交换机A1Web-1/WStore-1S-1 S-1Crawl-1/CStore-1Crawl-1/CStore-11US-3M-11US-3S-2Crawl-2/S-2Crawl-2/CStore-21U1Crawl-3/CStore-3S-3-Crawl-3/CStore-3S-3-Disk71U1US-3-Disk8M-1-S-3-Disk8Crawl-4/CStore-4Crawl-4/CStore-41US-4-Disk9S-1-Disk1US-4-Disk9爬虫集群爬虫集群S-4-Disk10S-1-S-4-Disk10S-2-Disk6S-2-S-2-Disk6索引构建与分布集群支持自定义爬虫的Nutchsegment文件存储接口改写作者:mingyuanEmail:cn.mingyuan@形式,以便利用Nutch的分布式索引构建、检索功能,从而可以实现Nutch使用的是Lucene的索引机制,关键数据存储在segment中,其余的数据皆可从(1)CreateSegment(PatharcFjob.setInputFormat(ArcInputFormat.class);//指定输入数据格式job.setMapperClass(ArcSegmentCreator.class);//MapFileOutputFormat.setOutputPath(job,newPath(segmentOutDir,segName));//输出路径job.setOutputFormat(FetcherOutputFormat.class);//输出格式job.setOutputKeyClass(Text.class);//输出的KeyClass看到,在map方法进行一系列处理之后map过程并没有结束而是交给output方法继续执行未output(output,segmentName,url,datum,null,null,CrawlDatum.STATUS_FETCH_RETRY)2修改程序为非mapreduce程序ArcSegmentCreator是针对已经抓取的数据进行批量处理的,不能满足数据即时写入的需在ArcSegmentCreator基础上修改代码比较简单,程序的输入与输出即可。流程大概是这样的:数据首先输入到map()中,然后由map()流向完成持久化操作,从而解决输出问题。需要注意的是ArcSegmentCreator使用MapRedPathseqFilePath=nPathseqSortedFilePath=newPath(filePath,"data."-outFormat","org.apache.hadoop.mapred"-outValue",valueClass.getName(),seqFilePath.toStFileSystemfs=FileSystem.get(filePath.toUri(),conf);//将SequenceFile转化为MapFileMapFile.fix(fs,contentPath,Text.clMapFile.fix(fs,fetchPath,Text.class,CrawlDatum.class,false,conf);MapFile.fix(fs,textPath,Text.MapFile.fix(fs,dataPath,Text.class,Parse4建立索引(2)根据segment生成linkdb:bin/nutchinNutch中mapreduce应用的几个特殊点author:皮冰锋email:pi.bingfeng@1.SpeculativeExecution的job如爬虫中为了保持爬虫的礼节性,不能有多个机器同时去抓取一个站点。这时就可以设臵jobjob.setSpeculativeExecution(false);Job.setMapSpeculativeExecution(false);Job.setReduceSpeculativeExecution(false);定义输出:FileOutputFormat.sNutch中Mapreduce应用的几个特殊点《Hadoop开发者》FetcherOutputFormat继承了OutputFormat接口,实现了自定义的RecordWriter,接收在publicclassFetcherOutputFormatimplementsOutputFormat<Text,NutchWritable>{publicRecordWriter<Text,NutchWritablefinalFileSystemfs,finalJobConfjob,finalStringname,finalProgressableprogress)throwsIOException{//TODOsomething}RecordWriter是我们关注的重点,在它的write函数中,成封装之前的Content,CrawlDatum,ParseImpl对象publicvoidwrite(Textkey,NutchWritablevalue)throwsIOException{Writablew=value.get();if(winstanceofCrawlDatum)fetchOut.append(key,w);elseif(winstanceofContent)contentOut.append(key,w);elseif(winstanceofParse)}这种做法比较独特,我很欣赏。如果想了解更多细节,大家可以去仔细看看拿Indexer的DeleteDuplicates类来说,它需要读取lupublicstaticclassInputFormatextendsFileInputFormat<Text,IndexDoc>{privatestaticfinallongINDEX_LENGTH=Integer.MAX_VALUE;/**Returneachindexasasplit.*/publicInputSplit[]getSplits(JobConfjob,intnumSplits)throwsIOException{FileStatus[]files=listStatus(job);for(inti=0;i<files.length;i++){FileStatuscur=files[i];splits[i]=newFileSplit(cur.getPath(),0,INDEX_LENGTH,(String[]}returnsplits;}publicclassDDRecordReaderimplementsRecordReader<Text,IndexDoc>{}InputSplit文件格式分析《Hadoop开发者》JavaRMI+Lucene构建分布式检索应用初探(作者:Barry)packagermi.test;importjava.rmi.Remote;importjava.rmi.RemoteException;importjava.util.List;/**publicinterfaceSearchInterfextendsRemote{/**publicList<NewsSearchResult>queryList(String[]fileds,String[]keywords)throwsRemoteException;}2.服务器端得检索业务实现类packagermi.test;/**importjava.io.IOException;importjava.rmi.RemoteException;importjava.util.ArrayList;importjava.util.List;publicclassSearchServiceextendsUnicastRemoteObjectimplementsSeprivatestaticfinallongserialVersionUID=-7810768762217713731L;//空的构造函数publicSearchService()throwsRe//TODOAuto-generatedconstructorstub}publicList<NewsSearchResult>queryList(String[]fields,String[]keywords)//TODOAuto-generatedmethodstubInputSplit文件格式分析《Hadoop开发者》//采用布尔检索//构建检索条件for(inti=0;i<fields.length;i++){}//初始化search//查询//TODOAuto-generatedcatchblock//TODOAuto-generatedcatchblock}//读取Hits包装检索结果ArrayList<NewsSearchReDocumentdoc=hits.doc(iStringpubtime=doc.get("pubtime");Stringtempid=doc.gnewsList.add(newNews}}}publicstaticvoidmain(String[]args){String[]fields=newString[]{"title","content"};List<NewsSearchResult>for(NewsSearchResultnewsSearc{System.out.println(newsSearchResSystem.out.println(newsSearchResult.getId());System.out.println("");}//TODOAuto-generatedcatchblock}}}3.注册RMI应用的服务器端程序InputSplit文件格式分析《Hadoop开发者》packagermi.test;/***importjavax.naming.Context;importjavax.naming.InitialContext;publicclassSimpleSearchServer{publicstaticvoidmain(String[]args){//实例化一个应用//将应用绑定到RMI的端口namingContext.rebind("rmi:SearchServicSystem.out.println("服务器注册//TODOAuto-generatedcatchblock}}}4.Client端的检索提交与实现packagermi.test;/**importjava.util.List;importjavax.naming.Context;importjavax.naming.InitialContext;importjavax.naming.NamingException;publicclassSimpleSearchClient{publicstaticvoidmain(String[]args){//声明应用的RMI服务//System.out.println("aaaaaaaa");//构建检索条件String[]fields=newString[]{"title","content"};List<NewsSearchResult>newsList=service1.quefor(NewsSearchResultnewsSe{System.out.println(newsSearchResult.getId());System.out.println(newsSearchResSystem.out.println("");{}}}catch(NamingExcept//TODOAuto-generatedcatchblock//TODOAuto-generatedcatchblockInputSplit文件格式分析《Hadoop开发者》}}}packagermi.test;importjava.io.Serializable;/**publicclassNewsSearchResultimplementsSerialprivatestaticfinallongserialVersionUID=-2685508592396115327L;privateStringid;//idprivateStringtitle;//标题privateStringsite;//站点privateStringpubtime;//发布时间privateStringsourceurl;//来源URLprivateStringcontent;//内容privateStringgenus;//分类号privateStringtempid;//分类号privateStringtype;//类型publicNewsSearchResult(){//TODOAuto-generatedconstructorstub}publicStringgetSourceurl(){}publicvoidsetSourceurl(Stringsourceurl){}}6.程序的结构7.命令行下程序的运行(一定要注意路径)classpath=".;D:\project\distributedSearch\lib\lucene-core-2.3.jar"D:\project\distributedSearch\bin>startrmiregistryD:\project\distributedSearch\bin>startjavarmi.test.SimpleSearchServerD:\project\distributedSearch\bin>javarmi.tesInputSplit文件格式分析《Hadoop开发者》一对多的表关联在Mapreduce中的应用(续)Author:皮冰锋Email:pi.bingfeng@对一”的关系。但在很多情况下,我们需要处理“一对多”的关系,即同一系列的“tradeID”product1"trade1product2"trade2product3"trade3product1"pay1product2"pay2product2"pay4product3"pay3publicclassCommonReduceextendsMapReduceB一对多表关联在MapReduce中的应用《Hadoop开发者》publicvoidreduce(TexStringtradeID="";ArrayList<String>payIDlist=newArrayList<Striwhile(values.hasNext()){Stringvalue=values.next().tvalue.length());if(value.startsWith("supid")){//istradetradeID}elseif(value.startsWith("buyid")){payIDlist.add(subValue);}}for(StringpayID:payIDlist){}}问题分析:如果数据量较小,这种实现方式不会有问题;但如果数据量偏大,payIDlistpublicclassPreMapperextendsMapReduceBasepublicvoidmap(LongWritablekey,Textv//inputfilepathStringpath=((FileSplit)reporter.geif(line.length<2){//skipbadvalue}StringproductID=line[0Textkv=newText();if(path.indexOf("action")>=0){//tradetablekr.setID(0);//用于TextPair的排序kv.set(tradeID);//va}elseif(path.indexOf("alipay")>=0){//paytablekr.setID(1);//用于TextPair的排序StringpayID=line[1];kv.set(payID);//valueispayID}}privateStringtext;privateintid;publicTextPair(){}publicTextPair(Stringtext,intid){一对多表关联在MapReduce中的应用《Hadoop开发者》}publicvoidsetText(Stringtext){}publicvoidsetID(intid){}publicvoidreadFields(DataInputin)throwsIOException{}publicvoidwrite(DataOutputout)throwsIOException{out.writeUTF(text);out.writeInt(id);}publicintcompareTo(Objecto){//先比较text,在比较idif(!this.text.equals(that.text)){}}}}publicclassCommonReduceextendsMapReduceBStringtradeId=values.next().toString();/irstvalueistradeIDwhile(values.hasNext()){//nextispayIDStringpayID=values.next().toString();output.collect(new}}publicclassJoin{publicstaticvoidmain(String[]args)throwsIOException{System.exit(-1);}StringjoinTableDir=args[2];//定义Job//addinputpath:tradetable&&paytableFileInputFormat.addInputPath(conf,newPath(tradeFileInputFormat.addInputPath(conf,newPath(payTableconf.setInputFormat(TextInconf.setReducerClass(Commconf.setOutputFormat(Te//outputFileOutputFormat.setOutputPath(conf,newPath(joinTableDJobClient.runJob(conf);一对多表关联在MapReduce中的应用《Hadoop开发者》}publicstaticclassKeyPartitioner}publicvoidconfigure(JobConfjob){}}publicstaticclassFirstComparatorextendsWritpublicFirstComparator(){//registercomparatorsuper(TextPair.class,true);}}}trade1trade2trade2trade3InputSplit文件格式分析本文将详细介绍InputSplit文件是如何产生的,以及它的二进制格式,所研究的版本是2生成过程filename:Path:filename:Path:FileSystemInputFormatInputSplitJobSubmitter:Caller(Client):FSDataOutputStream1.3.writeSplitsFileHeader1.4.writeSplitsFileBodywriteSplits1.1.getSplits1.1.1.List<InputSplit>1.2.sortsortthesplitsintoorderbasedonsize,sothat1.3.writeSplitsFileHeader1.4.writeSplitsFileBodywriteSplits1.1.getSplits1.1.1.List<InputSplit>1.2.sortsortthesplitsintoorderbasedonsize,sothatthebiggestgofirst1.3.1.getFileSystem.fs1.3.2.create(fs,filename,FsPermission).FSDataOutputStream1.3.3.write(SPLIT_FILE_HEADER)1.3.4.write(CURRENT_SPLIT_FILE_VERSION)1.3.5.write(numberofsplits)<traverseallInputSplits1.4.1.write(splitClass)1.4.2.write(sizeofsplit)1.4.3.write(dataofsplit)1.4.4.write(numberoflocations)1.4.5.write(locations)一对多表关联在MapReduce中的应用《Hadoop开发者》310org.apache.hadoop.mapred.8定88HDFS在Web开发中的应用《Hadoop开发者》HDFS在web开发中的应用使用分布式文件系统正好满足相册的技术机构。每个图片一般经过压缩后最大几M,每个图ApacheServerApacheServerApacheServerApacheServerApacheServerApacheServerApacheServer浏览器ApacheServerDataNodeDataNodeDataNodeDataNodeDataNodeDataNodeDataNodeDataNodeDataNodeStringfiledisplay=(String)request.Pathpath=newPath(filedisplay);FileSystemfs=path.getFileSystem(conf);longlength=file.getLen();BlockLocation[]blkLocations=fs.getFileBlockLocations(file,0,length);privateString[]hosts;//hostnamesofdataprivateString[]names;//hostname:portNumberofdatanodesprivateString[]topologyPaths;//fullpathnameinnetworktopologyprivatelongoffset;//offsetoftheoftheblockinthefileprivatelonglength;2结构流程浏览器浏览器6重定向1请求下载7请求 DownLoadAction2请求访问DFSServerApacheDFSClientServletApacheServerDFSClient流8请求访问DFSDataNodeDataNodeServletNameNode6重定向1请求下载7请求 DownLoadAction2请求访问DFSServerApacheDFSClientServletApacheServerDFSClient流8请求访问DFSDataNodeDataNodeServletNameNode12返回文件13返回数据流HDFS在Web开发中的应用《Hadoop开发者》Stringfiledisplay=(String)request.Pathpath=newPath(filedisplay);FileSystemfs=path.getFileSystem(conf);InputStreamins=fs.open(path);}outp.flush();}finally{}outp.close();}}Mapreduce中value集合的二次排序作者:皮冰锋email:pi.bingfeng@str22,10str39privateStringtext;privateintvalue;publicTextInt(){}publicTextInt(Stringtext,intvalue){Mapreduce中value集合的二次排序《Hadoop开发者》}publicStringgetFirst(){}publicintgetSecond(){}publicvoidreadFields(DataInputin)throwsIOException{}publicvoidwrite(DataOutputout)throwsIOException{out.writeUTF(text);out.writeInt(value);}publicintcompareTo(Tex}}<key,value>对,key,value都是Text类型。所publicvoidmap(Textkey,TextvaintintValue=Integer.TextIntti=newTextInt(key.toString(),intValue);output.collect(ti,}publicvoidreduce(TextIntkey,Iteratowhile(values.hasNext()){intvalue=values.ne}}publicTextIntComparator(){super(TextInt.class,true);//注册comparator}TextInto1=(TextInt)a;TextInto2=(TextInt)b;if(!o1.getFirst().equals(o2.getFirst()}}}Mapreduce中value集合的二次排序《Hadoop开发者》}publicTextComparator(){}TextInto1=(TextInt)a;TextInto2=(TextInt)b;}}publicstaticclassPartitionByTextimplementsPartitioner<TextpublicintgetPartition(TextIntkey,IntWritablevalue,intnumPartitions){}publicvoidconfigure(JobConfjob){}}//……defineinput&output//定义Jobconf.setJobName("sortbyval//addinputpath:FileInputFormat.addInputPath(conf,newPathconf.setInputFormat(KeyValueTextIn//outputFileOutputFormat.setOutputPath(conf,newPath(output));JobClient.runJob(conf);通过上面的job执行,在output的文件中,就能看到类似的输出结果了:把相同string的int数据分发到同一个reducer,这就是PartitionByText的作用;其次,用publicstaticclassCombinedObjectimplementsWritablprivateClass<?extendMapreduce中value集合的二次排序《Hadoop开发者》privateWritableComparablefirst;publicCombinedObject(){}thrownewIllegalArgumentExcep}first=ReflectionUtils.newInstance(firstClass,conf);}publicCombinedObject(WritsetFirst(f);}publicvoidsetFirst(WritableComparablekey){this.first=key;}publicvoidsetSecond(WritableComparablevalue){}}publicvoidreadFields(DataInputin)throwsIOStringfirstClassName=in.readUTF(conf);first=ReflectionUtils.newInstance(firstClass,conf);second=ReflectionUtils.newfirst.readFields(in);}publicvoidwrite(DataOutputout)throwsIOException{first.write(out);}publicbooleanequals(Objecto){if(oinstanceofCombinedOb}returnfalse;}publicinthashCode(){returnfirst.hashCode();}publicintcompareTo(OMapreduce中value集合的二次排序《Hadoop开发者》}}在Writable接口的write(DataOutputout)及readFields(DataInputin)函数中,需要考虑publicKeyComparator(){}}}publicKeyValueComparator(){}if(!o1.first.equals(o2.first)){}}}}publicstaticclassKeyPartitionerimplementsPartitpublicintgetPartition(CombinedObjectkey,Writablevalue,intn}publicvoidconfigure(JobConfjob){}}具体的调用方式:job.setMapperClass(ContentMapper.class);job.setMapOutputKeyClass(CombinedObject.class);//sortvaluelistjob.setOutputKeyComparatorClass(KeyValjob.setOutputValueGroupingCompjob.setPartitionerClass(KeyPartitioner.class);job.setReducerClass(SameInfoReducer.class);HiveSQL手册翻译《Hadoop开发者》HiveSQL手册翻译作者:一见余姝丹(苹果小巫女)1创建表和删除表请使用“STOREDASSEQUENCEFILE”。如果打算在Hive表中存储压缩的数据,请参考CompressedStorage。“INPHiveSQL手册翻译《Hadoop开发者》中生成架构和用其它表的属性来创建目标表,例如SeCREATETABLEpage_view(vieCREATETABLEpage_view(viewTiCREATETABLEpage_view(viewTi好的了解数据结构,同时提高了效率。如果列是列表或地图可以使用“MAPKEYS”和存储格式来创建一个新的目标表HiveSQL手册翻译《Hadoop开发者》2数据插入到追加表数据如何读取。这意味着用户必须注意正确插入数据,即减少的数量等于增加的数量,并
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中道德与法治·八年级“全民国防教育日”主题班会教学设计(2026版)
- java扫雷游戏课程设计概述
- 专题01 名句名篇默写20题(三种类型)(原卷版)-【好题汇编】备战2023-2024学年高二语文上学期期末真题分类汇编(北京专用)
- 铁路系统就业前景分析
- (三模)日照市2023级高三5月模拟考试语文试卷(含答案)
- 未来职业发展新方向
- 派出所消防安全教育实践
- 妇科常规健康宣教内容
- 护理与社区护理
- 母婴护理师新生儿护理技巧站
- 高速公路人行天桥拆除施工方案
- 美容院顾客消费记录表
- 应急宝产品培训
- 议事协商课件
- 金融知识防诈骗进校园
- 药品行政执法培训课件
- 2026年贵州省安顺市辅警招聘考试题(含答案)
- 药企化验室安全培训课件
- 船舶内装工程施工方案
- 2025中国武夷实业股份有限公司招聘1人(公共基础知识)综合能力测试题附答案
- 人教版高中英语选择性必修三词汇表(背默版)
评论
0/150
提交评论