Hadoop作業提交分析(一)
……
這樣的命令,各位玩Hadoop的估計已經呼叫過NN次了,每次寫好一個Project或對Project做修改後,都必須打個Jar包,然後再用上面的命令提交到Hadoop Cluster上去執行,在開發階段那是極其繁瑣的。程式設計師是“最懶”的,既然麻煩肯定是要想些法子減少無謂的鍵盤敲擊,順帶延長鍵盤壽命。比如有的人就寫了些Shell指令碼來自動編譯、打包,然後提交到Hadoop。但還是稍顯麻煩,目前比較方便的方法就是用Hadoop eclipse plugin,可以瀏覽管理HDFS,自動建立MR程式的模板檔案,最爽的就是直接Run on hadoop了,但版本有點跟不上Hadoop的主版本了,目前的MR模板還是0.19的。還有一款叫Hadoop Studio的軟體,看上去貌似是蠻強大,但是沒試過,這裡不做評論。那麼它們是怎麼做到不用上面那個命令來提交作業的呢?不知道?沒關係,開源的嘛,不懂得就直接看原始碼分析,這就是開源軟體的最大利處。
我們首先從bin/hadoop這個Shell指令碼開始分析,看這個指令碼內部到底做了什麼,如何來提交Hadoop作業的。
因為是Java程式,這個指令碼最終都是要呼叫Java來執行的,所以這個指令碼最重要的就是新增一些前置引數,如CLASSPATH等。所以,我們直接跳到這個指令碼的最後一行,看它到底添加了那些引數,然後再逐個分析(本文忽略了指令碼中配置環境引數載入、Java查詢、cygwin處理等的分析)。
#run itexec "$JAVA"$JAVA_HEAP_MAX $HADOOP_OPTS -classpath "$CLASSPATH"$CLASS
從上面這行命令我們可以看到這個指令碼最終添加了如下幾個重要引數:JAVA_HEAP_MAX、HADOOP_OPTS、CLASSPATH、CLASS。下面我們來一個個的分析(本文基於Cloudera Hadoop 0.20.1+152分析)。
首先是JAVA_HEAP_MAX,這個就比較簡單了,主要涉及程式碼如下:
JAVA_HEAP_MAX=-Xmx1000m# check envvars which might override default args
if [ "$HADOOP_HEAPSIZE" !="" ];then#echo
JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"#echo$JAVA_HEAP_MAX
fi
首先賦予預設值-Xmx1000m,然後檢查hadoop-env.sh中是否設定並匯出了HADOOP_HEAPSIZE,如果有的話,就使用該值覆蓋,得到最後的JAVA_HEAP_MAX。
接著是分析CLASSPATH,這是這個指令碼的重點之一。這部分主要就是添加了相應依賴庫和配置檔案到CLASSPATH。
# 首先用Hadoop的配置檔案目錄初始化CLASSPATHCLASSPATH="${HADOOP_CONF_DIR}"
……
# 下面是針對於Hadoop發行版,新增Hadoop核心Jar包和webapps到CLASSPATH
if [ -d "$HADOOP_HOME/webapps" ];then
CLASSPATH=${CLASSPATH}:$HADOOP_HOME
fi
for f in $HADOOP_HOME/hadoop-*-core.jar;do
CLASSPATH=${CLASSPATH}:$f;
done
# 新增libs裡的Jar包
for f in $HADOOP_HOME/lib/*.jar;do
CLASSPATH=${CLASSPATH}:$f;
Done
for f in $HADOOP_HOME/lib/jsp-2.1/*.jar;do
CLASSPATH=${CLASSPATH}:$f;
done
# 下面的TOOL_PATH只在命令為“archive”時才新增到CLASSPATH
for f in $HADOOP_HOME/hadoop-*-tools.jar;do
TOOL_PATH=${TOOL_PATH}:$f;
done
for f in $HADOOP_HOME/build/hadoop-*-tools.jar;do
TOOL_PATH=${TOOL_PATH}:$f;
done
# 最後新增使用者的自定義Hadoop Classpath
if [ "$HADOOP_CLASSPATH" !="" ];then
CLASSPATH=${CLASSPATH}:${HADOOP_CLASSPATH}
fi
上面只分析一部分,由於程式碼比較長,針對開發者部分的CLASSPATH新增沒有列出來。
下面是這個指令碼的重點、實體之處:CLASS分析。Shell指令碼會根據你輸入的命令引數來設定CLASS和HADOOP_OPTS,其中CLASS所指向的類才是最終真正執行你的命令的實體。
# figure out which class to runif [ "$COMMAND"="namenode" ] ;thenCLASS='org.apache.hadoop.hdfs.server.namenode.NameNode'
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_NAMENODE_OPTS"
……
elif [ "$COMMAND"="fs" ] ;then
CLASS=org.apache.hadoop.fs.FsShell
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
……
elif [ "$COMMAND"="jar" ] ;then
CLASS=org.apache.hadoop.util.RunJar
……
elif [ "$COMMAND"="archive" ] ;then
CLASS=org.apache.hadoop.tools.HadoopArchives
CLASSPATH=${CLASSPATH}:${TOOL_PATH}
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
……
else
CLASS=$COMMAND
fi
這裡我們要關心的就是"$COMMAND" = "jar"時對應的類org.apache.hadoop.util.RunJar,這個類等下我們繼續分析,這是我們通向最終目標的下一個路口。
指令碼在最後還設定了hadoop.log.dir、hadoop.log.file等HADOOP_OPTS。接著,就利用exec命令帶上剛才的引數提交任務了。
通過對上面的分析,我們知道了,如果想取代這個指令碼,那就必須至少把Hadoop依賴的庫和配置檔案目錄給加到CLASSPATH中(JAVA_HEAP_MAX和HADOOP_OPTS不是必須的),然後呼叫org.apache.hadoop.util.RunJar類來提交Jar到Hadoop。
To be continued...
相關推薦
Hadoop作業提交分析(一)
bin/hadoop jar xxx.jar mainclass args…… 這樣的命令,各位玩Hadoop的估計已經呼叫過NN次了,每次寫好一個Project或對Project做修改後,都必須打個Jar包,然後再用上面的命令提交到Hadoop Cluster上
Hadoop RPC分析(一) -- Client
[Hadoop RPC呼叫入口] 在使用Hadoop RPC基本框架中,主要是通過getProxy來獲得一個客戶端代理物件,通過這個物件來向服務端傳送RPC請求。 getProxy有多個過載方法,最終都是呼叫到了下面這個函式來進行實現 (來自org.apache.hadoo
【Java】【Flume】Flume-NG啟動過程源代碼分析(一)
code extends fix tar top 依據 oid article gif 從bin/flume 這個shell腳本能夠看到Flume的起始於org.apache.flume.node.Application類,這是flume的main函數所在。 m
linux設備驅動之misc驅動框架源碼分析(一)
linux驅動開發misc設備驅動 1、misc設備驅動框架源碼部分是由內核開發者實現提供的,主要是創建misc類和為驅動開發者提供misc_register函數,來進行創建misc設備。 這部分的源碼在/drvier/char/misc.c裏,代碼如下:/* * linux/drivers/c
linux驅動開發之蜂鳴器驅動源碼分析(一)
linux 蜂鳴器 驅動 蜂鳴器的驅動源碼在/driver/char/buzzer/x210-buzzer.c文件中,源碼如下#include <linux/module.h> #include <linux/kernel.h> #include <linux
Hadoop源碼系列(一)FairScheduler申請和分配container的過程
opened running fetch utils ostream png on() threshold metadata 1、如何申請資源 1.1 如何啟動AM並申請資源 1.1.1 如何啟動AM val yarnClient = YarnClient.createY
【雷電】源代碼分析(一)-- 進入遊戲開始界面
模式 show 源代碼下載 popu 按鍵事件 file fcm md5 顯示 轉載請註明出處:http://blog.csdn.net/oyangyufu/article/details/24941949 源代碼下載:http://download.csdn.n
java代碼實現highchart與數據庫數據結合完整案例分析(一)---餅狀圖
隱藏 des log cred 數據庫數據 idt string 時間 input 作者原創:轉載請註明出處 在做項目的過程中,經常會用到統計數據,同時會用到highchart或echart進行數據展示,highchart是外國開發的數據統計圖插件, echa
使用Apriori進行關聯分析(一)
不一定 再計算 add 在一起 num create images loaddata scan 大型超市有海量交易數據,我們可以通過聚類算法尋找購買相似物品的人群,從而為特定人群提供更具個性化的服務。但是對於超市來講,更有價值的是如何找出商品的隱藏關聯,從而打包促銷,以
python的計數引用分析(一)
結果 class 默認 htm ron 如果 目前 解釋器 bject python的垃圾回收采用的是引用計數機制為主和分代回收機制為輔的結合機制,當對象的引用計數變為0時,對象將被銷毀,除了解釋器默認創建的對象外。(默認對象的引用計數永遠不會變成0) 所有的計數引用+1的
python的random模塊函數分析(一)
分析 之前 pri orm cnblogs 進行 ron sample 函數封裝 random是python產生偽隨機數的模塊,隨機種子默認為系統時鐘。下面分析模塊中的方法: 1.random.randint(start,stop): 這是一個產生整數隨機數的函數,參數st
Java淺談數組之內存分析(一)
靜態 引用變量 ati static ges 組元 strong 淺談 nbsp 數組的內存 1.內存中的數組 數組是一種引用內存,數組引用變量只是一個引用,數組元素和數組變量在內存裏是分開存放的。 實際的數組對象被存放在堆內存(heap)中,數組的引用變量被存儲在棧內存中
SpringMVC的流程分析(一)—— 整體流程概括
classes amp 不同 方法 restfu equals 類圖 strong .get SpringMVC的整體概括 之前也寫過springmvc的流程分析,只是當時理解的還不透徹所以那篇文章就放棄了,現在比之前好了些,想著寫下來分享下,也能增強記憶,也希望可以幫助到
[讀書筆記] Python數據分析 (一) 準備工作
基礎 htm 環境 防止 功能 多維 處理工具 ati 增強 1. python中數據結構:矩陣,數組,數據框,通過關鍵列相互聯系的多個表(SQL主鍵,外鍵),時間序列 2. python 解釋型語言,程序員時間和CPU時間衡量,高頻交易系統 3. 全局解釋器鎖GIL,
Ocata Neutron代碼分析(一)——Neutron API啟動過程分析
process fig ddr arch 異常 run tap 文件中 bridge 首先,Neutron Server作為一種服務(neutron-server.service),可以到Neutron項目目錄中的setup.cfg配置文件中找到對應的代碼入口。 [ent
Spring 源碼分析(一)--整體架構和環境搭建
spring 事件傳播 com 之間 環境搭建 core模塊 batis bsp 元數據 本系統分析的spring源碼版本為4.3.8。 (一)整體架構 這些模塊被分為以下幾個部分 (1)Core Container Core容器(核心容器)包含Core,Bean
同步鎖源碼分析(一)AbstractQueuedSynchronizer原理
font source 程序 ron timeunit 成對出現 只有一個 節點和 包括 文章轉載自 AbstractQueuedSynchronizer的介紹和原理分析 建議去看一下原文的評論,會有不少收獲。 簡介 AbstractQueuedSynchronizer 提
Hadoop學習之路(一)理論基礎和邏輯思維
file 工作 puts 範圍 小文件 集合 無效 任務 問題 三個題目 第一題 問題描述 統計出當前這個一行一個IP的文件中,到底哪個IP出現的次數最多 解決思路 //必須要能讀取這個內容 BufferedReader br = n
【彩彩只能變身隊】用戶需求分析(一)—— 調查問卷
ali avi 麻煩 求學 tiff 提交 在線 課程作業 調查 3月8日的課堂上各組進行了初步的課題宣講,我們及時地得到了老師和同學們的反饋和建議,在此基礎上我們認真思考了我們的課題涉及的各種問題,以老師為對象設計了我們的調查問卷。 問卷的連接:https://www
【彩彩只能變身隊】用戶需求分析(一)—— 調查結果
ket 中國 技術分享 文件 RKE 網站 設計軟件 期待 功能 目錄 1. 引言 1.1. 編寫目的 1.2.項目背景 1.3. 項目範圍 2.用戶需求分析 2.1. 調查問卷(User Survey)