MapReduce海量数据并行处理 总结.doc

上传人:laozhun 文档编号:2393821 上传时间:2023-02-17 格式:DOC 页数:82 大小:8.33MB
返回 下载 相关 举报
MapReduce海量数据并行处理 总结.doc_第1页
第1页 / 共82页
MapReduce海量数据并行处理 总结.doc_第2页
第2页 / 共82页
MapReduce海量数据并行处理 总结.doc_第3页
第3页 / 共82页
MapReduce海量数据并行处理 总结.doc_第4页
第4页 / 共82页
MapReduce海量数据并行处理 总结.doc_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《MapReduce海量数据并行处理 总结.doc》由会员分享,可在线阅读,更多相关《MapReduce海量数据并行处理 总结.doc(82页珍藏版)》请在三一办公上搜索。

1、MapReduce海量数据并行处理复习大纲Ch. 1. 并行计算技术简介1.为什么需要并行计算?提高计算机性能有哪些基本技术手段提高字长,流水线微体系结构技术,提高集成度,提升主频迫切需要发展并行计算技术的主要原因1)单处理器性能提升达到极限2)爆炸性增长的大规模数据量2)超大的计算量/计算复杂度2. 并行计算技术的分类有哪些主要的并行计算分类方法?1) 按数据和指令处理结构:弗林(Flynn)分类2)按并行类型3)按存储访问构架4)按系统类型5)按计算特征6)按并行程序设计模型/方法1)按数据和指令处理结构:弗林(Flynn)分类SISD:单指令单数据流 传统的单处理器串行处理SIMD:单指

2、令多数据流 向量机,信号处理系统MISD:多指令单数据流 很少使用MIMD:多指令多数据流 最常用,TOP500高性能计算机 基本都属于MIMD类型2) 按并行类型分类 位级并行(Bit-Level Parallelism) 指令级并行(ILP:Instruction-Level Parallelism) 线程级并行(Thread-Level Parallelism) 数据级并行:一个大的数据块划分为小块,分别由不同的处理器/线程处理 任务级并行:一个大的计算任务划分为子任务分别由不同的处理器/线程来处理3) 按存储访问结构分类A.共享内存(Shared Memory) 所有处理器通过总线共享

3、内存 多核处理器,SMP 也称为UMA结构 (Uniform Memory Access)B. 分布共享存储体系结构 各个处理器有本地存储器 同时再共享一个全局的存储器C. 分布式内存(Distributed Memory) 各个处理器使用本地独立的存储器 B和C也统称为NUMA结构 (Non-Uniform Memory Access)4)按系统类型分类 多核/众核并行计算系统MC(Multicore/Manycore) 或Chip-level multiprocessing, CMP 对称多处理系统SMP(Symmetric Multiprocessing) 多个相同类型处理器通过总线连接

4、并共享存储器 大规模并行处理MPP(Massive Parallel Processing) 专用内联网连接一组处理器形成的一个计算系统 集群(Cluster) 网络连接的一组商品计算机构成的计算系统 网格(Grid) 用网络连接远距离分布的一组异构计算机构成的计算系统5)按并行程序设计模型/方法分类共享内存变量 (Shared Memory Variables) 消息传递方式(Message Passing)MapReduce方式3.并行计算的主要技术问题并行计算有哪些方面的主要技术问题?多核/多处理器网络互连结构技术存储访问体系结构分布式数据与文件管理并行计算任务分解与算法设计并行程序设计

5、模型和方法数据同步访问和通信控制可靠性设计与容错技术并行计算软件框架平台系统性能评价和程序并行度评估如何评估程序的可并行度(Amdahl定律)程序能得到多大并行加速依赖于该程序有多少可并行计算的比例。经典的程序并行加速评估公式Amdahl定律: 其中,S是加速比,P是程序可并行比例,N是处理器数目根据Amdahl定律:一个并行程序可加速程度是有限制的,并非可无限加速,并非处理器越多越好并行比例vs加速比50%=最大2倍75%=最大4倍90%=最大10倍95%=最大20倍4.MPI并行程序设计Message Passing Interface,基于消息传递的高性能并行计算编程接口5.什么是Map

6、Reduce概念MapReduce是面向大规模数据并行处理的:(1)基于集群的高性能并行计算平台(Cluster Infrastructure),(硬件层) 允许用市场上现成的普通PC或性能较高的刀架或机架式服务器,构成一个包含数千个节点的分布式并行计算集群(2)并行程序开发与运行框架(Software Framework) (逻辑层)系统自动提供了一个庞大但设计精良的并行计算软件构架,能自动完成计算任务的并行化处理,自动划分计算数据和计算任务,在集群节点上自动分配和执行子任务以及收集计算结果,将数据分布存储、数据通信、容错处理等并行计算中的很多复杂细节交由系统负责处理,大大减少了软件开发人员

7、的负担(3)并行程序设计模型与方法(Programming Model & Methodology) (用户层) 借助于函数式Lisp语言中的设计思想,提供了一种简便的并行程序设计方法,用Map和Reduce两个函数编程实现基本的并行计算任务,提供了完整的并行编程接口,完成大规模数据处理6.为什么MapReduce如此重要?1)高效的大规模数据处理方法2)第一个不同于冯诺依曼结构的、基于集群而非单机的计算方式的重大突破3)目前为止最为成功的基于大规模计算资源的并行计算抽象方法CH.2. MapReduce简介1. MapReduce的基本模型和处理思想1) 对大数据分而治之;2) 构建抽象模型

8、-Map和Reduce,用户仅需要描述做什么,不需要关心怎么做3) 提供统一的构架并完成以下的主要功能任务调度数据/代码互定位出错处理分布式数据文件管理Combiner和Partitioner(设计目的和作用)2. Combiner和Partitioner设计目的和作用带宽优化(Combiner的设计目的和作用),不会改变key-value的形式用数据分区解决数据相关性问题(Partitioner的设计目的和作用)例如:有一个巨大的数组,其最终结果需要排序,每个Map节点数据处理好后,为了避免在每个Reduce节点本地排序完成后还需要进行全局排序,我们可以使用一个分区策略如:(d%R),d为数

9、据大小,R为Reduce节点的个数,则可根据数据的大小将其划分到指定数据范围的Reduce节点上,每个Reduce将本地数据拍好序后即为最终结果Ch.3. Google /Hadoop MapReduce基本构架1. Google MapReduce的基本工作原理1)Google MapReduce并行处理的基本过程1. 有一个待处理的大数据,被划分为大小相同的数据块(如64MB),及与此相应的用户作业程序2. 系统中有一个负责调度的主节点(Master),以及数据Map和Reduce工作节点(Worker)3. 用户作业程序提交给主节点4. 主节点为作业程序寻找和配备可用的Map节点,并将程

10、序传送给map节点 5. 主节点也为作业程序寻找和配备可用的Reduce节点,并将程序传送给Reduce节点 6. 主节点启动每个Map节点执行程序,每个map节点尽可能读取本地或本机架的数据进行计算 7. 每个Map节点处理读取的数据块,并做一些数据整理工作(combining, sorting等)并将中间结果存放在本地;同时通知主节点计算任务完成并告知中间结果数据存储位置 8. 主节点等所有Map节点计算完成后,开始启动Reduce节点运行;Reduce节点从主节点所掌握的中间结果数据位置信息,远程读取这些数据9. Reduce节点计算结果汇总输出到一个结果文件即获得整个处理结果2) 失效

11、处理主节点失效主节点中会周期性地设置检查点(checkpoint),检查整个计算作业的执行情况,一旦某个任务失效,可以从最近有效的检查点开始重新执行,避免从头开始计算的时间浪费,主节点采用热备。工作节点失效工作节点失效是很普遍发生的,主节点会周期性地给工作节点发送检测命令,如果工作节点没有回应,这认为该工作节点失效,主节点将终止该工作节点的任务并把失效的任务重新调度到其它工作节点上重新执行。3)计算优化问题如果有一个计算量大、或者由于某个问题导致很慢结束的Map节点,则会成为严重的“拖后腿者”。解决方案把一个Map计算任务让多个Map节点同时做,取最快完成者的计算结果2. 分布式文件系统GFS

12、的基本工作原理1) Google GFS的基本设计原则廉价本地磁盘分布存储多数据自动备份解决可靠性为上层的MapReduce计算框架提供支撑2) Google GFS的基本构架和工作原理GFS MasterMaster上保存了GFS文件系统的三种元数据 :命名空间(Name Space),即整个分布式文件系统的目录结构 Chunk与文件名的映射表Chunk副本的位置信息,每一个Chunk默认有3个副本前两种元数据可通过操作日志提供容错处理能力;第3个元数据直接保存在ChunkServer上, Master 启动或Chunk Server注册时自动完成在Chunk Server上元数据的生成;因

13、此,当Master失效时,只要ChunkServer数据保存完好,可迅速恢复Master上的元数据。GFS ChunkServer 即用来保存大量实际数据的数据服务器。GFS中每个数据块划分默认为64MB,这是因为处理的文件都比较大,所以设置成64MB比较合理每个数据块会分别在3个(缺省情况下)不同的地方复制副本;对每一个数据块,仅当3个副本都更新成功时,才认为数据保存成功。当某个副本失效时,Master会自动将正确的副本数据进行复制以保证足够的副本数GFS上存储的数据块副本,在物理上以一个本地的Linux操作系统的文件形式存储,每一个数据块再划分为64KB的子块,每个子快有一个32位的校验和

14、,读数据时会检查校验和以保证使用为有效的数据。数据访问工作过程1. 在程序运行前,数据已经存储在GFS文件系统中;程序实行时应用程序会告诉GFS Server所要访问的文件名或者数据块索引是什么2. GFS Server根据文件名会数据块索引在其文件目录空间中查找和定位该文件或数据块,并找数据块在具体哪些ChunkServer上;将这些位置信息回送给应用程序3. 应用程序根据GFSServer返回的具体Chunk数据块位置信息,直接访问相应的Chunk Server优点:并发访问,解决mater拥堵。3.分布式结构化数据表BigTable1) BigTable设计动机和目标需要存储管理海量的结

15、构化半结构化数据海量的服务请求商用数据库无法适用2)目标广泛的适用性:为一系列服务和应用而设计的数据存储系统,可满足对不同类型数据的存储和操作需求很强的可扩展性:根据需要可随时自动加入或撤销服务器节点高吞吐量数据访问:提供P级数据存储能力,每秒数百万次的访问请求高可用性和容错性:保证系统在各种情况下度能正常运转,服务不中断自动管理能力:自动加入和撤销服务器,自动负载平衡简单性:系统设计尽量简单以减少复杂性和出错率2) BigTable数据模型多维表通过行、列、时间戳一个行关键字(row key)一个列关键字(column key)一个时间戳(time stamp)进行索引和查询定位的。行:列:

16、时间戳:3) BigTable基本构架主服务器新子表分配子表监控:通过Chubby完成。负债均衡:子表服务器负载均衡操作Index64K block64K block64K blockSSTable子表服务器BigTable中的数据都以子表形式保存在子表服务器上,客户端程序也直接和子表服务器通信。子表的基本存储结构SSTable,一个SSTable实际上对应于GFS中的一个64MB的数据块(Chunk),SSTable中的数据进一步划分为64KB的子块。一个子表服务器上的子表将进一步由很多个SSTAble构成,每个SSTable构成最终的在底层GFS中的存储单位。一个SSTable还可以为不同

17、的子表所共享,以避免同样数据的重复存储。子表寻址 子表地址以3级B+树形式进行索引;首先从Chubby服务器中取得根子表,由根子表找到二级索引子表,最后获取最终的SSTable的位置4. Hadoop 分布式文件系统HDFS1)HDFS基本构架2) HDFS数据分布设计多副本数据块形式存储,按照块的方式随机选择存储节点,默认副本数目是33) HDFS可靠性与出错恢复DataNode节点的检测心跳:NameNode 不断检测DataNode是否有效若失效,则寻找新的节点替代,将失效节点数据重新分布集群负载均衡数据一致性: 校验和checksum主节点元数据失效Multiple FsImage a

18、nd EditLogCheckpoint5. Hadoop MapReduce的基本工作原理1) Hadoop MapReduce基本构架与工作过程Hadoop MapReduce基本工作过程1、运行作业2、获取作业ID3、复制作业资源job.xml:作业配置,例如Mapper, Combiner, Reducer的类型,输入输出格式的类型等。job.jar: jar包,里面包含了执行此任务需要的各种类,比如Mapper,Reducer等实现。job.split:文件分块的相关信息,比如有数据分多少个块,块的大小(默认64m)等。4、提交作业调用JobTracker对象的submitJob()

19、方法来提交作业.JobTracker会把将jobid放入TaskScheduler变量中,然后以FIFO的方式进行调度。当客户作业被调度时,JobTracker会创建一个对象JobInProgress,将有关此作也的任务和记录信息封装其中,以便跟踪任务的状态和进进程信息。5、作业初始化从HDFS中读取要执行的作业所对应的job.split,为初始化map任务的分配做好准备。创建map 任务和reduce任务. TaskTracker和JobTracker之间通过心跳机制来进行通信。 TaskTracker首先将自身的状态发送到JobTracker,并根据自身条件选择是向JobTracker请求

20、新的Task。JobTracker接收到TaskTracker的心跳后,如果发现TaskTracker在请求新的task,那么任务调度器就会将任务和任务信息封装起来,返回给TaskTracker。当TaskTracker从JobTracker返回的心跳信息中获取新的任务信息时,它会将map 任务或者reduce 任务加入到对应的任务槽中。6、执行作业1.将job.split拷贝到本地;2. 将job.jar拷贝到本地; 3. 将job的配置信息写入job.xml; 4. 创建本地目录,解压job.jar; 5. 调用lunchTaskForJob()方法发布任务7、结果输出对于执行的任务,所有

21、TaskTracker任务的执行进度信息都会汇总到JobTracker中,当JobTracker接收到最后一个任务的已完成通知后,便把作业状态设置为“成功” ,同时JobClient也会收到任务成功完成的通知,至此一个MapReduce任务就结束了。2) Hadoop MapReduce主要组件文件输入格式InputFormat定义了数据文件如何分割和读取,InputFile提供了以下一些功能:选择文件或者其它对象,用来作为输入定义InputSplits,将一个文件分开成为任务为RecordReader提供一个工厂,用来读取这个文件有一个抽象的类FileInputFormat,所有的输入格式类

22、都从这个类继承这个类的功能以及特性。当启动一个Hadoop任务的时候,一个输入文件所在的目录被输入到FileInputFormat对象中。FileInputFormat从这个目录中读取所有文件。然后FileInputFormat将这些文件分割为一个或者多个InputSplits。通过在JobConf对象上设置JobConf.setInputFormat设置文件输入的格式。输入数据分块InputSplitsInputSplit定义了输入到单个Map任务的输入数据一个MapReduce程序被统称为一个Job,可能有上百个任务构成InputSplit将文件分为64MB的大小,配置文件hadoop-s

23、ite.xml中的mapred.min.split.size参数控制这个大小mapred.tasktracker.map.taks.maximum用来控制某一个节点上所有map任务的最大数目数据记录读入RecordReaderInputSplit定义了一项工作的大小,但是没有定义如何读取数据RecordReader实际上定义了如何从数据上转化为一个(key,value)对的详细方法,并将数据输出到Mapper类中TextInputFormat提供了LineRecordReader,读入一个文本行记录数据。Mapper每一个Mapper类的实例生成了一个Java进程(在某一个InputSplit

24、上执行)有两个额外的参数OutputCollector以及Reporter,前者用来收集中间结果,后者用来获得环境参数以及设置当前执行的状态。现在的版本用Mapper.Context提供给每一个Mapper函数,用来提供上面两个对象的功能Combiner合并相同key的键值对,减少partitioner时候的数据通信开销conf.setCombinerClass(Reduce.class);是在本地执行的一个Reducer,满足一定的条件才能够执行。Partitioner & Shuffle在Map工作完成之后,每一个 Map函数会将结果传到对应的Reducer所在的节点,此时,用户可以提供一

25、个Partitioner类,用来决定一个给定的(key,value)对传输的具体位置。Sort传输到每一个节点上的所有的Reduce函数接收到得Key,value对会被Hadoop自动排序(即Map生成的结果传送到某一个节点的时候,会被自动排序)Reducer做用户定义的Reduce操作接收到一个OutputCollector的类作为输出最新的编程接口是Reducer.Context文件输出格式OutputFormat写入到HDFS的所有OutputFormat都继承自FileOutputFormat每一个Reducer都写一个文件到一个共同的输出目录,文件名是part-nnnnn,其中nnn

26、nn是与每一个reducer相关的一个号(partition id)FileOutputFormat.setOutputPath()JobConf.setOutputFormat()RecordWriterTextOutputFormat实现了缺省的LineRecordWriter,以”key,value”形式输出一行结果。3) 容错处理与计算性能优化由Hadoop系统自己解决主要方法是将失败的任务进行再次执行TaskTracker会把状态信息汇报给JobTracker,最终由JobTracker决定重新执行哪一个任务为了加快执行的速度,Hadoop也会自动重复执行同一个任务,以最先执行成功的

27、为准(投机执行)mapred.map.tasks.speculative.executionmapred.reduce.tasks.speculative.execution6. Hadoop 分布式文件系统HDFS编程FileSystem基类FileSystem是一个用来与文件系统交互的抽象类,可以通过实现FileSystem的子类来处理具体的文件系统,比如HDFS或者其它文件系统通过factory方法FileSystem.get(Configuration conf)获得所需的文件系统实例Configuration conf = new Configuration();FileSystem

28、hdfs= FileSystem.get(conf);Hadoop中,使用Path类的对象来编码目录或者文件的路径,使用FileStatus类来存放目录和文件的信息。创建文件create方法有很多种定义形式,但一般仅需使用简单的几种public FSDataOutputStreamcreate(Pathf);public FSDataOutputStreamcreate(Pathf,booleanoverwrite);public FSDataOutputStreamcreate(Pathf,booleanoverwrite,intbufferSize);打开文件FileSystem.open

29、方法有2个,参数最多的一个定义如下:public abstract FSDataInputStreamopen(Path f,intbufferSize)throws IOExceptionf: 文件名buffersize:文件缓存大小。默认值:Configuration中io.file.buffer.size的值,如果Configuration中未显式设置该值则是4096。获取文件信息FileSystem.getFileStatus方法格式如下:public abstract FileStatusgetFileStatus(Path f) throws IOException;返回一个Fil

30、eStatus对象。FileStatus保存文件的很多信息,包括:path:文件路径length:文件长度isDir:是否为目录block_replication: 数据块副本因子blockSize:文件长度(数据块数)modification_time: 最近一次修改时间access_time: 最近一次访问时间owner:文件所属用户group:文件所属组如果想了解文件的这些信息,可以在获得文件的FileStatus实例之后,调用相应的getXXX方法(比如,FileStatus.getModificationTime()获得最近修改时间)获取目录信息获取目录信息,不仅是目录本身,还有目录

31、之下的文件和子目录信息:public FileStatus listStatus(Pathf) throws IOException;如果f是目录,那么将目录之下的每个目录或文件信息保存在FileStatus数组中返回。如果f是文件,和getFileStatus功能一致。另外,listStatus还有参数为Path的版本的接口定义以及参数带路径过滤器PathFilter的接口定义,参数为Path的listStatus就是对这个数组中的每个path都调用上面的参数为Path的listStatus。参数中的PathFilter则是一个接口,实现接口的accept方法可以自定义文件过滤规则。文件读取

32、调用open打开文件之后,使用了一个FSDataInputStream对象来负责数据的读取。通过FSDataInputStream进行文件读取时,提供的API就是FSDataInputStream.read方法:public intread(longposition, bytebuffer,intoffset, intlength) throws IOException从文件的指定位置position开始,读取最多length字节的数据,保存到buffer中从offset个元素开始的空间中;返回值为实际读取的字节数。此函数不改变文件当前offset值。但使用更多的还有一种简化版本:public

33、 final intread(byteb)throws IOException从文件当前位置读取最多长度为b.len的数据保存到b中,返回值为实际读取的字节数。文件写入从接口定义可以看出,调用create创建文件以后,使用了一个FSDataOutputStream对象来负责数据的写入。通过FSDataOutputStream进行文件写入时,最常用的API就是write方法:public void write(byte b,int off,int len)throws IOException函数的意义是:将b中从off开始的最多len个字节的数据写入文件当前位置。返回值为实际写入的字节数。关闭关

34、闭为打开的逆过程,FileSystem.close定义如下:public void close()throws IOException不需要其它操作而关闭文件。释放所有持有的锁。删除public abstract booleandelete(Path f,boolean recursive)throws IOExceptionf: 待删除文件名recursive:如果recursive为true,并且f是目录,那么会递归删除f下所有文件。f是文件的话,recursive为true还是false无影响。另外,类似Java中File的接口DeleteOnExit,如果某些文件需要删除,但是当前不能

35、被删;或者说当时删除代价太大,想留到退出时再删除的话,FileSystem中也提供了一个deleteOnExit接口:public booleandeleteOnExit(Pathf) throws IOException标记文件f,当文件系统关闭时才真正删除此文件,但是这个文件f必须存在。Ch.5. MapReduce算法设计1. MapReduce可解决哪些算法问题?MapReduce可广泛应用于搜索引擎(文档倒排索引,网页链接图分析与页面排序等)、Web日志分析、文档分析处理、机器学习、机器翻译等各种大规模数据并行计算应用领域各类大规模数据并行处理算法。2. MapReduce排序算法3

36、. MapReduce单词同现分析算法语料we are not whatwe want to bebut at leastwe are not whatwe used to beafter map(, 1)(, 1)(, 1)(, 1)(, 1)(, 1)(,1)(,1)(,1)(,1)(,1)(,1)(,1)(,1)after shuffle and sort(,1,1)(,1,1)(,1,1)(,1)(,1)(,1,1)(, 1)(, 1)(, 1)(, 1)after reduce(,2)(,2)(,2)(,1)(,1)(,2)(,1)(,1)(,1)(,1)4. 文档倒排索引算法改进:

37、map输出的key除了文件名,还给出了该词所在行的偏移值:格式:filename#offsetMapper:Text fileName_lineOffset= new Text(fileName+”#”+key.toString();StringTokenizeritr= new StringTokenizer(value.toString();for(; itr.hasMoreTokens(); ) word.set(itr.nextToken();context.write(word, fileName_lineOffset);Reducerprotected void reduce(Te

38、xt key, Iterable values, Context context)throws IOException, InterruptedExceptionIterator it = values.iterator();StringBuilderall = new StringBuilder();if(it.hasNext() all.append(it.next().toString();for(; it.hasNext(); ) all.append(“;);all.append(it.next().toString();context.write(key, new Text(all

39、.toString(); /最终输出键值对示例:(“fish, “doc1#0; doc1#8;doc2#0;doc2#8 )5. 专利文献数据分析Patent description data set “apat63_99.txt” “PATENT”,”GYEAR”,”GDATE”,”APPYEAR”,”COUNTRY”, ”POSTATE”,”ASSIGNEE”, ”ASSCODE”,”CLAIMS”,”NCLASS”,”CAT”,”SUBCAT”,”CMADE”,”CRECEIVE”, ”RATIOCIT”,”GENERAL”,”ORIGINAL”,”FWDAPLAG”,”BCKGTLA

40、G”,”SELFCTUB”, ”SELFCTLB”,”SECDUPBD”,”SECDLWBD”3070801,1963,1096,”BE”,”,1,269,6,69,1,0,3070802,1963,1096,”US”,”TX”,1,2,6,63,0,3070803,1963,1096,”US”,”IL”,1,2,6,63,9,0.3704,3070804,1963,1096,”US”,”OH”,1,2,6,63,3,0.6667,3070805,1963,1096,”US”,”CA”,1,2,6,63,1,0,public void map(LongWritable key, Text va

41、lue, Context context)throws IOException, InterruptedException / 输入key: 行偏移值;value: “citing专利号, cited专利号” 数据对String citation = value.toString().split(“,”);context.write(new Text(citation1), new Text(citation0); / 输出key: cited 专利号;value: citing专利号public void reduce(Text key, Iterable values, Context c

42、ontext)throws IOException, InterruptedException String csv = “”;for (Text val:values) if (csv.length() 0) csv += “,”; csv += val.toString();context.write(key, new Text(csv); / 输出key: cited专利号;value: “citing专利号1, cited专利号2,” 专利被引次数直方图统计直接用Hadoop内置的KeyValue文本输入格式读取以key-value对形式保存的专利被引次数统计输出结果job.setIn

43、putFormat(KeyValueTextInputFormat.class);年份/国家专利数统计Patent description data set “apat63_99.txt”“PATENT”,”GYEAR”,”GDATE”,”APPYEAR”,”COUNTRY”, ”POSTATE”,”ASSIGNEE”, ”ASSCODE”,”CLAIMS”,”NCLASS”,”CAT”,”SUBCAT”,”CMADE”,”CRECEIVE”, ”RATIOCIT”,”GENERAL”,”ORIGINAL”,”FWDAPLAG”,”BCKGTLAG”,”SELFCTUB”, ”SELFCTLB

44、”,”SECDUPBD”,”SECDLWBD”3070801,1963,1096,”BE”,”,1,269,6,69,1,0,3070802,1963,1096,”US”,”TX”,1,2,6,63,0,3070803,1963,1096,”US”,”IL”,1,2,6,63,9,0.3704,3070804,1963,1096,”US”,”OH”,1,2,6,63,3,0.6667,3070805,1963,1096,”US”,”CA”,1,2,6,63,1,0,主要设计思想是:分析以上的专利描述数据集,根据要统计的列名(年份或国家等),取出对应列上的年份(col_idx=1)或国家(col_idx=4),然后由Map发出(year,1)或(country,1),再由Reduce累加。年份专利统计输出每年申请美国专利的国家数统计

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号