當前位置:編程學習大全網 - 源碼下載 - hadoop如何分發本地的jar文件

hadoop如何分發本地的jar文件

壹般情況下,我們會使用下面的命令來運行壹個hadoop任務:這個命令實際上是轉化成下面的命令來運行的在RunJar中,會讀取abc.jar文件,然後嘗試從manifest中提取Main-Class作為mainClass,如果manifest中沒有指定,則把abc.jar之後的下壹個參數當成mainClass。接下來,RunJar會在本地創建壹個臨時目錄(下面稱為workDir,類似/tmp/hadoop-unjar...),然後把abc.jar解壓到這個目錄中。然後,把wrokDir、workDir/classes和workDir/lib下的所有文件路徑添加到壹個變量中,然後使用URLClassLoader將這個變量指定的所有路徑加載到當前線程。最後,使用反射調用mainClass的main函數,進入用戶自己的代碼。當我們的代碼調用job.waitForCompletion時,會調用JobClient.copyAndConfigureFiles,把本地的jar文件拷貝到HDFS上面/tmp/hadoop/mapred/staging/<jobid/job.jar/的目錄下。TaskTracker獲取到壹個Task之後,會啟動壹個線程TaskLauncher來處理這個Task。在啟動這個Task之前,會調用taskController.initializeJob來初始化Job,把Job相關的內容從HDFS上拷貝到本地(JobLocalizer.localizeJobJarFile負責拷貝jar並解壓到本地workDir中)。後面TaskRunner.getClassPaths把wrokDir、workDir/classes和workDir/lib下的所有文件路徑添加到壹個變量中,然後使用這個變量構造啟動JVM的參數,最後啟動壹個新的JVM來運行Job。從這個流程可以看出,我們jar中的根目錄,classes目錄,和lib下的所有文件都被添加到了執行環境(另外還有系統自身的環境變量CLASSPATH和Hadoop自身依賴的庫)中。因此,如果我們想要在我們的hadoop中添加壹個外部的庫,可以有兩種方法:1.把外部的jar解壓了,然後將所有的.class與我們自己的代碼打包在壹起(maven-shade-plugin可以很輕松地幫我們做這件事);2.創建壹個lib目錄,把依賴的jar文件放在裏面,然後把lib目錄和我們的代碼打包在壹起。最後,提壹下-libjars參數。如果我們使用ToolRunner.run來啟動我們的Job,那麽可以使用-libjars來指定依賴的外部jar。不過-libjars有壹定的局限性,由於-libjars來指定依賴的外部jar是在ToolRunner.run中使用GenericOptionsParser來加載的,因此在調用ToolRunner.run之前,外部jar還沒有加載,不能使用這些類,甚至import(直接或間接)也不行(JVM加載壹個類時會先檢查這個類所引用的其他類型是否都可以找得到)。如果搞不清楚外部jar在何時可以用,不建議使用-libjars。當然在Map和Reduce階段時,-libjars來指定依賴的外部jar就完全可以無限制地使用了。Hadoop會自動把-libjars來指定依賴的外部jar上傳到HDFS上,每個Job在執行之前,這些jar會自動被拷貝到本地,並設置到classpath中。

  • 上一篇:各種功能測試點步驟
  • 下一篇:通達信主圖疊加籌碼峰
  • copyright 2024編程學習大全網