NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落

關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

本部落格文章撰寫前進邁向第五年(since 2009 ~至今)仍繼續推進分享IT學習!!About Windows/Linux Server,Virtualization


分享網誌: 由於,本人預先完成LAB後,才補上撰寫文章與截圖,若發現文圖對照說明有誤..本人將盡快校正,也請不吝指教! Thanks!

  • 146059

    累積人氣

  • 1

    今日人氣

    0

    訂閱人氣

雲端運算: Hadoop 2.x Yarn Mapreduce 運算架構 by Navier

[ 首先搞定Hadoop Client(hc) ]

先來搞定"Hadoop Client"端配置,以利我司後期進入雲端運算範例階段執行

Host Name:  "hc" (IP:10.10.10.32/24)

#
基本上"Hadoop Client" 可以將namenode節點所有組態配拷貝一份到"hc"主機中即可

#務必確認環境變數Hadoop/JAVA 配置 ~/.bashrc or  /etc/profile 之參數正確 (參考下圖)

sudo vi   /etc/profile       #此次本人配置 hadoop/java相關設定參數到全域環境變數 hc主機上

export JAVA_HOME=/hadoop/java8u66
export HADOOP_HOME=/hadoop/hadoop-2.7.1
export PATH=$PATH:$JAVA_HOME/bin
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
 

生效配置:  sudo source /etc/profile

#由於本人稍早以說"將"namenode(nn1)" 所有組態檔案都拷貝一份到"hc"主機之hadoop目錄下

  故組態檔同步一致母須再修改配置"Hadoop Client" 就配置完成了


* 遠端SSH登入  "nn1(namenode) 節點"  我們將配置"Hadoop 系統管理員權限群組

   vi    hdfs-site.xml  
   
 #凡本機使用者加入此群組皆得hadoop系統管理員權限

 
<property>
<name>dfs.permissions.supergroup</name>
<value>hadmin</value>                               
</property>

目前本人授與hadoop supergroup 權限使用者為"navier" , 現另新增"dto" 使用者


#以使用者"naivier"身分建"hc"專案使用者"dto" 執行 hadoop專案目錄配置

hadoop fs -mkdir   /user/dto   

sudo usermod -a -G  hadmin dto    # 將dto用戶加入至hadmin群組

現改由遠程連線SSH hc(登入hadoop client) , 建立"dto" 帳戶與密碼,

現在我們測試使用
"dto"帳戶登入,驗收"hadoop client" 連線與上傳資料測試是否有效?

下圖中 
我們測試了 "建立資料夾(hadoop-yarn,yarn-spark)", "上傳檔案測試(iptables.xslt) OK, 

"Hadoop Client 配置告一段落"



[Yarn 架構佈署開始]  Tartget:  nn1,nn2,dn01,dn02,hc,rmn  

            rmn  操作
為例   #使用Ubuntu Xenial Xerus OS版本
 vi   mapred-site.xml

<property>
<name>mapreduce.job.tracker </name>
<value>rmn:54311</value>                              #job.tracker 指定為rmn:54311
</property>

vi   yarn-env.sh    #yarn 環境變數與程式路徑配置相關

JAVA=$JAVA_HOME/bin/java                
JAVA_HEAP_MAX=-Xmx256m             #指定JAVA_HEAP_MAX

# For setting YARN specific HEAP sizes please use this
# Parameter and set appropriately
# YARN_HEAPSIZE=1000

YARN_HEAPSIZE=256        #預設參數值1000MB,我們Lab RAM因受限故下修256

#export YARN_RESOURCEMANAGER_HEAPSIZE=1000   by Default
 
export YARN_RESOURCEMANAGER_HEAPSIZE=256
export YARN_TIMELINESERVER_HEAPSIZE=256  

#Timeline Server 是用來紀錄 YARN 執行完程式後所產生的結果
 
export YARN_NODEMANAGER_HEAPSIZE=256
export YARN_LOG_DIR=/hadoop/timeline     #指定Yarn_Log_Dir 輸出路徑,存檔離開

vi   yarn-site.sh


<configuration>
<property>
<name> yarn.nodemanager.aux-services</name>     #node manager 額外啟用shuffling
<value>mapreduce_shuffle</value>
</property>

<property>
<name> yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>


<property>                 #nodemanager 與 rmn 之間連繫回報執行狀況
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>rmn:8025 </value>           
</property>


<property>                 #applicationMaster 向rmn 申請資源,釋放資源
<name>yarn.resourcemanager.resource.scheduler.address</name>
<value>rmn:8030</value>
</property>

<property>               #Client端經過rmn註冊應用程序,刪除應用程序
<name>yarn.resourcemanager.address</name>
<value>rmn:8050 </value>
</property>


<property>
<name> yarn.resourcemanager.webapp.address</name>
<value>rmn:8088</value>    #webui monitor 提供使用者監控yarn執行任務相關內容
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/hadoop/nmn</value>
</property>

<property>            #為了控管nodemanager允許上線限置建立yarnlist

<name>yarn.resourcemanager.nodes.include-path</name>
<value>/etc/hadoop/yarnlist</value>        
</property>


<property>          #限制每個nodemanager 可提供yarn運算記憶體大小,Default 8GB RAM
         

<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>                 
</property>

<property>   #限制每個nodemanager 可提供yarn運算CPU數量,Default 8 vcores
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>

<property>
<name>yarn.timeline-service.hostname</name>      #timeline server hostname
<value>rmn</value>
</property>

<property>
<name>yarn.timeline-service.generic-application-history.enabled</name>
<value>true</value>     #f讓timeline server 紀錄yarn執行程式後的相關資訊
</property>
<property>

<name>yarn.timeline-service.webapp.address</name>
<value>rmn:8188</value>     #ftimeline server webui 協助系統管理員監控任務檢視
</property>


#將上述配置完成後之配置檔案同步到nn1,nn2,dn01,dn02,hc...等節點就緒"

#"SSH nn1"啟動dfs  

start-dfs.sh    #hdfs服務已啟動
# 接者"SSH rmn"啟動yarn , timline server 服務  

start-yarn.sh

yarn-daemon.sh start  timelineserver  

jps     #Resource Manager & ApplicationHistoryServer 已順利啟動
 
# 接者"SSH dn01,dn02, 觀察nodemanager 服務使否正常啟動"   #dn03未啟用

   *下圖中dn01,dn02 已順利啟用node manager 服務,截至目前配置Yarn配置與啟用完成


[檢視Hadoop 查看運算資源狀態]   http://rmn:8088  

#點圖可放大放大檢視  

參照上述配置單一"Node Manager" 可配置 1GB RAM , 1核心運算資源 故兩台node manager

得 
加總(sum) :  2GB RAM ,CPU 核心數 2個 資源統計數

Memory Total 2GB

VCores Total  2個

Active Nodes  2個




Active Node 進入觀察可以看到各個節點運行運算狀態...

    #點圖可放大放大檢視 

回到rmn 文字模式下也可以觀察各個node manager 資訊檢視 


yarn node -list all        
#查看所有Nodemanager 狀況

yarn node -status  "Node-ID"  
 #dn02:57834

動態擴增"Nodemanager"   以 "hc" 節點啟動為例

將dn01,dn02,hc 加入"yarnlist"    # yarn 架構(nodemanager)白名單成員



# Then "SSH "hc"  手動啟動nodemanager服務

yarn-daemon.sh start  nodemanager  
   #獨立啟動ndoemanager

jps 


#回到"rmn" 結點

<重新啟動 rmn  生效配置

stop-yarn.sh 

start-yarn.sh

yarn node -list -all           #下圖中已經 順利帶上 "hc" node manager 工作

若要卸除nodemanager 任務(於hc結點下終止nodemanager指令)

yarn-daemon.sh stop nodemanager      #回到rmn查看"hc"結點已不存在


#回到"hc" 客戶端 測試Yarn分散式運算系統("以dto 使用者登入)"

hadoop jar hadoop-mapreduce-examples-2.7.1.jar pi 1 1

        計算圓周率結果  #測試"hc" hadoop client 執行Yarn 計算成功

[ Final: 最後我們佈署 官方範例程式"wordcount"  測試Yarn 運算]


# Then "SSH "hc" Hadoop Client 為例 , 以"dto" 使用者帳戶登入做此次範例執行

    *參考官方"wordcount"  配置程序

     sodu vi /etc/profile    #添增環境變數

export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

由於本人用的java版本是"JRE" 而非"JDK" ,所以"/lib"錄下不存在"tools.jar"檔案,你必須找匹配

本版"jdk"套件拷貝到JRE版本之"/lib"目錄底下即可

[配置運算環境] 參考下圖

在家目錄下建立 工作資料夾 "yarn-hadoop" 並進入該目錄底下

再建立 子資料夾"input" ,隨意google search 一本電子書存於此

本例採用 50687-9.txt  這本電子書做Mapreduce運算標的resource  總行數:15655行


Then 將 運算資源
input/50687-9.txt  上傳到 "hadoop hdfs "

OK,
下圖中我們將  input/50687-9.txt   已經成功上傳到 "/user/dto/yarn-input" 就緒


現參考官網配置WordCount.java 檔案

vi  
WordCount.java 

import java.io.IOException; import java.util.StringTokenizer;  import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;  public class WordCount {    public static class TokenizerMapper        extends Mapper<Object, Text, Text, IntWritable>{      private final static IntWritable one = new IntWritable(1);     private Text word = new Text();      public void map(Object key, Text value, Context context                     ) throws IOException, InterruptedException {       StringTokenizer itr = new StringTokenizer(value.toString());       while (itr.hasMoreTokens()) {         word.set(itr.nextToken());         context.write(word, one);       }     }   }    public static class IntSumReducer        extends Reducer<Text,IntWritable,Text,IntWritable> {     private IntWritable result = new IntWritable();      public void reduce(Text key, Iterable<IntWritable> values,                        Context context                        ) throws IOException, InterruptedException {       int sum = 0;       for (IntWritable val : values) {         sum += val.get();       }       result.set(sum);       context.write(key, result);     }   }    public static void main(String[] args) throws Exception {     Configuration conf = new Configuration();     Job job = Job.getInstance(conf, "word count");     job.setJarByClass(WordCount.class);     job.setMapperClass(TokenizerMapper.class);     job.setCombinerClass(IntSumReducer.class);     job.setReducerClass(IntSumReducer.class);     job.setOutputKeyClass(Text.class);     job.setOutputValueClass(IntWritable.class);     FileInputFormat.addInputPath(job, new Path(args[0]));     FileOutputFormat.setOutputPath(job, new Path(args[1]));     System.exit(job.waitForCompletion(true) ? 0 : 1);   } }

*Then 編譯
WordCound.java   #編譯完成輸出後將產生三個class檔案

hadoop com.sun.tools.javac.Main WordCount.java



*Then 將java封裝為"jar"    #本例取名lunasee.jar

jar cf lunasee.jar WordCount*.class 

執行單詞統計計數範例(輸出至"yarn-output")

hadoop jar lunasee.jar WordCount yarn-input yarn-output


檢視輸出成果 /use/dto/yarn-output/ #mapreduce 運算範例成功

HDFS 內資料夾產生"
_SUCCESS"(運算成功與否)part-r-00000 (結果輸出result)

*下圖僅列出前十筆運算內容,您可以連線至本人雲端硬碟檢視完整結果
[Final: Apache Spark 運行身分"yarn-client" 執行"WordCount" 範例程式]

# Then "SSH   "rmn"  配置工作區    #Apache Spaerk 在前幾步驟已安裝好在"rmn"結點上

   
編輯 Scala語言可採用前言介紹 SCALA_IDE =>編譯(Compiler)=>匯出 "*.jar"檔再執行(exec)

測試 "Apache Sparck"運行

若要啟用執行 spark-shell


現將 50687-9.txt 上傳分析資源標的到"DTO"資料夾,執行指令,分析WordCount 單詞統計

spark-submit --driver-memory 512m

--class RunWordCount  

--master yarn-client lunasee.jar  

start RunWordCount

檢視"Apache Spark"運算完成結果"DTO/OUTPUT"

運算成功 "_SUCCESS" , 並產生兩個檔案分析成果(Result) part-00000

part-00001 #Apache Spark 運行協同Work在"yarn-clinet"身分執行成功

hadoop fs -cat DTO/output/part-00001 | tail -n 10
相簿設定
標籤設定
相簿狀態