博客专区 > 杨尚川的博客 > 博客详情
基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
杨尚川 发表于3年前
基于Nutch+Hadoop+Hbase+ElasticSearch的网络爬虫及搜索引擎
  • 发表于 3年前
  • 阅读 14113
  • 收藏 97
  • 点赞 15
  • 评论 22

330元/年抢阿里云香港云服务器,节省80%出海成本>>>   

网络爬虫架构在Nutch+Hadoop之上,是一个典型的分布式离线批量处理架构,有非常优异的吞吐量和抓取性能并提供了大量的配置定制选项。由于网络爬虫只负责网络资源的抓取,所以,需要一个分布式搜索引擎,用来对网络爬虫抓取到的网络资源进行实时的索引和搜索。

 

搜 索引擎架构在ElasticSearch之上,是一个典型的分布式在线实时交互查询架构,无单点故障,高伸缩、高可用。对大量信息的索引与搜索都可以在近 乎实时的情况下完成,能够快速实时搜索数十亿的文件以及PB级的数据,同时提供了全方面的选项,可以对该引擎的几乎每个方面进行定制。支持RESTful 的API,可以使用JSON通过HTTP调用它的各种功能,包括搜索、分析与监控。此外,还为Java、PHP、Perl、Python以及Ruby等各 种语言提供了原生的客户端类库。

 

网络爬虫通过将抓取到的数据进行结构化提取之后提交给搜索引擎进行索引,以供查询分析使用。由于搜索引擎的设计目标在于近乎实时的复杂的交互式查询,所以搜索引擎并不保存索引网页的原始内容,因此,需要一个近乎实时的分布式数据库来存储网页的原始内容。

 

分布式数据库架构在Hbase+Hadoop之上,是一个典型的分布式在线实时随机读写架构。极强的水平伸缩性,支持数十亿的行和数百万的列,能够对网络爬虫提交的数据进行实时写入,并能配合搜索引擎,根据搜索结果实时获取数据。

 

网 络爬虫、分布式数据库、搜索引擎均运行在普通商业硬件构成的集群上。集群采用分布式架构,能扩展到成千上万台机器,具有容错机制,部分机器节点发生故障不 会造成数据丢失也不会导致计算任务失败。不但高可用,当节点发生故障时能迅速进行故障转移,而且高伸缩,只需要简单地增加机器就能水平线性伸缩、提升数据 存储容量和计算速度。

 

网络爬虫、分布式数据库、搜索引擎之间的关系:

 

1、网络爬虫将抓取到的HTML页面解析完成之后,把解析出的数据加入缓冲区队列,由其他两个线程负责处理数据,一个线程负责将数据保存到分布式数据库,一个线程负责将数据提交到搜索引擎进行索引。

 

2、搜索引擎处理用户的搜索条件,并将搜索结果返回给用户,如果用户查看网页快照,则从分布式数据库中获取网页的原始内容。

 

整体架构如下图所示:

 


 

爬虫集群、分布式数据库集群、搜索引擎集群在物理部署上,可以部署到同一个硬件集群上,也可以分开部署,形成1-3个硬件集群。

 

网络爬虫集群有一个专门的网络爬虫配置管理系统来负责爬虫的配置和管理,如下图所示:

 

 

搜 索引擎通过分片(shard)和副本(replica)实现了高性能、高伸缩和高可用。分片技术为大规模并行索引和搜索提供了支持,极大地提高了索引和搜 索的性能,极大地提高了水平扩展能力;副本技术为数据提供冗余,部分机器故障不影响系统的正常使用,保证了系统的持续高可用。

 

有2个分片和3份副本的索引结构如下所示:

 

 

 

 

一个完整的索引被切分为0和1两个独立部分,每一部分都有2个副本,即下面的灰色部分。

 

在 生产环境中,随着数据规模的增大,只需简单地增加硬件机器节点即可,搜索引擎会自动地调整分片数以适应硬件的增加,当部分节点退役的时候,搜索引擎也会自 动调整分片数以适应硬件的减少,同时可以根据硬件的可靠性水平及存储容量的变化随时更改副本数,这一切都是动态的,不需要重启集群,这也是高可用的重要保 障。

 

 


共有 人打赏支持
杨尚川
粉丝 1019
博文 210
码字总数 1618021
作品 10
评论 (22)
PaulWong
怎么不用ELASTICSEARCH的HBASE RIVER?
杨尚川

引用来自“PaulWong”的评论

怎么不用ELASTICSEARCH的HBASE RIVER?
在解析完网页后,并行写入HBASE和ELASTICSEARCH
yxssfxwzy
博主能介绍一下es和solr的优劣对比吗?谢谢
鱼中鱼
想请教下,单机环境下,elastic cluster name 是不是主机名呢?
鱼中鱼
在windows环境下,应该是config/elasticsearch.yml中的cluster.name: elasticsearch吧
但是我在执行:ElasticIndexerJob elasticsearch -all的时候,抛了以下异常
[2014-09-02 10:06:33,235][WARN ][discovery.zen.ping.multicast] [single] failed to read requesting data from /192.168.0.123:54328
java.io.IOException: No transport address mapped to [19809]
at org.elasticsearch.common.transport.TransportAddressSerializers.addressFromStream(TransportAddressSerializers.java:71)
at org.elasticsearch.cluster.node.DiscoveryNode.readFrom(DiscoveryNode.java:267)
at org.elasticsearch.cluster.node.DiscoveryNode.readNode(DiscoveryNode.java:257)
at org.elasticsearch.discovery.zen.ping.multicast.MulticastZenPing$Receiver.onMessage(MulticastZenPing.java:319)
at org.elasticsearch.common.network.MulticastChannel$Plain$Receiver.run(MulticastChannel.java:364)
at java.lang.Thread.run(Thread.java:744)
不知是少了什么配置呢?
杨尚川

引用来自“鱼中鱼”的评论

想请教下,单机环境下,elastic cluster name 是不是主机名呢?
不是
杨尚川

引用来自“yxssfxwzy”的评论

博主能介绍一下es和solr的优劣对比吗?谢谢
你可以参考: http://stackoverflow.com/questions/10213009/solr-vs-elasticsearch
余维超

引用来自“鱼中鱼”的评论

想请教下,单机环境下,elastic cluster name 是不是主机名呢?
在集群环境下是集群名,主要用于集群中节点发现以及区分的
余维超

引用来自“鱼中鱼”的评论

想请教下,单机环境下,elastic cluster name 是不是主机名呢?

引用来自“杨尚川”的评论

不是
很高兴认识你啊,我以前打算学爬虫的时候我同事一直给我推荐你,以后得多像大牛你请教了
mym0514
博主有这方面的程序吗?小妹初学 想学习下,期待您的回复
杨尚川

引用来自“mym0514”的评论

博主有这方面的程序吗?小妹初学 想学习下,期待您的回复
这些都是开源的项目,你直接搜索GOOGLE即可
鄂世嘉
请教一下这个开源项目叫什么名字?Google的结果都是您的这篇文章。
v1daddy

引用来自“PaulWong”的评论

怎么不用ELASTICSEARCH的HBASE RIVER?

引用来自“杨尚川”的评论

在解析完网页后,并行写入HBASE和ELASTICSEARCH
请问下博主 是怎么保证 HBASE和ELASTICSEARCH 数据同步的?
杨尚川

引用来自“鄂世嘉”的评论

请教一下这个开源项目叫什么名字?Google的结果都是您的这篇文章。
这个是一个方案,不是一个开源项目。
daixiaoyun3013
川哥就是牛!!
罗慢慢
这个设计有实现不?
罗慢慢
既然Hbase和ES的数据是一样的,它们之间如何配合?
杨尚川

引用来自“罗慢慢”的评论

既然Hbase和ES的数据是一样的,它们之间如何配合?
HBase存储完整数据,可对单个网页进行随机读写操作;ES存储部分数据,可以对所有网页进行各种复杂条件的快速检索;ES的检索结果如果需要获取完整网页数据,则利用URL从HBase中读取。
elvissss

引用来自“罗慢慢”的评论

既然Hbase和ES的数据是一样的,它们之间如何配合?

引用来自“杨尚川”的评论

HBase存储完整数据,可对单个网页进行随机读写操作;ES存储部分数据,可以对所有网页进行各种复杂条件的快速检索;ES的检索结果如果需要获取完整网页数据,则利用URL从HBase中读取。
请问,检索不是应该发生在获取到数据之后吗?
杨尚川

引用来自“罗慢慢”的评论

既然Hbase和ES的数据是一样的,它们之间如何配合?

引用来自“杨尚川”的评论

HBase存储完整数据,可对单个网页进行随机读写操作;ES存储部分数据,可以对所有网页进行各种复杂条件的快速检索;ES的检索结果如果需要获取完整网页数据,则利用URL从HBase中读取。

引用来自“elvissss”的评论

请问,检索不是应该发生在获取到数据之后吗?
是的,爬虫“获取到数据”之后,将数据存储到HBASE并索引到ES。
×
杨尚川
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: