JAVA_HOME)Hadoop 節點間通訊依賴 SSH,偽分散式需 localhost 無密碼登入。
# 安裝 SSH 服務端
sudo apt-get update && sudo apt-get install -y openssh-client openssh-server
# 啟動/停止服務
sudo service ssh start
# sudo service ssh stop
# 驗證 sshd 進程
ps -e | grep ssh
# 應看到 ssh-agent 與 sshd
# 產生無密碼金鑰對
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 將公鑰加入授權
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
# 測試
ssh localhost
# 首次會詢問 yes/no,之後應直接進入無需密碼
# 解壓至家目錄
tar -xzf hadoop-1.2.1.tar.gz -C ~/
# 建立資料目錄結構
mkdir -p ~/hadoop-env/dfs/{checkpoint1,data1,data2,name1}
mkdir -p ~/hadoop-env/test/input
$HADOOP_HOME/conf/)<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://localhost:9000</value>
<final>true</final>
</property>
</configuration>
fs.default.name 指定 HDFS URI,未指定埠預設 8020,這裡明確用 9000。
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>dfs.name.dir</name>
<value>~/hadoop-env/dfs/name1</value>
<final>true</final>
</property>
<property>
<name>dfs.data.dir</name>
<value>~/hadoop-env/dfs/data1,~/hadoop-env/dfs/data2</value>
<final>true</final>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>~/hadoop-env/dfs/checkpoint1</value>
<final>true</final>
</property>
</configuration>
dfs.name.dir:NameNode 儲存元資料目錄(可多目錄,逗號分隔)。dfs.data.dir:DataNode 儲存資料塊目錄(多目錄提升 I/O 平行度)。fs.checkpoint.dir:SecondaryNameNode 檢查點目錄。<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
<final>true</final>
</property>
</configuration>
hadoop-env.sh 指定 JAVA_HOME# 編輯 ~/hadoop-1.2.1/conf/hadoop-env.sh
export JAVA_HOME=~/jdk1.7.0_25
# 或絕對路徑 /usr/lib/jvm/java-7-oracle
# 格式化 NameNode(僅首次)
~/hadoop-1.2.1/bin/hadoop namenode -format
# 啟動 HDFS(NameNode + DataNode + SecondaryNameNode)
~/hadoop-1.2.1/bin/start-dfs.sh
# 啟動 MapReduce(JobTracker + TaskTracker)
~/hadoop-1.2.1/bin/start-mapred.sh
$ jps
12864 NameNode
13592 DataNode
13728 SecondaryNameNode
13837 JobTracker
13955 TaskTracker
16069 Jps
https://localhost:50030https://localhost:50070若使用代理/VPN 可能無法存取,關閉代理後重試。
# 建立測試資料
echo "hello world" > ~/hadoop-env/test/input/test1.txt
echo "hi world" > ~/hadoop-env/test/input/test2.txt
# 上傳至 HDFS
~/hadoop-1.2.1/bin/hadoop dfs -put ~/hadoop-env/test/input/ output/
# 檢查
~/hadoop-1.2.1/bin/hadoop dfs -ls /
~/hadoop-1.2.1/bin/hadoop dfs -ls /test
# 執行範例 WordCount
~/hadoop-1.2.1/bin/hadoop jar ~/hadoop-1.2.1/hadoop-examples-1.2.1.jar wordcount /test /test-out
# 查看結果
~/hadoop-1.2.1/bin/hadoop dfs -cat /test-out/part-r-00000
| 現象 | 原因與解決 |
|---|---|
JAVA_HOME is not set | 未在 hadoop-env.sh 設定 export JAVA_HOME |
| SSH 仍需密碼 | 檢查 ~/.ssh 權限(700)、authorized_keys(600)、sshd_config 允許 PubkeyAuthentication |
| DataNode 啟動失敗 | 檢查 dfs.data.dir 目錄權限、磁碟空間、防火牆 |
| Web UI 打不開 | 關閉代理/VPN;檢查 netstat -ntlp | grep 500 確認埠監聽 |
| 版本不符 | Hadoop 1.x 與 2.x/3.x 配置差異大,本教學僅適用 1.2.x |
Hadoop 1.x 已停止維護,生產環境請使用 Hadoop 3.x(YARN、HA、擴展性大幅提升)。本文僅供學習經典架構參考。