Apache Hadoop1.1.1+Apache Oozie3.3.2搭建安裝過程詳解(親測)
最近需要定製的原因,需要將原來Cloudera版本的Hadoop更改為Apache版本的Hadoop和Oozie,對官方文件的學習,發現Hadoop1.1.1和Oozie3.3.2的組合比較好,所以,經過幾天的搭建,終於成功了,現在把心得分享出來,希望給需要的朋友幫助。如果需要轉載請註明出處,謝謝!
1.Apache版本HADOOP雲端計算平臺環境搭建
Hadoop叢集環境包含1臺機器,在每臺機器上執行4臺虛擬機器,是一個典型的主從式(Master-Slaves)結構。叢集包含一個主控節點(Master)和4個從屬節點(Slave)。在主從式結構中,主節點一般負責叢集管理、任務排程和負載平衡等,從節點則執行來自主節點的計算和儲存任務。
該叢集環境具體的軟硬體和網路配置情況見表3.1。
表3.1 叢集詳細軟硬體和網路配置
序號 |
主機名 |
網路地址 |
作業系統 |
1 |
Master |
192.168.137.2 |
Centos6.4-x64 |
2 |
Slave1 |
192.168.137.3 |
Centos6.4-x64 |
3 |
Slave2 |
192.168.137.4 |
Hadoop是Apache開源組織的一個分散式計算框架,可以在大量廉價硬體裝置組成的叢集上執行應用程式,併為應用程式提供了一組穩定可靠的介面,旨在構建一個具有高可靠性和良好擴充套件性的分散式系統。隨著雲端計算技術的逐漸流行與普及,該專案被越來越多的個人和企業所運用。Hadoop專案的核心是HDFS、MapReduce和HBase,它們分別是Google雲端計算核心技術GFS(Google File System)、MapReduce和Bigtable的開源實現。
1、hosts的配置
這一步是必須的,因為這裡需要對使用環境的user做具體的分配和指定。
2、更改hosts
首先需要設定IP地址:
#ifconfig //查詢現在的ip地址
然後通過設定VPN,來設定各機器的IP地址,具體過程這裡就不詳述了。
現在需要配置每臺電腦的hosts名稱,使用下列指令:
#vim /etc/sysconfig/network
在其中新增這樣的內容:
HOSTNAME=Master.Hadoop
(備註:Slave機器則改為相應的Slave1.Hadoop…….)
3、配置hosts檔案
#vim /etc/hosts
在其中新增下面幾行內容:
192.168.137.2 Master.Hadoop
192.168.137.3 Slave1.Hadoop
192.168.137.4 Slave2.Hadoop
4、驗證設定是否啟用
我們在Master.Hadoop對機器為"Slave1.Hadoop"的主機名進行ping通測試,看是否能測試成功。
Master.Hadoop$ping192.168.137.3
(備註:對於其他機器之間的測試同理)
5、新增一個使用者
#adduser hadoop
#passwd hadoop //設定hadoop的密碼
1.3.3 ssh無密碼驗證設定(以下設定全部在hadoop使用者下進行)
Hadoop執行過程中需要管理遠端Hadoop守護程序,在Hadoop啟動以後,NameNode是通過SSH(Secure Shell)來啟動和停止各個DataNode上的各種守護程序的。這就必須在節點之間執行指令的時候是不需要輸入密碼的形式,故我們需要配置SSH運用無密碼公鑰認證的形式,這樣NameNode使用SSH無密碼登入並啟動DataName程序,同樣原理,DataNode上也能使用SSH無密碼登入到NameNode。
1、安裝和啟動ssh
可以通過下面命令檢視是否已經安裝ssh和rsync,顯示如下:
$rpm –qa | grep openssh
$rpm –qa | grep rsync
2、Master機器上生成密碼對
在Master節點上執行以下命令:
$ssh-keygen –t rsa –P ''
(備註:這裡的“’”是單引號,上面指令最後使用了兩個單引號)
這條命令是生成其無密碼金鑰對,詢問其儲存路徑時直接回車採用預設路徑。生成的金鑰對:id_rsa和id_rsa.pub,預設儲存在"~/.ssh"目錄下。
檢視"/usr/hadoop/"下是否有".ssh"資料夾,且".ssh"檔案下是否有兩個剛生產的無密碼金鑰對。接著在Master節點上做如下配置,把id_rsa.pub追加到授權的key裡面去。使用下面的指令:
$cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
在驗證前,需要做兩件事兒。第一件事兒是修改檔案"authorized_keys"許可權(許可權的設定非常重要,因為不安全的設定安全設定,會讓你不能使用RSA功能),另一件事兒是用root使用者設定"/etc/ssh/sshd_config"的內容。使其無密碼登入有效。
3、修改檔案"authorized_keys"的許可權
使用下列指令:
$chmod 600~/.ssh/authorized_keys
4、設定SSH配置
用root使用者登入伺服器修改SSH配置檔案"/etc/ssh/sshd_config"的下列內容,去掉下面幾句話前面的註釋符“#”。
RSAAuthentication yes # 啟用 RSA 認證
PubkeyAuthentication yes # 啟用公鑰私鑰配對認證方式
AuthorizedKeysFile .ssh/authorized_keys # 公鑰檔案路徑
設定完之後記得重啟SSH服務,才能使剛才設定有效。
$service sshd restart
退出root登入,使用hadoop普通使用者驗證是否成功。
#ssh localhost
5、在Slave機器上生成密碼對
在Slave1.Hadoop上執行下列指令:
$ssh-keygen –t –rsa –P ''
在Slave1.Hadoop機器中生成~/.ssh檔案。然後在把本機生成的密碼對載入到本機上的authorized_keys
$cat ~/.ssh/id_rsa.pub>> ~/.ssh/authorized_keys
然後更改authorized_keys檔案的許可權。
$chmod 600~/.ssh/authorized_keys
(備註:如果有多個Slave,對多個Slave進行相同的操作即可,Slave2.Hadoop,Slave2.Hadoop……)
6、在Master和Slave之間追加授權密碼
Master.Hadoop$cd ~/.ssh
Master.Hadoop$scp./id_rsa.pub [email protected]:~/
Slave1.Hadoop$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
Slave1.Hadoop$scp ~/.ssh/id_rsa.pub [email protected]:~/
Master.Hadoop$cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
(備註:如果有多個Slave,對多個Slave和Master之間進行相同的操作即可)
用root使用者登入伺服器修改SSH配置檔案"/etc/ssh/sshd_config"的下列內容,去掉下面幾句話前面的註釋符“#”。
RSAAuthentication yes # 啟用 RSA 認證
PubkeyAuthentication yes # 啟用公鑰私鑰配對認證方式
AuthorizedKeysFile .ssh/authorized_keys # 公鑰檔案路徑(和上面生成的檔案同)
設定完之後記得重啟SSH服務,才能使剛才設定有效。
$service sshd restart
退出root登入,使用hadoop普通使用者驗證是否成功。
#ssh localhost
7、驗證ssh無密碼登陸設定成功
Master.Hadoop$ssh Slave1.Hadoop
這時候如果不需要輸入Slave1.Hadoop主機的登陸密碼,就說明設定成功了,否則,說明前面的設定出錯了,請細心檢查下。
同理,再輸入下列指令,檢驗Slave對Master的設定是否成功:
Slave1.Hadoop$sshMaster.Hadoop
1.3.4 JAVA環境安裝(所有主機均要安裝,並且以下操作在root使用者下執行)
1、下載jdk
從oracle官網下載jdk1.7.0_21,放到根目錄下/。
2、安裝jdk
執行下列指令:
#cd /usr
#mkdir java
#cp / jdk-7u21-linux-x64.rpm/usr/java/
#cd /usr/java
#rpm –ivh jdk-7u21-linux-x64.rpm
然後會進行rpm安裝的過程。
3、設定java環境變數
編輯"/etc/profile"檔案,在後面新增Java的"JAVA_HOME"、"CLASSPATH"以及"PATH"內容。
首先,編輯"/etc/profile"檔案
#vim /etc/profile
其次,新增Java環境變數
在"/etc/profile"檔案的尾部新增以下內容:
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_21
export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
儲存並退出,執行下面命令使其配置立即生效。
#source /etc/profile
4、驗證安裝和配置是否成功
輸入下列指令:
#java -version
然後寫一個小的JAVA程式,編譯執行下是否正確執行,如果可以,則配置成功,否則,JAVA的配置過程可能有問題,需要檢查。
所有的機器上都要安裝hadoop,現在就先在Master伺服器安裝,然後其他伺服器按照步驟重複進行即可。安裝和配置hadoop需要以"root"的身份進行。
用root使用者登入"Master.Hadoop"機器,檢視我們用SSH上傳至"/"目錄下的"hadoop-1.1.1.tar.gz",把該檔案複製到“/usr/”目錄下。
1、進入"/usr/"目錄下,用下面命令把"hadoop-1.1.1.tar.gz "進行解壓,並將其命名為"hadoop",把該資料夾的讀許可權分配給普通使用者hadoop,然後刪除" hadoop-1.1.1.tar.gz"安裝包。
#cd /usr
#tar -zxvf hadoop-1.1.1.tar.gz
#mv hadoop-1.1.1 hadoop
#chown -R hadoop:hadoop hadoop
#rm -r hadoop-1.1.1.tar.gz
2、把Hadoop的安裝路徑新增到"/etc/profile"中,修改"/etc/profile"檔案(配置java環境變數的檔案),將以下語句新增到末尾,並使其有效:
3、在"/usr/hadoop"建立"tmp"資料夾
#mkdir /usr/hadoop/tmp
4、配置"/etc/profile"
#vim /etc/profile
# set hadoop path
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH:$HADOOP_HOME/bin
重啟"/etc/profile"
#source /etc/profile
5、配置hadoop
需要配置hadoop的檔案,首先,配置hadoop-env.sh
該"hadoop-env.sh"檔案位於"/usr/hadoop/conf"目錄下。
在檔案的末尾新增下面內容。
# set java environment
export JAVA_HOME=/usr/java/jdk1.7.0_21
Hadoop配置檔案在conf目錄下,之前的版本的配置檔案主要是Hadoop-default.xml和Hadoop-site.xml。由於Hadoop發展迅速,程式碼量急劇增加,程式碼開發分為了core,hdfs和map/reduce三部分,配置檔案也被分成了三個core-site.xml、hdfs-site.xml、mapred-site.xml。core-site.xml和hdfs-site.xml是站在HDFS角度上配置檔案;core-site.xml和mapred-site.xml是站在MapReduce角度上配置檔案。
其次是配置core-site.xml檔案,修改Hadoop核心配置檔案core-site.xml,這裡配置的是HDFS的地址和埠號。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/hadoop/tmp</value>
(備註:請先在 /usr/hadoop 目錄下建立 tmp 資料夾)
<description>A base for other temporary directories.</description>
</property>
<!-- file system properties -->
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.137.2:9000</value>
</property>
</configuration>
(備註:如沒有配置hadoop.tmp.dir引數,此時系統預設的臨時目錄為:/tmp/hadoo-hadoop。而這個目錄在每次重啟後都會被幹掉,必須重新執行format才行,否則會出錯。)
然後是配置hdfs-site.xml檔案,修改Hadoop中HDFS的配置,配置的備份方式預設為1。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
(備註:replication 是資料副本數量,預設為3,salve少於3臺就會報錯)
</property>
<configuration>
最後,配置mapred-site.xml檔案,修改Hadoop中MapReduce的配置檔案,配置的是JobTracker的地址和埠。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>http://192.168.137.2:9001</value>
</property>
</configuration>
下面需要配置masters檔案和slaves檔案,對於masters檔案,去掉"localhost",改成本叢集中主節點的IP地址:192.168.137.2;對於slaves檔案(Master主機特有),去掉"localhost",加入叢集中所有Slave機器的IP,也是每行一個。
192.168.137.3
192.168.137.4
現在在Master機器上的Hadoop配置就結束了,剩下的就是配置Slave機器上的Hadoop。將 Master上配置好的hadoop所在資料夾"/usr/hadoop"複製到所有的Slave的"/usr"目錄下(實際上Slave機器上的slavers檔案是不必要的, 複製了也沒問題)。用下面命令格式進行。(備註:此時使用者可以為hadoop也可以為root)
#scp -r /usr/hadoop [email protected]:/usr/
#scp -r /usr/hadoop [email protected]:/usr/
當然不管是使用者root還是hadoop,雖然Master機器上的"/usr/hadoop"資料夾使用者hadoop有許可權,但是Slave1上的hadoop使用者卻沒有"/usr"許可權,所以沒有建立資料夾的許可權。所以無論是哪個使用者進行拷貝,右面都是"[email protected]機器IP"格式。因為我們只是建立起了hadoop使用者的SSH無密碼連線,所以用root進行"scp"時,扔提示讓你輸入"Slave1.Hadoop"伺服器使用者root的密碼。
hadoop資料夾確實已經複製了,但是我們發現hadoop許可權是root,所以我們現在要給"Slave1.Hadoop"伺服器上的使用者hadoop新增對"/usr/hadoop"讀許可權。以root使用者登入"Slave1.Hadoop",執行下面命令。
#chown -R hadoop:hadoop hadoop
接著在"Slave1 .Hadoop"上修改"/etc/profile"檔案(配置 java 環境變數的檔案),將以下語句新增到末尾,並使其有效(source /etc/profile):
# set hadoop environment
export HADOOP_HOME=/usr/hadoop
export PATH=$PATH :$HADOOP_HOME/bin
1.3.6 啟動及驗證
1、格式化HDFS檔案系統
在"Master.Hadoop"上使用普通使用者hadoop進行操作。(備註:只需一次,下次啟動不再需要格式化,只需 start-all.sh)
$hadoop namenode –format
2、啟動hadoop
在啟動前關閉叢集中所有機器的防火牆,不然會出現datanode開後又自動關閉。
$service iptables stop
使用下面命令啟動。
$start-all.sh
啟動 hadoop成功後,在 Master 中的 tmp 資料夾中生成了 dfs 資料夾,在Slave 中的 tmp 資料夾中均生成了 dfs 資料夾和 mapred 資料夾。
到此為止,hadoop雲端計算平臺配置完畢。
oozie是一種Java Web應用程式,它執行在Javaservlet容器——即Tomcat中,並使用資料庫來儲存以下內容:
• 工作流定義
• 當前執行的工作流例項,包括例項的狀態和變數
Oozie工作流是放置在控制依賴DAG(有向無環圖 DirectAcyclic Graph)中的一組動作(例如,Hadoop的Map/Reduce作業、Pig作業等),其中指定了動作執行的順序。我們會使用hPDL(一種XML流程定義語言)來描述這個圖。
hPDL是一種很簡潔的語言,只會使用少數流程控制和動作節點。控制節點會定義執行的流程,幷包含工作流的起點和終點(start、end和fail節點)以及控制工作流執行路徑的機制(decision、fork和join節點)。動作節點是一些機制,通過它們工作流會觸發執行計算或者處理任務。Oozie為以下型別的動作提供支援:Hadoop map-reduce、Hadoop檔案系統、Pig、Java和Oozie的子工作流(SSH動作已經從Oozie schema 0.2之後的版本中移除了)。
所有由動作節點觸發的計算和處理任務都不在Oozie之中——它們是由Hadoop的Map/Reduce框架執行的。這種方法讓Oozie可以支援現存的Hadoop用於負載平衡、災難恢復的機制。這些任務主要是非同步執行的(只有檔案系統動作例外,它是同步處理的)。這意味著對於大多數工作流動作觸發的計算或處理任務的型別來說,在工作流操作轉換到工作流的下一個節點之前都需要等待,直到計算或處理任務結束了之後才能夠繼續。Oozie可以通過兩種不同的方式來檢測計算或處理任務是否完成,也就是回撥和輪詢。當Oozie啟動了計算或處理任務的時候,它會為任務提供唯一的回撥URL,然後任務會在完成的時候傳送通知給特定的URL。在任務無法觸發回撥URL的情況下(可能是因為任何原因,比方說網路閃斷),或者當任務的型別無法在完成時觸發回撥URL的時候,Oozie有一種機制,可以對計算或處理任務進行輪詢,從而保證能夠完成任務。
Oozie工作流可以引數化(在工作流定義中使用像${inputDir}之類的變數)。在提交工作流操作的時候,我們必須提供引數值。如果經過合適地引數化(比方說,使用不同的輸出目錄),那麼多個同樣的工作流操作可以併發。
一些工作流是根據需要觸發的,但是大多數情況下,我們有必要基於一定的時間段和(或)資料可用性和(或)外部事件來執行它們。Oozie協調系統(Coordinatorsystem)讓使用者可以基於這些引數來定義工作流執行計劃。Oozie協調程式讓我們可以以謂詞的方式對工作流執行觸發器進行建模,那可以指向資料、事件和(或)外部事件。工作流作業會在謂詞得到滿足的時候啟動。
經常我們還需要連線定時執行、但時間間隔不同的工作流操作。多個隨後執行的工作流的輸出會成為下一個工作流的輸入。把這些工作流連線在一起,會讓系統把它作為資料應用的管道來引用。Oozie協調程式支援建立這樣的資料應用管道。
1、先下載Oozie,下載後解壓oozie-3.3.2.tar.gz到根目錄下:
獲取檔案“oozie-3.3.2”,放到目錄“/”下。並重命名為oozie。
這個時候執行命令:
#./bin/mkdistro.sh–DskipTests
2、下載ext-2.2.zip,下載檔案“ext-2.2”,放到目錄“/”下。
3、設定HADOOP的配置檔案
在/usr/hadoop/conf/core-site.xml檔案中加入下列內容:
<!-- OOZIE -->
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>192.168.137.2</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>hadoop</value>
</property>
修改完成後,新建一個資料夾/usr/oozie/libext/將ext-2.2.zip放到該目錄下。
4、將oozie資料夾複製到/usr/目錄下面。
5、拷貝HADOOP的JAR包到oozie。
將./hadooplibs/hadoop-1/資料夾下的所有JAR包複製到剛才新建的libext資料夾下。
6、拷貝ext-2.2.zip檔案到./webapp/下並且解壓到該目錄下。
7、建立檔案oozie.war。執行命令:
/usr/oozie/bin/oozie-setup.sh-extjs /oozie/webapp/src/main/webapp/ext-2.2.zip
顯示:Specified Oozie WAR '/usr/oozie/oozie.war'already contains ExtJS library files,即可繼續。
8、設定OOZIE的配置檔案。
修改檔案/usr/oozie/conf/oozie-site.xml,找到下面這部分內容:
<property>
<name>oozie.service.JPAService.create.db.schema</name>
<value>false</value>
<description>
Creates Oozie DB.
If set to true, it creates the DB schema if it does not exist. If the DB schema exists is a NOP.
If set to false, it does not create the DB schema. If the DB schema does not exist it fails start up.
</description>
</property>
將其中的false改成true。
9、載入資料庫。
使用命令:
#/usr/oozie/bin/ooziedb.sh create -sqlfile oozie.sql –run
之後出現:
setting CATALINA_OPTS="$CATALINA_OPTS -Xmx1024m"
Validate DB Connection
DONE
Check DB schema does not exist
DONE
Check OOZIE_SYS table does not exist
DONE
Create SQL schema
DONE
Create OOZIE_SYS table
DONE
Oozie DB has been created for Oozie version '3.3.2'
The SQL commands have been written to: oozie.sql
即表示建立成功。這時候可以看到一個oozie.sql檔案。
10、加入原Hadoop的包,這裡需要拷貝hadoop-core-1.1.1.jar和commons-configuration-1.6.jar這兩個JAR包到目錄:./oozie-server/webapps/oozie/WEB-INF/lib/下。
11、拷貝oozie.war檔案到./oozie-server/webapps/下。
12、更改許可權,此時需要更改oozie資料夾及其全部子檔案的許可權:
#chown -R hadoop:hadoop oozie
13、開啟Oozie,使用命令:
$./bin/oozied.sh run
14、檢視web控制檯
輸入命令:
$oozie admin -oozie http://192.168.137.2:11000/oozie -status
當看到結果:
System mode: NORMAL
則表示已經成功,通過瀏覽器輸入http://192.168.137.2:11000/oozie就能看到Oozie的管理介面。如下圖2.1所示:
圖2.1 Oozie管理介面