-------------------------Oozie-------------------- 【1、部署】 1)部署Oozie服務端 [root@cMaster~]#sudo yum install oozie #cMaster上以root權限執行,部署Oozie服務端 2)部署Oozie客戶端 [root@iClient~]f#sudo yum install oozie-client 【2、配置文件】 3)修改/etc/oozie/conf/oozie-env.sh文件 #export CATALINA_BASE=/var/lib/oozie/tomcat-deployment export CATALINA_BASE=/usr/lib/oozie/oozie-server # export OOZIE_CONFIG_FILE=oozie-site.xml export OOZIE_CONFIG=/etc/oozie/conf # export OOZIE_LOG=${OOZIE_HOME}/logs export OOZIE_LOG=/var/log/oozie 4)追加/etc/hadoop/conf/core-site.xml內容: <property><name>hadoop.proxyuser.oozie.groups</name><value>*</value></property> <property><name>hadoop.proxyuser.oozie.hosts</name><value>*</value></property> 【3、數據庫與jar配置】 重啓Hadoop集羣,並建庫 $for x in `cd/etc/init.d;Is hadoop-*`;do service $x restart;done; #`爲英文輸入狀態下 ,esc鍵下面那個【警告:不建議使用】除了iCleint外,其餘機器都要執行4)建立Oozie數據庫模式 [root@cMaster~]#sudo -u oozie /usr/lib/oozie/bin/ooziedb.sh create -run #僅cMaster執行 [root@cMaster ~]#mkdir /tmp/ooziesharelib [root@cMaster~]#cd /tmp/ooziesharelib [root@cMaster~]# tar xzf /usr/lib/oozie/oozie-sharelib-yarn.tar.gz #【重要】此處oozie-sharelib-yarn.tar.gz有可能爲/usr/lib/oozie/下文件夾,將其複製進/tmp/ooziesharelib便可 【4、啓動服務】 [root@cMaster~]#sudo service oozie start 應用是這裏注意一點:oozie job -oozie http://cMaster:11000/oozie -config 【/usr/share/doc/oozie-4.0.0+cdh5.0.0+54/examples/apps/map-reduce/job.properties 爲本地路徑】 -run oozie job -oozie http://cMaster:11000/oozie -config job.properties -run HDFS 路徑:/user/【用戶名】root/examples/apps/map-reduce/ 下存在job.properties等文件,即/user/【用戶名】root/examples/apps/map-reduce/被寫死 本地路徑:(相對路徑)進入本地job.properties等文件目錄下,如: 進入 /usr/share/doc/oozie-4.0.0+cdh5.0.0+54/examples/apps/map-reduce/ 目錄下job.properties存在的地方 ——————————————————————如下冗餘———————————————————— Oozie部署 [21] Oozie至關於Hadoop的一個客戶端,所以集羣中只有一臺機器部署Oozie server端即 可, 因爲能夠有任意多個客戶端鏈接Oozie,故每一個客戶端上都須部署Oozie client, 本節 選擇在cMaster上部署Oozie server,在iClient上部署Oozie client。 1)部署Oozie服務端 [root@cMaster~]#sudo yum install oozie #cMaster上以root權限執行,部署Oozie服務端 2)部署Oozie客戶端 [root@iClient~]f#sudo yum install oozie-client 3)配置Oozie 修改/etc/oozie/conf/oozie-env.sh中的CATALINA_BASE屬性值,註釋原值並指定新 值, 當此值指向oozie-server-0.20代表Oozie支持MRv1,指向oozie-server表示支持Yarn。 注 意cMaster、iClient都要配置,並保持一致。 #export CATALINA_BASE=/usr/lib/oozie/oozie-server-0.20 export CATALINABASE=/usr/lib/oozie/oozie-server 在/etc/hadoop/conf/core-site.xml文檔裏configuration標籤間加入以下內容。 注意,6臺機器都要更新這個配置,而且配置此屬性後, 必定要重啓集羣中全部Hadoop服務,此屬性值才能生效。 <property><name>hadoop.proxyuser.oozie.groups</name><value>*</value></property> <property><name>hadoop.proxyuser.oozie.hosts</name><value>*</value></property> 下面是重啓Hadoop集羣的命令: $for x in 'cd/etc/init.d;Is hadoop-*';do service $x restart;done; #除了iCleint外,其餘機器都要執行4)建立Oozie數據庫模式 [root@cMaster~]#sudo -u oozie /usr/lib/oozie/bin/ooziedb.sh create -run #僅cMaster執行 5)配置Oozie Web頁面 [root@cMaster ~]#cd /var/lib/oozie/ [root@cMaster oozie]# sudo -u oozie wget http://archive.cloudera.com/gplextras/misc/ext-2.2.zip [root@cMaster oozie]# sudo -u oozie unzip ext-2.2.zip 6)將Oozie經常使用Jar包導入HDFS [root@cMaster~]# sudo -u hdfs hdfs dfs -mkdir /user/oozie [root@cMaster~]#sudo -u hdfs hdfs dfs -chown oozie:oozie /user/oozie [root@cMaster ~]#mkdir /tmp/ooziesharelib [root@cMaster~]#cd /tmp/ooziesharelib [root@cMaster~]# tar xzf /usr/lib/oozie/oozie-sharelib-yarn.tar.gz [root@cMaster~]# sudo -u oozie hdfs dfs -put share /user/oozie/share 7)開啓Oozie服務 [root@cMaster~]#sudo service oozie start 8)查看Oozie服務 當成功部署並在cMaster上開啓Oozie服務後,若是配置了ext-2.2, 在iClient上的瀏覽器中打開「cmaster:11000」將顯示Oozie Web界面, 也可使用下述命令查看Oozie工做狀態。 [root@iClient~]#oozie admin -oozie http://cMaster:11000/oozie -status ------------------------應用------ 2.0ozie訪問接口 Oozie最經常使用的是命令行接口,它的Web接口只能夠看到Oozie託管的任務,不能夠配置做業。 【例6-6】按要求完成問題: ①進入Oozie客戶端,查看經常使用命令。 ②運行Oozie MR示例程序。 ③運行OoziePig、Hive等示例。 ④編寫workflow.xml,完成一次WordCount。 ⑤編寫workflow.xml,完成兩次WordCount,且第一個WC的輸出爲第二個WC的輸入。 解答:對於問題①,在iClient上執行下述命令便可,用戶能夠是root或joe。 [root@iClient~]#sudo-u joe oozie help #查看全部Oozie命令 對於問題②,首先解壓Oozie示例iar包,接着修改示例配置中的地址信息,最後上傳至集羣執行便可,讀者按下述流程執行便可。 [root@iClient~]#cd /usr/share/doc/oozie-4.0.0+cdh5.0.0+54 [root@iClient oozie-4.0.0+cdh5.0.0+54]# tar-zxvf oozie-examples.tar.gz 編輯examples/apps/map-reduce/job.properties,將以下兩行: nameNode=hdfs://localhost:8020 job Tracker=localhost:8021替換成集羣如今配置的地址與端口: nameNode=hdfs://cMaster:8020 job Tracker=cMaster:8032 接着將examples上傳至HDFS,使用oozie命令執行便可: [root@iClient oozie-4.0.0+cdh5.0.0+54]#sudo -u joe hdfs dfs-put examples examples [root@iClient oozie-4.0.0+cdh5.0.0+54]#cd [root@iClient ~]#sudo -u joe oozie job -oozie http://cMaster:11000/oozie -config /usr/share/doc/oozie- 4.0.0+cdh5.0.0+54/examples/apps/map-reduce/job.properties -run 問題③其實和②是同樣的,讀者可按上述過程使用oozie執行Pig或Hive等的示例腳本。 切記修改相應配置(如examples/apps/pig/job.properties)後,再上傳至集羣, 執行時也要定位到相應路徑(如sudo-u joe oozie....../apps/pig/joe.properties-run)。 對於問題④,讀者可參考「examples/apps/map-reduce/workflow.xml」, 其對應jar包在「examples/apps/map-reduce/lib」下, 其下的DemoMapper.class和DemoReducer.class就是WordCount的代碼, 對應的源代碼在「examples/src」下,可按以下步驟完成此問題。 (1)編輯文件「examples/apps/map-reduce/workflow.xml」,找到下述內容: <property> <name>mapred.mapper.class</name><value>org.apache.oozie.example.SampleMapper</value> </property> <property> <name>mapred.reducer.class</name><value>org.apache.oozie.example.SampleReducer</value> </property> 將其替換成: <property> <name>mapred.mapper.class</name><value>org.apache.oozie.example.DemoMapper</value> </property> <property> <name>mapred.reducer.class</name><value>org.apache.oozie.example.DemoReducer</value> </property> <property><name>mapred.output.key.class</name><value>org.apache.hadoop.io.Text</value></property> <property> <name>mapred.output.value.class</name><value>org.apache.hadoop.io.IntWritable</value> </property> (2)接着將原來HDFS裏examples文件刪除,按問題②的解答, 上傳執行便可,這裏只給出刪除原examples的命令,上傳和執行命令和問題②解答同樣。 [root@iClient~]#sudo -u joe hdfs dfs -rm -r -f examples #刪除HDFS原examples文件 (3)接着將examples上傳至HDFS,使用oozie命令執行便可: [root@iClient oozie-4.0.0+cdh5.0.0+54]#sudo -u joe hdfs dfs-put examples examples [root@iClient oozie-4.0.0+cdh5.0.0+54]#cd [root@iClient ~]#sudo -u joe oozie job -oozie http://cMaster:11000/oozie -config /usr/share/doc/oozie- 4.0.0+cdh5.0.0+54/examples/apps/map-reduce/job.properties -run ****問題⑤是業務邏輯中最常遇到的情形,好比你的數據處理流 是: 「M1」→「R1」→「Java1」→「Pig1」→「Hive1」→「M2」→「R2」→「Java2」 ,單獨寫出各種或 腳本後,寫出此邏輯對應的workflow.xml便可。 限於篇幅,下面只給出workflow.xml框 架,請讀者自行解決問題④。 <workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf"> <start to="mr-node"/> <action name="mr-node"> <map-reduce>第一個wordcount配置</map-reduce> <ok to="mr-wc2"/><error to="fail"/> </action> <action name="mr-wc2"> <map-reduce>第二個wordcount 配置</map-reduce> <ok to="end"/><error to="fail"/> </action> <kill name="fail"> <message>Map/Reduce failed error message[${wf:errorMessage(wf:lastErrorNode())}]</message> </kill> <end name="end"/> </workflow-app> ——————————————————————————Flume—————————————————————— 1.Flume部署 [21] 集羣中只有一臺機器部署Flume就能夠接收數據了, 此外下面的例題中還要有一臺機 器作爲數據源,負責向Hadoop集羣發送數據, 故須在cMaster與iClient上部署Flume。 (1)部署Flume接收端 [root@cMaster~]#sudo yum install flume-ng-agent #在cMaster上部署Flume (2)部署Flume發送端 [root@iClient~]#sudo yum install flume-ng-agent #在iClient上部署Flume ---------------應用 2.Flume訪問接口 Flume提供了命令行接口和程序接口,但Flume使用方式比較特別, 不管是命令行還 是程序接口,都必須使用Flume配置文檔, 這也是Flume架構思想之一——配置型工具。 【例6-7】按要求完成問題: ①進入Flume命令行,查看經常使用命令。 ②要求發送端 iClient使用telnet向cMaster發送數據,而接收端cMaster開啓44444端口接收數據, 並將收到 的數據顯示於命令行。 ③要求發送端iClient將本地文件「/home/joe/source.txt」發往接收端 cMaster, 而接收端cMaster將這些數據存入HDFS。 ④根據問題③,接收端cMaster開啓接 收數據的Flume服務,既然此服務能接收iClient發來的數據, 它必然也能夠接收iHacker機 器(黑客)發來的數據,問如何儘可能減小端口攻擊,並保證數據安全。 解答:對於問題①,直接在iClient上執行以下命令便可 [root@iClient~]#flume-ng #查看Flume經常使用命令 對於問題②,首先須要在cMaster上按要求配置並開啓Flume(做爲接收進程被動接收 數據), 接着在iClient上使用telnet向cMaster發送數據,具體過程參見以下幾步。 在cMaster上以root權限,新建文件「/etc/flume/conf/flume.conf」, 並填入以下內容:接 着在cMaster上使用此配置之前臺方式開啓Flume服務 ----------------------------------------------------------------------------------------------- #命令此處agent名爲al,並命名此al的sources爲rl,channels爲cl,sinks爲kl a1.sources=r1 a1.channels=c1 a1.sinks=k1 #定義sources相關屬性:即此sources在cMaster 上開啓44444端口接收以netcat協議發來的數據 a1.sources.r1.type=netcat a1.sources.r1.bind=cMaster a1.sources.r1.port=44444 #定義channels及其相關屬性,此處指定這次服務使用memory 暫存數據 a1.channels.c1.type=memory a1.channels.c1.capacity=1000 a1.channels.c1.transactionCapacity=100 #定義此sink爲logger類型sink:即指定sink直接將收到的數據輸出到控制檯 a1.sinks.k1.type=logger #將sources關聯到channels,channels 關聯到sinks上 a1.sources.r1.channels=c1 a1.sinks.k1.channel=c1 --------------------------------------------------------------------------------------------- [root@cMaster~]#flume-ng agent -c /etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf -n a1 此時,接收端cMaster已經配置好並開啓了,接下來須要開啓發送端,在iClient上執行: [root@iClient~]# telnet cMaster 44444 此時向此命令行裏隨意輸入數據並回車,telnet會將這些數據發往cMaster,再次回到 cMaster上執行命令的那個終端, 會發現剛纔在iClient裏輸入的數據發送到了cMaster的終 端裏。若是想退出iClient終端裏的telnet, 按Ctrl+]組合鍵(即同時按住Ctrl鍵和]鍵),回 到telnet後輸入「quit」命令回車便可, 至於退出cMaster上的Flume,直接按Ctrl+C組合鍵。 問題③的回答步驟較多。 首先,在cMaster上新建文件「/etc/flume-ng/conf/flume.conf.hdfs」,並填入以下內容 ----------------------------------------------------------------------------------------------- #命令此處agent名爲al,並命名此al的sources爲rl,channels爲c1,sinks爲k1 a1.sources=r1 a1.sinks=k1 a1.channels=c1 #定義sources類型及其相關屬性 #即此sources爲avro類型,且其在cMaster上開啓4141端口接收avro協議發來的數據 a1.sources.r1.type=avro a1.sources.r1.bind=cMaster a1.sources.r1.port=4141 #定義channels類型其實相關屬性,此處指定這次服務使用memory 暫存數據 a1.channels.c1.type=memory #定義此sink爲HDFS類型的sink,且此sink將接收的數據以文本方式存入HDFS指定目錄 a1.sinks.k1.type=hdfs a1.sinks.k1.hdfs.path=/user/joe/flume/cstorArchive a1.sinks.k1.hdfs.file Type=DataStream #將sources關聯到channels,channels 關聯到sinks上 a1.sources.r1.channels=c1 a1.sinks.k1.channel=c1 ----------------------------------------------------------------------------------------------- 接着,在iClient上新建文件「/root/businessLog」,並填入以下內容: -------------------------------------- ccccccccccccccccccccc ssssssssssssssssssssssss tttttttttttttttttttttttttttttttttt oooooooooooooooooo rrrrrrrrrrrrrrrrrrrrrrrrrrrrr -------------------------------------- iClient上還要新建文件「/etc/flume-ng/conf/flume.conf.exce」,並填入以下內容: ----------------------------------------------------------------------------------------------- #命令此處agent名爲al,並命名此al的sources爲rl,channels爲c1,sinks爲k1 a1.sources=r1 a1.channels=c1 a1.sinks=k1 #定義sources類型及其相關屬性,此sources爲exce類型 #其使用Linux cat 命令讀取文件/root/businessLog,接着將讀取到的內容寫入channel a1.sources.r1.type=exec a1.sources.r1.command=cat /root/businessLog #定義channels及其相關屬性,此處指定這次服務使用memory 暫存數據 a1.channels.c1.type=memory #定義此sink爲avro類型sink,即其用avro協議將channel裏的數據發往cMaster的4141端口 a1.sinks.k1.type=avro a1.sinks.k1.hostname=cMaster a1.sinks.k1.port=4141 #將sources關聯到channels,channels 關聯到sinks上 a1.sources.r1.channels=c1 a1.sinks.k1.channel=c1 ----------------------------------------------------------------------------------------------- 至此,發送端iClient和接收端cMaster的Flume都已配置完成。如今須要作的是在 HDFS裏新建目錄, 並分別開啓接收端Flume服務和發送端Flume服務,步驟以下。 在cMaster上開啓Flume, 其中「flume-ng…a1」命令表示使用flume.conf.hdfs配置啓動 Flume, 參數a1便是配置文件裏第一行定義的那個a1 [root@cMaster ~]#sudo -u joe hdfs dfs -mkdir flume #HDFS裏新建目錄/user/joe/flume [root@cMaster ~]#sudo -u joe flume-ng agent -c /etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf.hdfs -n a1 最後,在iClient上開啓發送進程,與上一條命令相似,這裏的a1,即flume.conf.exce 定義的a1: [root@iClient~]#flume-ng agent -c/etc/flume-ng/ -f /etc/flume-ng/conf/flume.conf.exce -n a1 此時,用戶在iClient端口裏打開「cMaster:50070」,依次進入目 錄「/user/joe/flume/cstorArchive」, 將會查看到從iClient上傳送過來的文件。 —————————————————————————— Mahout—————————————————————— 1.Mahout部署 [21] 做爲Hadoop的一個客戶端,Mahout只要在集羣中或集羣外某臺客戶機上部署便可, 實驗中選擇在iClient上部署Mahout [root@iClient ~]# sudo yum install mahout 2.Mahout訪問接口 Mahout提供了程序和命令行接口, 經過參考Mahout已有的大量機器學習算法,程序 員也可實現將某算法並行化。 【例6-8】要求以joe用戶運行Mahout示例程序naivebayes,實現下載數據,創建學習 器,訓練學習器, 最後使用測試數據針對此學習器進行性能測試。 ------------------------------------------------------------------------- #!/bin/sh #新建本地目錄,新建HDFS目錄 mkdir -p /tmp/mahout/20news-bydate /tmp/mahout/20news-all&&hdfs dfs -mkdir mahout #下載訓練和測試數據集 curl http://people.csail.mit.edu/jrennie/20Newsgroups/20news-bydate.tar.gz\ -o /tmp/mahout/20news-bydate.tar.gz #將數據集解壓、合併,並上傳至HDFS cd /tmp/mahout/20news-bydate&&tar xzf /tmp/mahout/20news-bydate.tar.gz&&cd cp -R /tmp/mahout/20news-bydate/*/*/tmp/mahout/20news-all hdfs dfs -put /tmp/mahout/20news-all mahout/20news-all #使用工具類seqdirectory 將文本數據轉換成二進制數據 mahout seqdirectory -i mahout/20news-all -o mahout/20news-seq -ow ------------------------------------------------------------------------- 解:首先須下載訓練數據集和測試數據,接着運行訓練MR和測試MR,可是, Mahout裏的算法要求輸入格式爲Value和向量格式的二進制數據,故中間還須加一些步 驟, 將數據轉換成要求格式的數據,下面的腳本naivebayes.sh能夠完成這些動做 ------------------------------------------------------------------------- #使用工具類seq2sparse將二進制數據轉換成算法能處理的矩陣類型二進制數據 mahout seq2sparse -i mahout/20news-seq -o mahout/20news-vectors -lnorm -nv -wt tfidf #將總數據隨機分紅兩部分,第一部分約佔總數據80%,用來訓練模型 #剩下的約20%做爲測試數據,用來測試模型 mahout split -i mahout/20news-vectors/fidf-vectors --trainingOutput mahout/20news-train-vectors\ --testOutput mahout/20news-test-vectors\ --randomSelectionPct 40 --overwrite --sequenceFiles -xm sequential #訓練Naive Bayes模型 mahout trainnb -i mahout/20news-train-vectors -e1 -o mahout/model -li mahout/labelindex -ow #使用訓練數據集對模型進行自我測試(可能會產生過擬合) mahout testnb -i mahout/20news-train-vectors -m mahout/model -l mahout/labelindex\ -ow -o mahout/20news-testing #使用測試數據對模型進行測試 mahout testnb -i mahout/20news-test-vectors -m mahout/model -I mahout/labelindex\ -ow -o mahout/20news-testing ------------------------------------------------------------------------- 限於篇幅,腳本寫得簡陋,執行時,切記須在iClient上,以joe用戶身份執行,且只能 執行一次。 再次執行時,先將全部數據所有刪除,執行方式以下 [root@iClient~]# cp naivebayes.sh /home/joe [root@iClient~]# chown joe.joe naivebayes.sh [root@iClient~]# sudo -u joe chmod +x naivebayes.sh [root@iClient~]# sudo -u joe sh naivebayes.sh 腳本執行時,用戶能夠打開Web界面「cMaster:8088」, 查看正在執行的Mahout任 務;還能夠經過Web界面「cMaster:50070」, 定位到「/user/joe/mahout/」查看目錄變化