Ubuntu 12.10 +Hadoop 1.2.1版本集群配置
一、引言
Hadoop是一種分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序,充分利用集群的威力高速運算和存儲。Hadoop 1.2.1版本下載地址:http://apache.dataguru.cn/hadoop/common/hadoop-1.2.1/
二、準備安裝環境
我的本機是環境是windows8.1系統 +VMvare9虛擬機。VMvare中虛擬了3個ubuntu 12.10的系統,JDK版本為1.7.0_17.集群環境為一個master,兩個slave,節點代號分別為node1,node2,node3.保證以下ip地址可以相互ping通,并且在/etc/hosts中進行配置
機器名 | Ip地址 | 作用 |
node1 | 202.193.74.173 | NameNode,JobTraker |
node2 | 202.193.75.231 | DataNode,TaskTraker |
node3 |
202.193.74.3 |
DataNode,TaskTraker |
三、安裝環境
1、首先修改機器名
使用root權限,使用命令:
- sudo vi /etc/hosts
其中node1、node2、node3的/etc/hosts配置為:
/etc/hosts的配置很重要,如果配置的不合適會出各種問題,會影響到后面的SSH配置以及Hadoop的DataNode節點的啟動。
2、安裝JDK
Ubuntu下的JDK配置請參考: http://developer.51cto.com/art/200907/135215.htm
3、添加用戶
在root權限下使用以下命令添加hadoop用戶,在三個虛擬機上都添加這個用戶
- sudo adduser hadoop
將下載到的hadoop-1.2.1.tar文件放到/home/hadoop/目錄下解壓,然后修改解壓后的文件夾的權限,命令如下:
- sudo tar -xvzf hadoop-1.2.1.tar #解壓命令
- chown -R hadoop:hadoop hadoop-1.2.1(文件夾名)
#p#
4、安裝和配置SSH
4.1)在三臺實驗機器上使用以下命令安裝ssh:
- sudo apt-get install ssh
安裝以后執行測試:
- netstat -nat #查看22端口是否開啟
- ssh localhost #測試ssh是否成功連接
輸入當前用戶名和密碼按回車確認,說明安裝成功,同時ssh登陸需要密碼。
這種默認安裝方式完后,默認配置文件是在/etc/ssh/目錄下。sshd配置文件是:/etc/ssh/sshd_config
4.2)配置SSH無密碼訪問
在Hadoop啟動以后,Namenode是通過SSH(Secure Shell)來啟動和停止各個datanode上的各種守護進程的,這就須要在節點之間執行指令的時候是不須要輸入密碼的形式,故我們須要配置SSH運用無密碼公鑰認證的形式。
以本文中的三臺機器為例,現在node1是主節點,他須要連接node2和node3。須要確定每臺機器上都安裝了ssh,并且datanode機器上sshd服務已經啟動。
( 說明:hadoop@hadoop~]$ssh-keygen -t rsa
這個命令將為hadoop上的用戶hadoop生成其密鑰對,詢問其保存路徑時直接回車采用默認路徑,當提示要為生成的密鑰輸入passphrase的時候,直接回車,也就是將其設定為空密碼。生成的密鑰對id_rsa,id_rsa.pub,默認存儲在/home/hadoop/.ssh目錄下然后將id_rsa.pub的內容復制到每個機器(也包括本機)的/home/dbrg/.ssh/authorized_keys文件中,如果機器上已經有authorized_keys這個文件了,就在文件末尾加上id_rsa.pub中的內容,如果沒有authorized_keys這個文件,直接復制過去就行.)
4.3)首先設置namenode的ssh為無需密碼自動登陸,
切換到hadoop用戶( 保證用戶hadoop可以無需密碼登錄,因為我們后面安裝的hadoop屬主是hadoop用戶。)
- su hadoop
- cd /home/hadoop
- ssh-keygen -t rsa
最后一個命令輸入完成以后一直按回車,
完成后會在/home/hadoop/目錄下產生完全隱藏的文件夾.ssh,
進入.ssh文件夾,然后將id_rsa.pub復制到authorized_keys文件,命令如下,
- cd .ssh # 進入.ssh目錄
- cp id_rsa.pub authorized_keys #生成authorized_keys文件
- ssh localhost #測試無密碼登陸,第一可能需要密碼
- ssh node1 #同上一個命令一樣
node1無密碼登陸的效果:
4.4)配置node1無密碼訪問node2和node3
首先以node2為例,node3參照node2的方法
在node2中執行以下命令:
- su hadoop
- cd /home/hadoop
- ssh-keygen -t rsa #生成公鑰和私鑰,一路回車
在node1中進入/home/hadoop/.ssh目錄中,復制authorized_keys到node2的.ssh文件夾中
執行以下命令
- scp authorized_keys hadoop@node2:/home/hadoop/.ssh #復制authorized_keys到node2的.ssh目錄中去
修改已經傳輸到node2的authorized_keys的許可權限,需要root權限
- chmod 644 authorized_keys
- ssh node2 #測試無密碼訪問node2
node3同上面的執行步驟
#p#
5、安裝hadoop
將當前用戶切換到hadoop用戶,如果集群內機器的環境完全一樣,可以在一臺機器上配置好,然后把配置好的軟件即hadoop-0.20.203整個文件夾拷貝到其他機器的相同位置即可。 可以將Master上的Hadoop通過scp拷貝到每一個Slave相同的目錄下,同時根據每一個Slave的Java_HOME 的不同修改其hadoop-env.sh 。
5.1)配置conf/hadoop-env.sh文件
切換到hadoop-1.2.1/conf目錄下,添加JAVA_HOME路徑
5.2)配置/conf/core-site.xml
- <?xml version="1.0"?>
- <?xml-stylesheet type="text/xsl"href="configuration.xsl"?>
- <configuration>
- <property>
- <name>fs.default.name</name>
- <value>hdfs://node1:49000</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/home/hadoop/hadoop_home/var</value>
- </property>
- </configuration>
fs.default.name是NameNode的URI。hdfs://主機名:端口/
hadoop.tmp.dir :Hadoop的默認臨時路徑,這個最好配置,如果在新增節點或者其他情況下莫名其妙的DataNode啟動不了,就刪除此文件中的tmp目錄即可。不過如果刪除了NameNode機器的此目錄,那么就需要重新執行NameNode格式化的命令。
5.3)配置/conf/mapred-site.xml
- <?xmlversionxmlversionxmlversionxmlversion="1.0"?>
- <?xml-stylesheettypexml-stylesheettypexml-stylesheettypexml-stylesheettype="text/xsl" href="configuration.xsl"?>
- <configuration>
- <property>
- <name>mapred.job.tracker</name>
- <value>node1:49001</value>
- </property>
- <property>
- <name>mapred.local.dir</name>
- <value>/home/hadoop/hadoop_home/var</value>
- </property>
- </configuration>
mapred.job.tracker是JobTracker的主機(或者IP)和端口。主機:端口。其中/home/hadoop/hadoop_home/var目錄需要提前創建,并且注意用chown -R 命令來修改目錄權限
5.4)配置/conf/hdfs-site.xml
- <?xmlversionxmlversionxmlversionxmlversion="1.0"?>
- <?xml-stylesheettypexml-stylesheettypexml-stylesheettypexml-stylesheettype="text/xsl" href="configuration.xsl"?>
- <configuration>
- <property>
- <name>dfs.name.dir</name>
- <value>/home/hadoop/name1</value> #hadoop的name目錄路徑
- <description> </description>
- </property>
- <property>
- <name>dfs.data.dir</name>
- <value>/home/hadoop/data1</value>
- <description> </description>
- </property>
- <property>
- <name>dfs.replication</name>
- <!-- 我們的集群又兩個結點,所以rep兩份 -->
- <value>2</value>
- </property>
- </configuration>
dfs.name.dir是NameNode持久存儲名字空間及事務日志的本地文件系統路徑。 當這個值是一個逗號分割的目錄列表時,nametable數據將會被復制到所有目錄中做冗余備份。
dfs.replication是數據需要備份的數量,默認是3,如果此數大于集群的機器數會出錯。
此處的name1和data1等目錄不能提前創建,如果提前創建會出問題。
5.5)配置master和slaves主從節點
配置conf/masters和conf/slaves來設置主從結點,注意最好使用主機名,并且保證機器之間通過主機名可以互相訪問,每個主機名一行。
vi masters:
輸入:
node1
vi slaves:
輸入:
node2
node3
配置結束,把配置好的hadoop文件夾拷貝到其他集群的機器中,并且保證上面的配置對于其他機器而言正確,
- scp -r /home/hadoop/hadoop-1.2.1 root@node2:/home/hadoop/ #輸入node2的root密碼即可傳輸,如果java安裝路徑不一樣,需要修改conf/hadoop-env.sh
安裝結束
#p#
四、Hadoop啟動與測試
1、格式化一個新的分布式文件系統
- cd hadoop-1.2.1
- bin/hadoop namenode -format #格式化文件系統
成功的情況下輸入一下(我的hadoop已經使用,不想重新格式化選擇了No)
2、啟動所有節點
- bin/start-all.sh
3、查看集群的狀態:
- hadoop dfsadmin -report
4、Hadoop測試
瀏覽NameNode和JobTracker的網絡接口,它們的地址默認為:
NameNode - http://node1:50070/
JobTracker - http://node1:50030/
要想檢查守護進程是否正在運行,可以使用 jps 命令(這是用于 JVM 進程的ps 實用程序)。這個命令列出 5 個守護進程及其進程標識符。
將輸入文件拷貝到分布式文件系統:
- bin/hadoop fs -mkdir input #創建input目錄
- bin/hadoop fs -put conf/core-site.xml input #拷貝文件到input目錄
- bin/hadoop jar hadoop-examples-1.2.1.jar grep input output 'dfs[a-z]' #使用Hadoop運行示例
到此為止,hadoop已經配置完成,當然在配置的過程中會遇到各種錯誤,主要都是權限問題和網絡ip配置問題,請注意。
五、Hadoop一些常用的操作命令
1、hdfs常用操作:
hadoopdfs -ls 列出HDFS下的文件
hadoop dfs -ls in 列出HDFS下某個文檔中的文件
hadoop dfs -put test1.txt test 上傳文件到指定目錄并且重新命名,只有所有的DataNode都接收完數據才算成功
hadoop dfs -get in getin 從HDFS獲取文件并且重新命名為getin,同put一樣可操作文件也可操作目錄
hadoop dfs -rmr out 刪除指定文件從HDFS上
hadoop dfs -cat in/* 查看HDFS上in目錄的內容
hadoop dfsadmin -report 查看HDFS的基本統計信息,結果如下
hadoop dfsadmin -safemode leave 退出安全模式
hadoop dfsadmin -safemode enter 進入安全模式
2、負載均衡
start-balancer.sh,可以使DataNode節點上選擇策略重新平衡DataNode上的數據塊的分布。
祝大家能夠順利配置好hadoop運行環境,有問題可以留言一起探討。