Oozie、Flume、Mahout配置與應用




-------------------------Oozie--------------------
【一、部署】    
1)部署Oozie服務端
[root@cMaster~]#sudo yum install oozie    #cMaster上以root權限執行,部署Oozie服務端
2)部署Oozie客戶端
[root@iClient~]f#sudo yum install oozie-client

【二、配置文件】
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>    
【三、數據庫與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即可
【四、啟動服務】
[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/”查看目錄變化






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM