1. 程式人生 > >Apache Hadoop1.1.1+Apache Oozie3.3.2搭建安裝過程詳解(親測)

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 是資料副本數量,預設為3salve少於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管理介面