Apache Nutch 2.x 引入 Apache Gora 作為持久化抽象層,支持將爬取數據存儲到 HBase、Cassandra、MongoDB、SQL 等多種後端。本文記錄基於 Nutch 2.3.1 + HBase (HDFS + ZooKeeper) 的生產級部署流程與基礎操作。
Nutch 2.x (Gora API)
│
▼
HBase (列式 NoSQL, 隨機讀寫)
│
├── HDFS (分佈式文件系統, 存儲 HFile 數據塊)
│
└── ZooKeeper (協調服務, 存儲元數據: Region 位置、Schema、Master 選舉)
關鍵點:Nutch 僅感知 HBase,不關心 HBase 是單機還是分佈模式;HBase 透明依賴 HDFS 與 ZooKeeper。
| 組件 | 版本 | 說明 |
|---|---|---|
| Nutch | 2.3.1 | Ant/Ivy 構建, Gora 0.6.1 |
| HBase | 1.2.x / 1.3.x | HBase 2.x 需 Nutch 2.4+ / Gora 0.7+ |
| Hadoop (HDFS/YARN) | 2.7.x / 2.8.x / 2.9.x | Hadoop 3.x 需注意兼容性 |
| ZooKeeper | 3.4.x | HBase 內置或獨立集群 |
| Java | JDK 8 (1.8.0_202+) | Nutch 2.x 不支持 JDK 9+ |
| Ant | 1.9.x / 1.10.x | 構建工具 |
| Ivy | 2.4.x / 2.5.x | 依賴管理 (Nutch 內建) |
hdfs dfs -ls / 通暢zkCli.sh -server zk1:2181 連接正常hbase shell 可創建表、寫入數據tar -xzf apache-nutch-2.3.1-src.tar.gz
cd apache-nutch-2.3.1
編輯 conf/gora.properties:
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
gora.datastore.config=hbase-site.xml
確保 hbase-site.xml 在 classpath 中 (或複製到 conf/),內容包含:
<configuration>
<property>
<name>hbase.zookeeper.quorum</name>
<value>zk1,zk2,zk3</value>
</property>
<property>
<name>hbase.zookeeper.property.clientPort</name>
<value>2181</value>
</property>
<property>
<name>zookeeper.znode.parent</name>
<value>/hbase</value> <!-- HBase 在 ZK 中的根節點 -->
</property>
</configuration>
編輯 conf/nutch-site.xml:
<configuration>
<!-- HTTP 代理, 爬取間隔, 用戶代理 -->
<property>
<name>http.agent.name</name>
<value>MyNutchBot/1.0 (+https://mydomain.com/bot.html)</value>
</property>
<property>
<name>fetcher.server.delay</name>
<value>2.0</value> <!-- 同主機延遲 2秒 -->
</property>
<property>
<name>fetcher.threads.fetch</name>
<value>10</value>
</property>
<property>
<name>db.ignore.external.links</name> <!-- 僅爬取種子域名 -->
<value>true</value>
</property>
<property>
<name>plugin.includes</name>
<value>protocol-http|urlfilter-regex|parse-(html|tika|text)|index-(basic|anchor)|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
</property>
</configuration>
# urls/seed.txt (每行一個種子 URL)
https://www.example.com/
https://blog.example.com/
# conf/regex-urlfilter.txt (正則過濾規則)
# 接受種子域名下所有鏈接
+^https?://([a-z0-9-]+\.)*example\.com/
# 拒絕所有其他
-^.
# 編譯並打包 runtime (含依賴)
ant runtime
# 輸出目錄: runtime/local/ (本地模式) 或 runtime/deploy/ (分佈式)
# 結構:
# runtime/local/
# ├── bin/ # nutch, crawl 腳本
# ├── conf/ # 配置文件
# ├── lib/ # 所有依賴 jar
# └── plugins/ # 插件
cd runtime/local
bin/nutch inject crawl/crawldb urls/seed.txt
# 或指定配置目錄
bin/nutch -Dnutch.conf.dir=conf inject crawl/crawldb urls/seed.txt
# 生成抓取列表
bin/nutch generate crawl/crawldb crawl/segments -topN 1000
# 抓取 (segment 目錄名含時間戳)
SEG=$(ls -d crawl/segments/2* | tail -1)
bin/nutch fetch $SEG -threads 10
# 解析
bin/nutch parse $SEG
# 更新 CrawlDb (去重、鏈接圖、評分)
bin/nutch updatedb crawl/crawldb $SEG
生產環境建議編寫腳本自動化多輪爬取,並監控 crawldb 統計信息。
# 索引到 Solr
bin/nutch index crawl/crawldb -linkdb crawl/linkdb crawl/segments/* -solr https://solr:8983/solr/nutch
# 或導出倒排索引文件
bin/nutch invertlinks crawl/linkdb -dir crawl/invertlinks
| 問題 | 原因/解決 |
|---|---|
| Gora 找不到 HBaseStore | gora-hbase 模塊未編譯/打包 → 檢查 ivy.xml 依賴、ant clean runtime 重建 |
| HBase 連接超時 / ZooKeeper 連不上 | hbase-site.xml 配置錯誤 / 防火牆 / ZK 根節點不匹配 → 檢查 zkCli ls /hbase |
| MapReduce 作業失敗 (Container memory) | YARN 容器內存不足 → 調整 mapreduce.map.memory.mb / reduce.memory.mb |
| 爬取速度極慢 | fetcher.threads.fetch 過小 / fetcher.server.delay 過大 / DNS 解析慢 / 目標站反爬 |
| 中文亂碼 | http.content.encoding 默認 ISO-8859-1 → 設置 utf-8 / 依賴 Tika 自動檢測 |
| Ant 構建 Ivy 依賴下載失敗 | 網絡不通 → 配置 Ivy 鏡像 / 手動下載 jar 到 ivy/cache |
db.max.outlinks.per.page、crawl.max.segment.size、使用 UrlNormalizer 規範化crawldb、linkdb 目錄bin/nutch crawl -Dmapreduce.jobtracker.address=rm:8032 urls/seed.txt crawl/output 10 提交到 YARN核心提示:Nutch 2.x + HBase 架構適合中大規模、增量爬取、需隨機訪問爬取數據的場景。小規模/一次性任務可考慮 Nutch 1.x (Segment 文件存儲) 或簡輕量爬蟲框架 (WebMagic, Scrapy)。部署核心在於 Gora → HBase → HDFS/ZK 配置鏈路打通,版本矩陣務必嚴格對齊。