1. 程式人生 > >Nutch的Hadoop方式爬取效率優化

Nutch的Hadoop方式爬取效率優化

下面這些是潛在的影響爬取效率的內容(官方資料翻譯):

1)DNS設定
2)你的爬蟲數量,太多或太少
3)頻寬限制
4)每一主機的執行緒數
5)要抓取的urls的分配不均勻
6) robots.txt中的高爬取延時(通常和urls的分配不均勻同時出現)
7)有很多比較慢的網頁(通常和分配不均勻同時出現)
8)要下載太多的內容(PDF,大的html頁面,通常和分配不均勻同時出現)
9)其它

那現在怎樣改善它們?

1)在每一個本地的爬蟲機器上設定DNS,如果是多個爬取機器和一個單獨的DNS中心這種情況,那麼它就會像有DOS攻擊在DNS伺服器上那樣,使整個系統變慢。我們經常設定兩層,首先命中本地DNS快取,然後就是大的DNS快取,就像OpenDNS或Verizon。
2)這將是map任務數乘以fetcher.threads.fetch屬性值的數量。所以10個map任務*20個執行緒=一次200個爬取列表。太多的話會超過你係統的負擔,太少的話就會使一些機器閒置。你需要認真考慮在你的環境下如何設定這些屬性。
3)頻寬限制,用ntop,ganglia和其它監控軟體來測定你使用了多少的頻寬。計算輸入和輸出的頻寬。可以做一個簡單的測試,用抓取網路中一臺不用作爬蟲的伺服器中,如果它與其中一臺爬蟲機器連線時或當那臺機器抓取時從中下載資訊時非常慢,這時你就可以加大頻寬。如果你像我後來說的那樣設定http的超時時間並且增加了你的頻寬,你會開始看到很多http超時的錯誤。
4)urls分配的不均勻很有可能是限制性能的一個最大的因素。如果一個執行緒正在處理一個網站並且那個網站還有很多url等待抓取,那麼其它執行緒就會閒置直到那個執行緒完成抓取。一些解決方法是,使用fetcher.server.delay來縮短網頁抓取之間的時間間隔,和使用fetcher.threads.per.host來增加同一網站抓取的執行緒數(這仍然在同一個map任務中,因此也是在同一個JVM中的子任務中處理)。如果把這些屬性都設定為大於0,你也可以設定fetcher.server.min.delay屬性大於0來設定處理的最小和最大的界限。
5)在一個網站上抓取大量的網頁或在少量網站上抓取大量的網頁將顯著地降低抓取的速度。對於全網爬取,你希望用分散式環境來使所有抓取執行緒活動。設定generate.max.per.host大於0將限制在同一網站/域名抓取網頁的數量
6)爬取延遲。大多數網站不使用這些設定只有少數使用(一些惡意的網站)。我見過爬取延遲每秒最長延遲2天的.fetcher.max.crawl.delay屬性將忽略爬取延遲大於x的頁面。我經常把它設定成10秒,預設是30秒。儘管設定為10秒,如果你在某個網站上有大量的頁面要爬取,但你只能每10秒爬取一個頁面,這樣也是很慢的。另一方面,把它的值設定過小將忽略該頁面並且不抓取這些網頁。
7)有時,網頁剛好很慢。設定http.timeout一個低點的值就有助於這種情況。它的預設值為10秒。如果你不在意並想所有網頁都儘可能的快,設定得小點。一些網站。例如digg,會在網站中限制你的頻寬並且只允許在某個時間段記憶體在x個到你機器的連線。所以即使你只在一個網站中爬取50個網頁(我仍然認為太多了)。這樣將在每一頁面中等待10秒。ftp.timeout也可以用來設定抓取ftp的內容時的時間間隔。
8)大量的內容意味著要降低抓取的速度。特別是下載PDF或其它非html的檔案時。為了避免下載非html的內容,你可以使用url過濾器。我更喜歡prefix和suffix過濾器。http.content.limit和ftp.content.limit屬性可以限制一個文件中下載資料的多少。
9)其它可能導致抓取變慢的因素:
一臺機器最大可開啟的socket或檔案的多少。你可能會開始看到IO錯誤或不能開啟socket的錯誤。低效的路由。壞的或家裡的路由不能控制同一時間大量連線的建立。一個錯誤的路由設定也可能導致問題但這些問題通常很難發現。如果你認為是這個問題,可以用網路跟蹤和對映工具來查詢。反向的路由則可能是你網路供應商的問題。壞的網絡卡。我曾經見過一些網絡卡突然達到了某個頻寬值。這個問題在使用新的網絡卡時更加普遍。這通常不是我首先想到的但是通常是可能會出現的。可以使用tcpdump和網路監控

本次優化方向:

A,1)3)為硬體,設定好了以後改變不大。暫不考慮。
B,5)generate.max.per.host暫設定為0。暫不考慮。
C,8)本次爬蟲設定只爬取網頁內容,不爬媒體檔案。
D,2)4)6)7)9)為優化目標

Hadoop配置:

三臺:主機記憶體8G,2臺slave記憶體20G,主從記憶體配置不合理有一定原因,這裡就不再贅述。以後也是一個優化方向

網路頻寬:100M

優化前的準備工作:

沒有優化之前,種子數量在10條左右的時候,單機版和Hadoop版的爬取效率大約都在2條/秒(包括建立索引)。
優化了Nutch索引,stored和indexed,索引不需要儲存的儘量不儲存,不需要索引的儘量不索引。並且去掉不必要的索引專案。當種子數增加到40條左右的時候,Hadoop版的爬取效率大約在3.5條/秒。由此確定了種子數量對爬取有影響的優化方向。

參照hadoop的優化方針,做了如下優化:

1,優化系統引數 readahead buffer
blockdev --report
blockdev --setra 1024 /dev/sda
2,優化hadoop引數
hdfs-default
 dfs.namenode.handler.count:20
 dfs.datanode.handler.count:5
 dfs.replication:3
mapred-default.xml
 mapreduce.tasktracker.http.threads:50
 io.sort.factor:20
 mapred.child.java.opts:-Xmx400m
 mapreduce.task.io.sort.mb:200
 mapreduce.map.sort.spill.percent:0.8
 mapreduce.map.output.compress:true
mapreduce.map.output.compress.codec:org.apache.hadoop.io.compress.DefaultCodec    com.hadoop.compression.lzo.LzoCodec

為最優
mapreduce.reduce.shuffle.parallelcopies:10

優化開始:

2014/7/9 上午

優化內容

增大種子數:選取的3000左右的有效的國外網站。

yarn-site
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>3072</value>
</property>
mapred-site
<property>
<name>mapreduce.map.memory.mb</name>
<value>1536</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>2560</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xms512m -Xmx1024m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xms1024m -Xmx2048m</value>
</property>
slave
yarn-site
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>3072</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>6144</value>
</property>
mapred-site
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>8192</value>
</property>
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xms2048m -Xmx3072m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xms5120m -Xmx6144m</value>
</property>

結果:

共爬取並建立了91986條solr索引,共耗時22235秒。最終效率:4.14條/秒。

4.136991
2923 2923 11:06:05 11:20:51 0:14
36538 33615 11:20:51 13:13:38 1:52
68255 31717 13:13:38 15:16:42 2:03
91986 23731 15:16:42 17:16:40 1:59

2014/7/9 下午

優化內容:

nutch-site

<name>fetcher.threads.per.host</name> 5
<name>fetcher.threads.fetch</name>20

結果:


    數
效率 5.38條/秒 全體 Nutch Index
總條數 每回條數 開始 終了 耗時 速度 開始 終了 耗時 速度 開始 終了 耗時 速度
1 2923 2923 18:22:04 18:48:55 1611 1.81 18:22:04 18:35:13 789 3.70 18:37:05 18:48:55 710 4.12
2 36538 33615 18:49:41 20:59:04 7763 4.33 18:49:41 20:20:31 5450 6.17 20:22:18 20:59:04 2206 15.24
3 68255 31717 21:00:11 22:57:35 7044 4.50 21:00:11 22:26:21 5170 6.13 22:28:08 22:57:35 1767 17.95
4 91986 23731 22:59:19 0:58:52 7173 3.31 22:59:19 0:28:49 5370 4.42 0:31:03 0:58:52 1669 14.22
5 115646 23660 1:00:49 2:49:14 6505 3.64 1:00:49 2:19:21 4712 5.02 2:21:19 2:49:14 1675 14.13

結論:

速度從4.14-〉5.38,提升了29.95%。從這一點來看Nutch的fetch執行緒數目對爬取效率有一定影響。

2014/7/10

優化內容:

根據7/9日的方向,增加fetch執行緒數。

nutch-site
<property>
  <name>fetcher.threads.fetch</name>
  <value>100</value>
</property>
<property>
 <name>plugin.includes</name>
    <value>protocol-http|urlfilter-regex|parse-html|index-(basic|customized)|indexer-solr|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
</property>
<property>
  <name>indexer.skip.notmodified</name>
  <value>true</value>
  <description>Whether the indexer will skip records with a db_notmodified status.
  </description>
</property>

結果:


    數
效率 6.22條/秒 全體 Nutch Index
總條數 每回條數 開始 終了 耗時 速度 開始 終了 耗時 速度 開始 終了 耗時 速度
1 3014 3014 15:01:01 15:26:07 1506 2.00 15:01:01 15:13:30 749 4.02 15:15:13 15:26:07 654 4.61
2 39069 36055 15:26:54 17:34:55 7681 4.69 15:26:54 17:01:35 5681 6.35

相關推薦

Nutch的Hadoop方式效率優化

下面這些是潛在的影響爬取效率的內容(官方資料翻譯): 1)DNS設定 2)你的爬蟲數量,太多或太少 3)頻寬限制 4)每一主機的執行緒數 5)要抓取的urls的分配不均勻 6) robots.txt中的高爬取延時(通常和urls的分配不均勻同時出現) 7

urllib:Post方式AJAX載入的資料

Request請求物件的裡有data引數,它就是用在POST裡的,我們要傳送的資料就是這個引數data,data是一個字典,裡面要匹配鍵值對。 POST請求:程式碼模板 匯入request模組 import urllib.request 程式碼模板 # 首先對data進行轉碼

[Python爬蟲]爬蟲例項:三種方式PEXELS圖片

PEXELS:Best free stock photos in one place. Pexels是一個提供免費高品質圖片,並且可商用的圖片網站.但是因為網站時外國的,所以連線和下載速度都略慢… 這裡只是為了講解圖片爬取和下載儲存的流程. 三種方式是指:分別指使用Lxml,Be

Python網路爬蟲之製作股票資料定向爬蟲 以及優化 可以顯示進度條!

候選網站: 新浪股票:http://finance.sina.com.cn/stock/ 百度股票:https://gupiao.baidu.com/stock/ 選取原則: 無robots協議 非js網頁 資料在HTMLK頁面中的 F12,檢視原始

Python用面向物件的方式小說

這裡以爬取小說《夢裡花落知多少為例》 昨天幫同學爬的一部小說,現在把程式碼放在部落格上希望也能幫到其他人 # -*- coding:utf-8 -*- # @time: 2018/11/25 22:28 # @Author: cen import requests, re fr

python爬蟲中文亂碼問題(request方式

req = requests.get(url)返回的是類物件 其包括的屬性有: req.encoding:返回編碼方式 req.text:text返回的是處理過的Unicode型的資料 req.content:content返回的是bytes型的原始資料 conte

scrapy框架的底層原理和如何提高效率

Scrapy的最新架構圖:1、Scrapy Engine(Scrapy引擎)  Scrapy引擎是用來控制整個系統的資料處理流程,並進行事務處理的觸發。更多的詳細內容可以看下面的資料處理流程。  2、Scheduler(排程)  排程程式從Scrapy引擎接受請求並排序

三個Python爬蟲版本,帶你以各種方式校花網,輕鬆入門爬蟲

  爬蟲是什麼?   進群進群:943752371可以獲取Python各類入門學習資料! 這是我的微信公眾號【Python程式設計之家】各位大佬用空可以關注下,每天更新Python學習方法,感謝! 如果我們把網際網路比作一張大的蜘蛛網,資料便是存放

Python爬蟲-程序池方式頭條視訊

首先進入今日頭條視訊首頁。 分析網頁 其中href屬性下的連線就是我們需要下載的視訊。 在下載全部視訊之前應該分析一下單視訊下載的方法。 下載一個視訊 首先檢視單個視訊的網頁頁面 我們需要獲取var mp4下的視訊。但是這個語句應該是

提升Scrapy框架數據效率的五種方式

增加 快速 少量數據 設置 coo ror 超時時間 產生 取數 1、增加並發線程開啟數量   settings配置文件中,修改CONCURRENT_REQUESTS = 100,默認為32,可適當增加; 2、降低日誌級別   運行scrapy時會產生大量日誌占用CP

逆向知識第六講,優化的幾種方式

ebp 有符號 基本 什麽是 說了 xxx 個數 color 常量         逆向知識第六講,取摸優化的幾種方式 除法講完之後,直接開始講 % 運算符在匯編中表現形式 首先C的高級代碼貼上來. 高級代碼: // Tedy.cpp : Defines the en

微信公眾號的文章有三種方式

runner 思路 class 目標 rdquo 創建時間 利用 歷史 三種 a. 通過微信訂閱號在發布文章,可以查找公眾號的文章,方式見微信鏈接。,閱讀數、點贊數、評論數仍無法抓取。 b. 通過搜狗微信搜索微信公眾號,但是文章篇幅仍然後有限制,點贊、閱讀數、和評論數無法

使用爬蟲scrapy庫58同城出租房的聯絡方式地址

一  .建立一個爬蟲工程   scrapy startproject  tongcheng   #建立一隻爬蟲   scrapy genspider   zufang   域名(xa.58.com/zufang/) 二.配置setting檔案

Python網路爬蟲之股票資料Scrapy爬蟲例項介紹,實現與優化!(未成功生成要的內容!)

結果TXT文本里面竟然沒有內容!cry~ 編寫程式: 步驟: 1. 建立工程和Spider模板 2. 編寫Spider 3. 編寫ITEM Pipelines 程式碼:成功建立 D:\>cd pycodes D:\pycodes>

requests 使用免費的代理ip網站(要效率的話還是推薦花錢買vip)

import requests import queue import threading from lxml import etree #要爬取的URL url = "http://xxxxx" #代理ip網站 proxy_url = "https://www.kuaidaili.com/free

動態網站資料(soup的css方式處理資料)

import requests from bs4 import BeautifulSoup url = 'https://knewone.com/discover?page=' def get_in

常見sql語句效率優化方式

首先介紹幾條優化原則: 儘量避免where中包含子查詢;  where條件中,過濾量最大的條件放在where子句最後;  採用繫結變數有助於提高效率;  在索引列上使用計算、改變索引列的型別、在索引列上使用!=將放棄索引; 

效率優化專題】2.java陣列拷貝的3種方式效率對比

Java語言中常用的陣列拷貝方式有:for迴圈拷貝,通過Arrays.copyOf()方法,System.arraycopy和clone()方法拷貝。1 測試場景我們用最簡單的整數陣列來測試。首先建立一個整型陣列,並且初始化資料。然後分別用這3種方式來拷貝陣列同樣的次數。來測分別試這三種情況的效率。1.1 初

順企網商戶聯絡方式

暑假實習的時候,老闆讓收集北上廣深公司的聯絡方式,最好是email或者手機。鑑於老闆不想花錢,就拜託本菜鳥寫爬蟲,去爬取各色B2B網站企業資訊。 現在的時代,資料就是金錢,各大網站是不可能讓你輕而易舉爬走資料滴,即使這些資料都是開源的。常見的反爬手段包括禁止頻繁訪問,將手機

關於資料儲存到json檔案,中文是unicode解決方式

原帖地址: https://www.cnblogs.com/yuyang26/p/7813097.html 流程:  爬取的資料處理為列表,包含字典。裡面包含中文, 經過json.dumps,儲存到json檔案中, 發現裡面的中文顯示未\ue768這樣子 查閱資