标签:数据类型 tran 提高 默认 时间 组织 文件名 数据库 nutch
大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 [1]
在维克托·迈尔-舍恩伯格及肯尼斯·库克耶编写的《大数据时代》 [2] 中大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。大数据的5V特点(IBM提出):Volume(大量)、Velocity(高速)、Variety(多样)、Value(低价值密度)、Veracity(真实性)。
Hadoop
Hadoop是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。
[1] Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,可以以流的形式访问(streaming access)文件系统中的数据。
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算
一、Hadoop概述
Hadoop是Apache提供的开源的海量数据离线处理框架,是最知名的大数据框架之一。
最初来源于Google的三篇论文,由Apache基于论文中的原理进行了开源的实现
Google的集群系统:GFS、MapReduce、BigTable
Hadoop的集群系统:HDFS、MapReduce、HBase
其中HDFS和MapReduce组成了Hadoop,并后续在Hadoop2.0中引入了Yarn。所以目前的Hadoop由如下三个组件组成:
HDFS:Hadoop分布式文件存储系统
MapReduce:Hadoop分布式数据计算框架
Yarn:Hadoop分布式资源协调工具
**最初设计的目的:Hadoop设计的初衷是为了解决Nutch的海量数据存储和处理的需求,可以解决大数据场景下的数据存储和处理的问题。
**名字的起源: Doug Cutting如此解释Hadoop的得名:”这个名字是我孩子给一头吃饱了的棕黄色大象命名的。我的命名标准就是简短,容易发音和拼写,没有太多的意义,并且不会被用于别处。小孩子是这方面的高手。Google就是由小孩命名的。”
二、Hadoop安装配置
1.下载
Hadoop工作需要JDK的支持,请注意下载时对JDK的版本要求。
下载地址:http://hadoop.apache.org/releases.html
**Apache Hadoop版本分为两代,我们将第一代Hadoop称为Hadoop 1.0,第二代Hadoop称为Hadoop 2.0,并且互不兼容。
**第一代Hadoop包含三个大版本,分别是0.20.x,0.21.x和0.22.x,其中,0.20.x最后演化成1.0.x,变成了稳定版,而0.21.x和0.22.x则NameNode HA等新的重大特性。
**第二代Hadoop包含两个版本,分别是0.23.x和2.x,它们完全不同于Hadoop 1.0,是一套全新的架构,均包含HDFS Federation和YARN两个系统,相比于0.23.x,2.x增加了NameNode HA和Wire-compatibility两个重大特性
2.安装
Hadoop的安装分为单机方式、伪分布式方式 和 完全分布式方式。
单机模式是Hadoop的默认模式。解压即可使用单机模式。
单机模式不启动任何守护进程
无法使用hdfs和yarn,只能用来进行mr的本地测试
不能用作生产环境
伪分布模式
单机环境下启动所有的守护进程
具有hadoop的完整功能
可以使用hdfs,mapreudce和yarn
但是这些守护进程都运行在同一台机器上,并不能真正的提供性能上的提升
只能用来开发测试,不可以用在生产环境下。
完全分布模式
启动所有的守护进程
具有hadoop完整的功能
可以使用hdfs、mapreduce和yarn
并且这些守护进程运行在集群中,可以真正的利用集群提供高性能
在生产环境下使用
3.单机安装
略
4.伪分布式安装
参看:hadoop伪分布式安装配置
5.全分布式安装
略
SPARK(计算引擎)
Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark,拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是——Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同之处,这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越,换句话说,Spark 启用了内存分布数据集,除了能够提供交互式查询外,它还可以优化迭代工作负载。
Spark 是在 Scala 语言中实现的,它将 Scala 用作其应用程序框架。与 Hadoop 不同,Spark 和 Scala 能够紧密集成,其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。
尽管创建 Spark 是为了支持分布式数据集上的迭代作业,但是实际上它是对 Hadoop 的补充,可以在 Hadoop 文件系统中并行运行。通过名为 Mesos 的第三方集群框架可以支持此行为。Spark 由加州大学伯克利分校 AMP 实验室 (Algorithms, Machines, and People Lab) 开发,可用来构建大型的、低延迟的数据分析应用程序。
ETL(数据仓库技术)
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、交互转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。
ETL是构建数据仓库的重要一环,用户从数据源抽取出所需的数据,经过数据清洗,最终按照预先定义好的数据仓库模型,将数据加载到数据仓库中去。
信息是现代企业的重要资源,是企业运用科学管理、决策分析的基础。目前,大多数企业花费大量的资金和时间来构建联机事务处理OLTP的业务系统和办公自动化系统,用来记录事务处理的各种相关数据。据统计,数据量每2~3年时间就会成倍增长,这些数据蕴含着巨大的商业价值,而企业所关注的通常只占在总数据量的2%~4%左右。因此,企业仍然没有最大化地利用已存在的数据资源,以至于浪费了更多的时间和资金,也失去制定关键商业决策的最佳契机。于是,企业如何通过各种技术手段,并把数据转换为信息、知识,已经成了提高其核心竞争力的主要瓶颈。而ETL则是主要的一个技术手段。
hdfs
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点。但同时,它和其他的分布式文件系统的区别也是很明显的。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的。HDFS是Apache Hadoop Core项目的一部分。
HDFS有着高容错性(fault-tolerant)的特点,并且设计用来部署在低廉的(low-cost)硬件上。而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求(requirements)这样可以实现流的形式访问(streaming access)文件系统中的数据。
三、HDFS的概述
HDFS是Hadoop分布式文件系统,用来分布式存储海量数据,并具有高可靠 高性能 可伸缩的能力。
hdfs屏蔽了分布式存储的细节,提供了标准的访问方式,能够以类似访问本地文件系统的方式访问hdfs中的文件。
可以通过shell 或 javaapi方式操作hdfs中的数据。
四、HDFS的shell操作
hadoop fs -ls /user
hadoop fs -mkdir /user/trunk
hadoop fs -lsr /user (递归的)
hadoop fs -put test.txt /user/trunk
hadoop fs -put test.txt . (复制到hdfs当前目录下,首先要创建当前目录)
hadoop fs -get /user/trunk/test.txt . (复制到本地当前目录下)
hadoop fs -cat /user/trunk/test.txt
hadoop fs -tail /user/trunk/test.txt (查看最后1000字节)
hadoop fs -rm /user/trunk/test.txt
hadoop fs -rmdir /user/trunk
hadoop fs -help ls (查看ls命令的帮助文档)
**hdfs中的数据 一次写入 多次读取 不支持行级别的增删改
——————————————————————————————
Eclipse中Hadoop插件的使用
将插件文件hadoop-eclipse-plugin-2.7.1.jar放入eclipse/plugins目录下,重启eclipse
**当遇到权限拒绝问题时,可以修改hdfs-site.xml中的配置dfs.permissions为false关闭hadoop的权限认证
**也可以在windows的环境变量中配置HADOOP_USER_NAME指定连接hadoop时使用的名称,这种方式配置完要重启eclipse
——————————————————————————————
五、HDFS技术细节
HDFS的主要原理,是将数据进行切块后进行复制并存储在集群的多个节点中,从而实现了海量数据分布式存储,并通过副本实现了可靠性保证。
其中切出的块称为Block。
负责存放Block的节点称之为DataNode节点。
负责存放元数据的节点称之为NameNode节点。
另外还有一个独立进程称作SecondaryNameNode负责帮助NameNode进行元数据的合并操作
1.Block
HDFS中存储的基本单位。
当文件被存储到hdfs的过程中,会先将文件按照指定大小来切块即block,复制出指定数量的副本(默认是3个),分布式存储在集群中
Block 默认的大小为128(早期版本中为64)M。
将文件切块有如下几个目的:
一个大文件切分为小的若干个Block方便分布式的存储在不同磁盘中
屏蔽了数据的区别,只需要面向Block操作,从而简化存储系统。
有利于数据的复制。每次复制的是一个体积较小的Block,而不是一个大型文件,效率更高。
如果切分过后,剩余数据不够128MB,则会将剩余数据单独作为一个Block存储,数据多大,Block就多大,128MB只是最大大小,不是固定大小。
例如,一个256MB文件,共有256/128=2个Block.
一个258MB文件,共有258/128 = 2 余下2MB,则余下的2MB会独占一个Block大小为2MB,则且分出 两个128MB的Block和一个2MB的Block
一个1MB文件,则单独占用一个Block,这个Block为1MB大小。
2.DataNode
数据以Block的形式存放在DataNode中
DataNode节点会不断向NameNode节点发送心跳报告保持与其联系(3秒一次)
在心跳报告中,向NameNode报告信息,从心跳响应中接受NameNode的指令,执行对块的复制 移动 删除等操作。
NameNode如果10分钟都没收到dn的心跳,则认为该DataNode已经lost,并copy其上的block到其他dn
3.NameNode
NameNode维护着HDFS中的元数据信息,包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息,数据格式参照如下:
FileName replicas block-Ids id2host
例如: /test/a.log,3,{b1,b2},[{b1:[h0,h1,h3]},{b2:[h0,h2,h4]}]
NameNode中的元数据信息存储在内存/文件中,内存中为实时信息,文件中为数据镜像作为持久化存储使用。
其中内存中的信息包括 文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息、Block和DataNode之间的关系信息
而文件中的信息包括文件信息 目录结构信息 副本数量信息 文件和Block之间关系的信息
可以发现文件中的元数据比起内存中缺失了 blockid和datanode之间的对应关系,这是因为,hdfs集群经常发生变动,datanode变多或变少都是很正常的,因此这些信息都是临时在内存中组织的,而不会存储在磁盘镜像文件中
文件包括:
fsimage 元数据镜像文件。存储某NameNode元数据信息,并不是实时同步内存中的数据。
edits 操作日志文件
fstime 保存最近一次checkpoit的时间
当有写请求时,NameNode会首先写editlog到磁盘edits文件中,成功后才会修改内存,并向客户端返回
所以,fsimage中的数据并不是实时的数据,而是在达到条件时要和edits文件合并,合并过程需要SNN参与
4.SecondaryNameNode
SecondaryNameNode并不是NameNode的热备份,而是协助者帮助NameNode进行元数据的合并,
从另外的角度来看可以提供一定的备份功能,但并不是热备,如果直接使用可能会丢失上一次合并后发生的数据!可以从ssn中恢复部分数据,但是无法恢复全部。
何时出发数据合并?:
根据配置文件设置的时间间隔:fs.checkpoint.period 默认3600秒
根据配置文件设置的edits log大小 fs.checkpoint.size 默认64MB
合并过程(参看文档图):
达到条件后 snn会将nn中的fsimage和edits文件拷贝过来,同时nn中会创建一个新的edits.new文件,新的读写请求会写入到这个edits.new中,在snn中将拷贝过来的fsimage和edits合并为一个新的fsimage,最后snn将合并完成的fsimage文件拷贝回nn中替换之前的fsimage,nn再将edtis.new改为edits
由于NameNode实时数据都在内存中,此处的合并指的是磁盘中的持久化的数据的处理。
判断:ssn可以对元数据做一定程度的备份,但是不是热备,对不对?
思考:什么情况下可能造成NameNode元数据信息丢失?
snn并不是nn的热备,但是能保存大部分备份数据。原因就在于edits.new中的数据丢失了就找不回来了
通常NameNode和SNN要放置到不同机器中以此提升性能,并提供一定的元数据安全性。
5.Block副本放置策略:
第一个副本:放置在上传文件的DN,如果是集群就外提交,就随机选择一台磁盘不太满,cpu不太忙的节点
第二个副本:放置在第一个副本不同机架的节点上
第三个副本:放置在与第二个副本相同机架的节点上
更多副本:随机节点
**机架感知策略(参看文章)
六、HDFS执行流程(参看文档图)
1.HDFS读流程
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
NameNode会检验当前文件是否存在 以及当前客户端是否有权限读取该文件
如果都没有问题,Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block副本的DataNode地址;
客户端开发库Client会选取离客户端最接近(并不是物理上的最近,而是延迟最低负载最低)的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.
读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;
当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。
读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。
当文件最后一个块也都读取完成后,datanode会连接namenode告知关闭文件。
2.HDFS的写流程
使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;
Namenode会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会为文件创建一个记录,否则会让客户端抛出异常;
当客户端开始写入文件的时候,开发库会将文件切分成多个packets,并在内部以数据队列”data queue”的形式管理这些packets,并向Namenode申请新的blocks。,获取用来存储replicas的合适的datanodes列表, 列表的大小根据在Namenode中对replication的设置而定
开始以pipeline(管道)的形式将packet写入所 有的replicas中。客户端把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此 pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。
最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着”ack queue”,成功收到datanode返回的ack packet后会从”ack queue”移除相应的packet。
如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除, 剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持 replicas设定的数量。
当所有的packges都成功的上传后,客户端通知NameNoe文件上传完成,NameNode将该文件置为可用状态,并关闭该文件
3.HDFS的删除流程
客户端发起请求连接NameNode表示要删除文件
NameNode检查文件是否存在 及 是否有权限删除文件.
NameNode执行元数据的删除 – 将该元数据置为已删除状态。
向客户端表示文件删除成功.
当保存着这些数据块的DataNode节点向NameNode节点发送心跳时,在心跳响应中,NameNode节点会向DataNode发出指令,要求删除这些block。
DataNode收到指令后删除对应的Block
所以在执行完delete方法后的一段时间内,数据块才能被真正的删除掉。
当该文件对应的所有block及其副本都被删除后,NameNode中将之前标记为已删除的元数据删除。
4.HDFS的启动流程
在HDFS启动时,NameNode先合并fsImage和edits文件,生成新的fsimage和空的edits文件,
这个过程是NameNode自己进行的,然后再将fsimage中的数据恢复到内存中,
但此时内存中的元数据并不够,
还差block和datanode的映射关系,
这个信息在fsimage中是不存在的,需要临时在内存中组织出来。
此时NameNode等待DataNode的连接,
DataNode在启动时会向NameNode发送心跳报告,
其中携带自己具有的Block的编号信息,
NameNode基于这些信息,在内存中组织元数据信息。
直到NameNode达到最小启动条件 —
每个Block都至少有了一个副本被找到 —
后,进行必要的副本的复制和删除,
之后开始对外提供服务。整个这个过程中,
HDFS无法正常工作,称之为处在安全模式中。
**安全模式
在启动HDFS时,会立即进入安全模式,此时不能操作hdfs中的文件,只能查看目录文件名等,读写操作都不能进行。
以及在HDFS正常运行过程中,如果因为意外情况,造成有block找不到任何副本,则HDFS进入安全模式。
org.apache.hadoop.dfs.SafeModeException: Cannot delete /user/hadoop/input. Name node is in safe mode
安全模式其实是HDFS对元数据的一种保护机制,防止意外的操作损坏元数据。
当遇到安全模式,最简单的办法就是等一会。
如果很长时间都无法退出安全模式,则应检查进入安全模式的原因,找到问题的原因解决,则hadoop会自动退出安全模式。
如果非要强制退出安全模式,可以使用如下命令,但是要慎用,一不小心损坏了元数据,hdsf中的数据就都无法使用了:
hadoop dfsadmin -safemode leave
七、java接口方式操作HDFS
//导入jar
hadoop/share/hadoop/common/*.jar
hadoop/share/hadoop/common/lib/*.jar
hadoop/share/hadoop/hdfs/*.jar
//–下载
FileSystem fs = FileSystem.get(new URI(“hdfs://xxxx:9000”),new Configuration());
InputStream in = fs.open(new Path(“/xxx”));//HDFS路径
OutputStream out = ..
IOUtils.copyBytes(in,out,buffersize,close);
//–上传
InputStream in = ..
FileSystem fs = FileSystem.get(new URI(“hdfs://xxxx:9000”)new Configuration());
OutputStream out = fs.create(new Path(“…”));//hdfs路径
IOUtils.copyBytes(in,out,buffersize,close);
#问题:Permission Denied — 权限错误
FileSystem fs = FileSystem.get(new URI(“hdfs://xxxx:9000″)new Configuration(),”root”);
//–删除文件、文件夹(如果要删除的文件夹中有内容,必须选择递归删除)
boolean fs.delete(new Path(“目标hdfs路径”),是否递归删除);
//–创建文件夹
boolean fs.mkdirs(new Path(“..”));
八、HDFS的优缺点
HDFS优点
支持超大文件
支持超大文件。超大文件在这里指的是几百M,几百GB,甚至几TB大小的文件。一般来说hadoop的文件系统会存储TB级别或者PB级别的数据。所以在企业的应用中,数据节点有可能有上千个。
检测和快速应对硬件故障
在集群的环境中,硬件故障是常见的问题。因为有上千台服务器连接在一起,这样会导致高故障率。因此故障检测和自动恢复是hdfs文件系统的一个设计目标。
流式数据访问
Hdfs的数据处理规模比较大,应用一次需要访问大量的数据,同时这些应用一般都是批量处理,而不是用户交互式处理。应用程序能以流的形式访问数据集。主要的是数据的吞吐量,而不是访问速度。
简化的一致性模型
大部分hdfs操作文件时,需要一次写入,多次读取。在hdfs中,一个文件一旦经过创建、写入、关闭后,一般就不需要修改了。这样简单的一致性模型,有利于提高吞吐量。
高容错性
数据自动保存多个副本,副本丢失后自动恢复
可构建在廉价机器上
构建在廉价机器上可以轻松的通过扩展机器数量来近乎线性的提高集群存储能力
HDFS缺点
低延迟数据访问
低延迟数据。如和用户进行交互的应用,需要数据在毫秒或秒的范围内得到响应。由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟来说,不适合用hadoop来做。
大量的小文件
Hdfs支持超大的文件,是通过数据分布在数据节点,数据的元数据保存在名字节点上。名字节点的内存大小,决定了hdfs文件系统可保存的文件数量。虽然现在的系统内存都比较大,但大量的小文件还是会影响名字节点的性能。
多用户写入文件、修改文件
Hdfs的文件只能有一次写入,不支持修改和追加写入(2.0版本支持追加),也不支持修改。只有这样数据的吞吐量才能大。
不支持超强的事务
没有像关系型数据库那样,对事务有强有力的支持。
name node 命名节点
data node 数据节点
文件系统就是为了对文件进行增删改查,所建立起来的系统.并且文件系统有相应的权限,路径索引 文件大小记录等相关信息.
Apache Pig
Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口
Apache Pig 是apache平台下的一个免费开源项目,Pig为大型数据集的处理提供了更高层次的抽象,很多时候数据的处理需要多个MapReduce过程才能实现,使得数据处理过程与该模式匹配可能很困难。有了Pig就能够使用更丰富的数据结构。 [2]
Pig LatinPig Latin 是一个相对简单的语言,一条语句 就是一个操作,与数据库的表类似,可以在关系数据库中找到它(其中,元组代表行,并且每个元组都由字段组成)。
Pig 拥有大量的数据类型,不仅支持包、元组和映射等高级概念,还支持简单的数据类型,如 int、long、float、double、chararray 和 bytearray。并且,还有一套完整的比较运算符,包括使用正则表达式的丰富匹配模式
hive(数据仓库工具)
hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive 没有专门的数据格式。 Hive 可以很好的工作在 Thrift 之上,控制分隔符,也允许用户指定数据格式。
R(统计应用软件)
R是一种用于统计计算的编程语言,由奥克兰大学的Ross Ihaka 和 Robert Gentleman发明。如今被广泛地使用于统计分析、数据挖掘等方向。
MapReduce
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。概念”Map(映射)”和”Reduce(归约)”,是它们的主要思想,都是从函数式编程语言里借来的,还有从矢量编程语言里借来的特性。它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。 当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(归约)函数,用来保证所有映射的键值对中的每一个共享相同的键组。
标签:数据类型 tran 提高 默认 时间 组织 文件名 数据库 nutch
原文地址:https://www.cnblogs.com/dasiji/p/11250831.html