SIP 專案面臨海量日誌分析,單機多執行緒任務分解已成瓶頸。MapReduce「任務分解與結果彙總」思想加上 HDFS 分散式儲存,恰好解決海量資料平行處理與擴展性問題。Hadoop 為 Apache 開源實作,已驗證於 Amazon、Facebook、Yahoo 等大規模生產環境。
核心原則:**Moving Computation is Cheaper than Moving Data** → 計算移至資料所在節點(Data Locality)。
| 角色 | 職責 |
| NameNode | 命名空間管理、中繼資料記憶體儲存、Block 複本調度、心跳監控 DataNode |
| DataNode | 實際儲存 Block、定期上報 Block 清單、執行 Block 複製/搬移 |
| Client | 讀寫檔案、與 NameNode 協商 Block 位置、直接與 DataNode 傳輸資料 |
關鍵設計亮點
- Block 放置策略:預設 3 複本 → 1 同機架、1 異機架、1 同機架不同節點,兼顧容錯與跨機架頻寬。
- 心跳機制:DataNode 定期心跳,失聯觸發補本。
- Balancer:
hdfs balancer -threshold 10% 自動平衡節點磁碟使用率。
- CRC32 校驗:寫入/讀取時自動校驗資料完整性。
- 管道式寫入:Client → DN1 → DN2 → DN3 串聯傳輸,降低 Client 頻寬壓力。
- 安全模式:啟動初期唯讀,驗證 Block 有效性並補本後自動解除。
- NameNode SPOF:單點故障,元資料同步寫入本地與遠端(NFS)緩解。
叢集部署實戰(1 Master + 6 Slaves)
環境準備
- 7 台 Linux 普通 PC,JDK ≥ 1.5(必須)。
- 主機名唯一,
/etc/hosts 互解。
- 統一安裝目錄,如
/home/wenchu/hadoop-0.17.1。
核心配置檔
hadoop-env.sh
export JAVA_HOME=/usr/ali/jdk1.5.0_10
hadoop-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://10.2.224.46:54310/</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>hdfs://10.2.224.46:54311/</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/wenchu/hadoop/tmp/</value>
</property>
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx512m</value>
</property>
<property>
<name>dfs.block.size</name>
<value>5120000</value>
</property>
</configuration>
masters / slaves
# masters
10.2.224.46
# slaves
10.2.226.40
10.2.226.39
10.2.226.38
10.2.226.37
10.2.226.41
10.2.224.36
SSH 免密碼互信
# 全節點執行
ssh-keygen -t rsa # 一路 Enter
# Master 公鑰分發至所有 Slave
scp ~/.ssh/id_rsa.pub slave:/root/.ssh/46_rsa.pub
# Slave 端
cat ~/.ssh/46_rsa.pub >> ~/.ssh/authorized_keys
# 驗證
ssh slave # 無需密碼
分發安裝包與啟動
# Master 打包分發
scp -r /home/wenchu/hadoop-0.17.1 slave:/home/wenchu/
# 各 Slave 修改 hadoop-env.sh JAVA_HOME
# Master 格式化 NameNode
bin/hadoop namenode -format
# 啟動叢集
bin/start-all.sh
常見坑點與經驗
- 主機名衝突:NameNode 與 TaskTracker 對
/etc/hosts 解析順序敏感,建議單機單角色。
- JDK 版本:< 1.5 會出現不可預期錯誤。
- tmp 目錄殘留:DataNode 啟動失敗常因舊
hadoop.tmp.dir 殘留,刪除後重新 format NameNode。
- Block 大小:必須為 512 倍數(CRC32 最小單元),預設 64MB,小檔案多可調小。
後續規劃
以 WordCount 驗證叢集功能,進而開發日誌分析 MapReduce 作業,構建多階段管線(解析 → 統計 → 彙總 → 入庫),並評估 HBase/Hive 上層生態適用性。