安裝HADOOP叢集伺服器
1. 規劃
功能 | HOSTNAME | IP | 說明 |
Master | HDM01 | 192.168.1.1 | Namenode 兼datanode |
Slave | HDS02 | 192.168.1.2 | Datanode |
Slave | HDS03 | 192.168.1.3 | Datanode |
Client | HDC04 | 192.168.1.4 | HADOOP客戶端(HDFS/HIVE) |
2. 環境
2.1. 系統環境
安裝 centOS6.2 => 軟體工作站(softwareDevelopment Workstation)
3. Hadoop安裝
3.1. 安裝和配置SSH 、RSYNC( Root使用者)
安裝SSH和rsync 一般系統自帶了;
3.2. 建立Hadoop執行使用者( Root使用者)
一般我們不會經常使用root使用者執行hadoop,所以要建立一個平常執行和管理Hadoop的使用者;
Ø 建立hadoop使用者和使用者組
useradd hadoop
PS:master和slave節點機都要建立相同的使用者和使用者組,即在所有叢集伺服器上都要建hadoop使用者和使用者組。
3.3. 關閉防火牆( Root使用者)
在啟動前關閉叢集中所有機器的防火牆,不然會出現datanode開後又自動關閉。所以對叢集所有伺服器關閉防火牆:chkconfig iptables off
檢視防火牆狀態:service iptables status
永久關閉防火牆:chkconfig iptables off
檢視防火牆狀態:chkconfig --list iptables
3.4. 配置機器名和網路( Root使用者)
n 配置HOSTNAME
vi /etc/sysconfig/network,修改:HOSTNAME=hmaster
其他節點依次改為slave1,slave2…….不過必須和上面一致
驗證; 輸入命令hostname
n 配置網路IP
cd /etc/sysconfig/network-scripts
vi ifcfg-eth0
n 配置IP和HOSTNAME對映關係
vi /etc/hosts
[[email protected] ~]# more /etc/hosts
#127.0.0.1 localhostlocalhost.localdomain localhost4 #localhost4.localdomain4
::1 localhostlocalhost.localdomain localhost6 localhost6.localdomain6
192.168.1.1 HDM01
192.168.1.2 HDS02
192.168.1.3 HDS03
192.168.1.4 HDC04
3.5. 配置非root使用者免驗證登入SSH( hadoop使用者)
提示:Linux配置ssh是通過欺騙登入使用者名稱的。所以上面建立使用者的時候,我們都把3個節點的username都設定成hadoop,主要是使用者名稱必須一致
在hadoop使用者的home目錄,即 cd /home/hadoop下執行命令
用hadoop使用者登入(第 一/二/三步分別在每一個節點上都要執行)
第一步:ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
意思是讀取 id_dsa檔案預設 全部是yes安裝
和root使用者一樣,會發現多處2個檔案,一個是公開密匙,一個是訪問使用者名稱字資訊的
第二步:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
是把暴露出來的公共密匙按順序匯入authorized_keys中儲存
第三步:chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
ssh機制很嚴謹,對檔案的許可權要求非常嚴格
我們需要把.ssh資料夾的許可權改為700 ,預設是777
authorized_keys的許可權這裡是對的,600
第四步:在主節點上執行下列命令
ssh HDS02cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
ssh HDS03cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
scp [email protected]:/home/hadoop/.ssh/
最終authorized_keys檔案要有各個叢集伺服器的資訊
第五步:驗證
第一次會要求輸入密碼,完成後測試,每臺機都要求能聯通:
ssh HDM01
ssh HDS02
ssh HDS03
不輸入密碼 就表示成功了;
3.6. 安裝JDK( hadoop使用者)
檢查是否已安裝JDK: rpm -qa|grep jdk
檢查JAVA安裝目錄:whick java
檢查是否配置JAVA_HOME: env|grep JAVA_HOME
which java 和JAVA_HOME 路徑不一致,是做了LINK對映
[[email protected] ~]# su - hadoop
[[email protected] ~]$ rpm -qa|grep jdk
java-1.6.0-openjdk-javadoc-1.6.0.0-1.41.1.10.4.el6.x86_64
java-1.6.0-openjdk-devel-1.6.0.0-1.41.1.10.4.el6.x86_64
java-1.6.0-openjdk-1.6.0.0-1.41.1.10.4.el6.x86_64
[[email protected] ~]$ which java
/usr/bin/java
[[email protected] ~]$ ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 Feb 26 22:26 /usr/bin/java -> /etc/alternatives/java
[[email protected] ~]$ ls -l/etc/alternatives/java
lrwxrwxrwx. 1 root root 46 Feb 26 22:26 /etc/alternatives/java ->/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
[[email protected] ~]$ env|grep JAVA_HOME
JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
在當前使用者配置JAVA_HOME,在.bash_profile檔案增加藍色部分,最後
source /home/hadoop/.bash_profile,使生效
[email protected] ~]$ cd /home/hadoop/
[[email protected] ~]$ more .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startupprograms
PATH=$PATH:$HOME/bin
export PATH
JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME
export PATH
export CLASSPATH
[[email protected] ~]$
3.7. 安裝Hadoop( root使用者)
3.7.1. 安裝rpm包:
用rpm包安裝,目錄都是預設的比較規範
用root使用者: rpm -ivh /opt/colud/hadoop-1.2.1-1.x86_64.rpm
3.7.2. 配置Hadoop配置檔案
(每臺機器伺服器都要配置,且都是一樣的,配置完一臺其他的只需要拷貝,每臺機上的core-site.xml和mapred-site.xml都是配master伺服器的hostname,因為都是配置hadoop的入口)
core-site.xml:整個hadoop入口的配置
vi/etc/hadoop/core-site.xml,配置如下內容:
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmp</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://HDM01:9000</value>
</property>
vi /etc/hadoop/hdfs-site.xml,配置如下內容:
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
vi/etc/hadoop/mapred-site.xml,配置如下內容:
<property>
<name>mapred.job.tracker</name>
<value>HDM01:9001</value>
</property>
配置說明:
n core-site.xml
Ø hadoop.tmp.dir是hadoop檔案系統依賴的基礎配置,很多路徑都依賴它。它預設的位置是在/tmp/{$user}下面,但是在/tmp路徑下的儲存是不安全的,因為linux一次重啟,檔案就可能被刪除。
修改該引數後要格式NAMENODE:hadoop namenode -format
3.7.3. 配置Hadoop叢集配置檔案
(只需要配置namemode節點機,這裡的HDM01即做namenode也兼datanode,一般情況namenode要求獨立機器,namemode不兼datanode)
vi /etc/hadoop/masters,配置如下內容:
HDM01
vi /etc/hadoop/slaves,配置如下內容:
HDM01
HDS02
HDS03
3.7.4. 配置非ROOT使用者許可權
n (包含用非root使用者啟動Hadoop所需的額外項) 將/usr/sbin/下的以下指令碼檔案的owner設為testusr,且賦給owner全權rwx :
chownhadoop:hadoop /usr/sbin/hadoop-create-user.sh
chown hadoop:hadoop/usr/sbin/hadoop-daemon.sh
chownhadoop:hadoop /usr/sbin/hadoop-daemons.sh
chownhadoop:hadoop /usr/sbin/hadoop-setup-applications.sh
chownhadoop:hadoop /usr/sbin/hadoop-setup-conf.sh
chownhadoop:hadoop /usr/sbin/hadoop-setup-hdfs.sh
chown hadoop:hadoop/usr/sbin/hadoop-setup-single-node.sh
chownhadoop:hadoop /usr/sbin/hadoop-validate-setup.sh
chownhadoop:hadoop /usr/sbin/rcc
chownhadoop:hadoop /usr/sbin/slaves.sh
chownhadoop:hadoop /usr/sbin/start-all.sh
chownhadoop:hadoop /usr/sbin/start-balancer.sh
chownhadoop:hadoop /usr/sbin/start-dfs.sh
chownhadoop:hadoop /usr/sbin/start-jobhistoryserver.sh
chownhadoop:hadoop /usr/sbin/start-mapred.sh
chownhadoop:hadoop /usr/sbin/stop-all.sh
chownhadoop:hadoop /usr/sbin/stop-balancer.sh
chown hadoop:hadoop/usr/sbin/stop-dfs.sh
chownhadoop:hadoop /usr/sbin/stop-jobhistoryserver.sh
chownhadoop:hadoop /usr/sbin/stop-mapred.sh
chownhadoop:hadoop /usr/sbin/update-hadoop-env.sh
chmodu+rwx /usr/sbin/hadoop-create-user.sh
chmodu+rwx /usr/sbin/hadoop-daemon.sh
chmodu+rwx /usr/sbin/hadoop-daemons.sh
chmodu+rwx /usr/sbin/hadoop-setup-applications.sh
chmodu+rwx /usr/sbin/hadoop-setup-conf.sh
chmodu+rwx /usr/sbin/hadoop-setup-hdfs.sh
chmodu+rwx /usr/sbin/hadoop-setup-single-node.sh
chmodu+rwx /usr/sbin/hadoop-validate-setup.sh
chmodu+rwx /usr/sbin/rcc
chmodu+rwx /usr/sbin/slaves.sh
chmodu+rwx /usr/sbin/start-all.sh
chmodu+rwx /usr/sbin/start-balancer.sh
chmodu+rwx /usr/sbin/start-dfs.sh
chmodu+rwx /usr/sbin/start-jobhistoryserver.sh
chmod u+rwx/usr/sbin/start-mapred.sh
chmodu+rwx /usr/sbin/stop-all.sh
chmodu+rwx /usr/sbin/stop-balancer.sh
chmodu+rwx /usr/sbin/stop-dfs.sh
chmodu+rwx /usr/sbin/stop-jobhistoryserver.sh
chmodu+rwx /usr/sbin/stop-mapred.sh
chmodu+rwx /usr/sbin/update-hadoop-env.sh
n 將/usr/bin/下的hadoop設為所有人(不是其他人)可讀可執行。即chmod 555(不是chmod 005)
chmod555 /usr/bin/hadoop
n /var/log/hadoop/及其下(迴圈)的owner設為testusr,且賦給owner全權rwx
/var/run/hadoop/及其下(迴圈)的owner設為testusr,且賦給owner全權rwx
/home/hadoop/及其下(迴圈)的owner設為testusr,且owner許可權設為“rwxr-xr-x”,設為更大許可權不行,主要是因為/home/hadoop/tmp/dfs/data的許可權需要為“rwxr-xr-x”
chown-R hadoop:hadoop /var/log/hadoop/
chown-R hadoop:hadoop /var/run/hadoop/
chown-R hadoop:hadoop /home/hadoop/
chmod-R u+rwx /var/log/hadoop/
chmod-R u+rwx /var/run/hadoop/
chmod-R u+rwx /home/hadoop/
3.7.5. 配置HADOOP的JAVA環境
配置Hadoop的java環境與env的JAVA_HOME保持一致,檔案/etc/hadoop/hadoop-env.sh
# The java implementation to use.
#exportJAVA_HOME=/usr/java/default
exportJAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
3.8. 格式化HDFS( hadoop使用者)
hadoop namenode-format(用hadoop使用者)
重新format時,系統提示如下:
Re-formatfilesystem in /home/hadoop/tmp/dfs/name ? (Y or N)
必須輸入大寫Y,輸入小寫y不會報輸入錯誤,但format出錯。
chown -R hadoop:hadoop /home/hadoop/
chmod -R 755 /home/hadoop/
3.9. 啟動Hadoop( hadoop使用者)
Hadoop使用者登入
命令: start-all.sh (記得關閉所有的防火牆)
3.9.1. 驗證hadoop
(1)驗證方法一:用"jps"命令
在Master上用 java自帶的小工具jps檢視5個程序都在。
在Slave1上用jps檢視程序。
如果在檢視Slave機器中發現"DataNode"和"TaskTracker"沒有起來時,先檢視一下日誌的,如果是"namespaceID"不一致問題,採用"常見問題FAQ6.2"進行解決,如果是"No routeto host"問題,採用"常見問題FAQ6.3"進行解決。
(2)驗證方式二:用"hadoop dfsadmin-report"
用這個命令可以檢視Hadoop叢集的狀態。
Master伺服器的狀態:
Slave伺服器的狀態
4.4 網頁檢視叢集
1)訪問"http:192.168.1.1:50030"
2)訪問"http: 192.168.1.1:50070"
3.10. HADOOP語法
3.10.1. 啟動/關閉
Ø Start-all.sh / stop-all.sh
Ø
3.10.2. 程序
Ø Jps
Master節點:namenode/tasktracker
(如果Master不兼做Slave, 不會出現datanode/Tasktracker
Slave節點:datanode/Tasktracker
說明:
JobTracker 對應於 NameNode
TaskTracker對應於DataNode
DataNode和NameNode是針對資料存放來而言的
JobTracker和TaskTracker是對於MapReduce執行而言的
mapreduce中幾個主要概念,mapreduce整體上可以分為這麼幾條執行線索:
jobclient,JobTracker與TaskTracker。
1、JobClient會在使用者端通過JobClient類將應用已經配置引數打包成jar檔案儲存到hdfs,並把路徑提交到Jobtracker,然後由JobTracker建立每個Task(即MapTask和ReduceTask)並將它們分發到各個TaskTracker服務中去執行
2、JobTracker是一個master服務,軟體啟動之後JobTracker接收Job,負責排程Job的每一個子任務task運行於TaskTracker上,並監控它們,如果發現有失敗的task就重新執行它。一般情況應該把JobTracker部署在單獨的機器上。
3、TaskTracker是執行在多個節點上的slaver服務。TaskTracker主動與JobTracker通訊,接收作業,並負責直接執行每一個任務。TaskTracker都需要執行在HDFS的DataNode上
3.10.3. 檔案系統HDFS
n 檢視檔案系統根目錄:
Hadoop fs –ls /
檔案系統的目錄和檔案是不能再本地系統檢視到的;相當於兩個不同的系統;
4. 常見錯誤
現象:namenode端的namenodelog一直報could only be replicated to 0 nodes,instead of 1 錯誤,表示沒有一個可用的節點。datanode端一直報錯:Server at /10.0.0.21:54310 not availableyet, Zzzzz...2011-03-03 11:33:10,047 INFO org.apache.hadoop.ipc.Client:Retrying connect to server: /10.0.0.21:54310,一直嘗試連線master但連線不上。
改正:在namenode中配置master 和 jobtracker的ip時使用的是localhost ,將這兩個改成namenode以及jobtracker本機的實際ip後,問題得以解決。具體的原因我也不太明白。
當然這個錯誤還有其他的幾個原因(摘自網上):
dfs的空間不足。
namenode執行在safemodel下。
namenode所在機器的防火牆開著是的datanode無法訪問master 。
Ø HADOOP 重新格式化檔案後,要刪除 cd /home/hadop/tmp/data rm –rf data
Ø Name node is in safe mode.
在分散式檔案系統啟動的時候,開始的時候會有安全模式,當分散式檔案系統處於安全模式的情況下,檔案系統中的內容不允許修改也不允許刪除,直到安全模式結束。安全模式主要是為了系統啟動的時候檢查各個DataNode上資料塊的有效性,同時根據策略必要的複製或者刪除部分資料塊。執行期通過命令也可以進入安全模式。在實踐過程中,系統啟動的時候去修改和刪除檔案也會有安全模式不允許修改的出錯提示,只需要等待一會兒即可。現在就清楚了,那現在要解決這個問題,我想讓Hadoop不處在safe mode 模式下,能不能不用等,直接解決呢?答案是可以的,只要在Hadoop的目錄下輸入:bin/hadoop dfsadmin -safemode leave關閉安全模式就可以了。。。
4.2. 用其他使用者呼叫hadoop或HIVE
[[email protected] ~]$ hive
Exception in thread "main"java.io.IOException: Permission denied
at java.io.UnixFileSystem.createFileExclusively(Native Method)
at java.io.File.checkAndCreate(File.java:1716)
at java.io.File.createTempFile(File.java:1804)
at org.apache.hadoop.util.RunJar.main(RunJar.java:119)
該問題是因為:
org.apache.hadoop.util.RunJar.main 裡面要建立臨時檔案:
hadoop.tmp.dir這個目錄存放的是解壓後的jar檔案等臨時檔案。
那麼hadoop.tmp.dir這個變數是在哪裡定義的呢?於是檢視本機提交job時用到的hadoop配置檔案core-site.xml:發現hadoop.tmp.dir是 /home/hadoop/hadoop-data 這個目錄,而當前的admin使用者確實是沒有許可權訪問這個目錄的。於是改下配置檔案就可以了。
Chmod –R 777 /home/hadoop/hadoop-data
4.3. 用其他使用者呼叫hadoop或HIVE
啟動HIVE出現連結不上mysql
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:Specified key was too long; max key length is 767 bytes
解決方案:到mysql中的hive資料庫裡執行 alter database hivedb character setlatin1;改變hive元資料庫的字符集,問題就可以解決!