什么是大数据?你需要知道的…..

· 通过Map、Reduce,开发人员可以创建可以并行处理大量非结构化数据的程序,这些数据可以在分布式的处理器或独立计算机上并行处理。MapReduce框架被划分为两个功能区域:    

· Map(映射),一个将工作分发到分布式集群中的不同节点的功能。  

· Reduce函数:整理工作并将结果解析成单个值的功能。  

Map、Reduce的主要优点之一是它是容错的,它通过监视集群中的每个节点来实现;每个节点都需要定期报告,完成的工作和状态更新。如果一个节点保持比预期的时间,间隔更长的时间,那么主节点将会记录并将工作分配给其他节点。  

Apache Hadoop是一种使用Map、Reduce核心的开源框架,两年后开发出来了。Hadoop最初是用来索引现在不知名的Nutch搜索引擎的,现在几乎所有主要行业都使用Hadoop来进行大范围的大数据工作。得益于Hadoop的分布式文件系统和纱线(另一个资源协商者),该软件让用户可以在数千台设备上处理大规模数据集,就好像它们都在一台巨大的机器上一样。    

Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。    

· Nutch组成:    

· 爬虫crawler和查询searcher。    

· Crawler主要用于从网络上抓取网页并为这些网页建立索引。  

· Searcher主要利用这些索引检索用户的查找关键词来产生查找结果。  

· 两者之间的接口是索引,所以除去索引部分,两者之间的耦合度很低。  

Crawler和Searcher两部分尽量分开的目的主要是为了使两部分可以分布式配置在硬件平台上,例如将Crawler和Searcher分别放在两个主机上,这样可以提升性能。  

Crawler 的重点在两个方面,Crawler的工作流程和涉及的数据文件的格式和含义。数据文件主要包括三类,分别是web database(WebDB),一系列的segment加上index,三者的物理文件分别存储在爬行结果目录下的db目录下webdb子文件夹内,segments 文件夹和index文件夹。那么三者分别存储的信息是什么呢?  

一次爬行会产生很多个segment,每个segment内存储的是爬虫Crawler在单独一次抓取循环中抓到的网页以及这些网页的索引。Crawler爬行时会根据WebDB中的link关系按照一定的爬行策略生成每次抓取循环所需的fetchlist(Crawler根据WebDB生成一个待抓取网页的URL集合),然后 Fetcher(下载线程)通过fetchlist中的URLs抓取这些网页并索引,然后将其存入segment。Segment是有时限的,当这些网页被 Crawler重新抓取后,先前抓取产生的segment就作废了。在存储中。Segment文件夹是以产生时间命名的,方便我们删除作废的 segments以节省存储空间。  

Index是Crawler抓取的所有网页的索引,它是通过对所有单个segment中的索引进行合并处理所得的。Nutch利用Lucene技术进行索引,所以Lucene中对索引进行操作的接口对Nutch中的index同样有效。但是需要注意的是,Lucene 中的segment和Nutch中的不同,Lucene中的segment是索引index的一部分,但是Nutch中的segment只是WebDB中各个部分网页的内容和索引,最后通过其生成的index跟这些segment已经毫无关系了。  

Web database,也叫WebDB,其中存储的是爬虫所抓取网页之间的链接结构信息,它只在爬虫Crawler工作中使用而和Searcher的工作没有 任何关系。WebDB内存储了两种实体的信息:page和link。Page实体通过描述网络上一个网页的特征信息来表征一个实际的网页,因为网页有很多个需要描述,WebDB中通过网页的URL和网页内容的MD5两种索引方法对这些网页实体进行了索引。Page实体描述的网页特征主要包括网页内的link数目,抓取此网页的时间等相关抓取信息,对此网页的重要度评分等。同样的,Link实体描述的是两个page实体之间的链接关系。  

工作步骤 :  

在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。  

1. 创建一个新的WebDb(admin db -create).  

2. 将抓取起始URLs写入WebDB中 (inject).  

3. 根据WebDB生成fetchlist并写入相应的segment(generate).    

4. 根据fetchlist中的URL抓取网页 (fetch).  

5. 根据抓取网页更新WebDb(updatedb).  

6. 循环进行3-5步直至预先设定的抓取深度。