MapReduce錯誤之Error: java.lang.RuntimeException: java.lang.NoSuchMethodException的解決方法


今天跑MapReduce項目的時候遇到了這個問題,日志如下所示:

18/03/27 01:23:15 DEBUG ipc.ProtobufRpcEngine: Call: getDiagnostics took 19ms Error: java.lang.RuntimeException: java.lang.NoSuchMethodException: com.hadoop.train.Anagram$AnagramReducer.<init>() at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:131) at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:629) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:405) at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:162) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1491) at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:157) Caused by: java.lang.NoSuchMethodException: com.hadoop.train.Anagram$AnagramReducer.<init>() at java.lang.Class.getConstructor0(Class.java:2892) at java.lang.Class.getDeclaredConstructor(Class.java:2058) at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:125) ... 7 more

  從日志看只有Reduce函數報錯,而Map函數正常,於是我對比了一下Map函數和Reduce函數,然后發現在類的申明當中Map函數使用了static關鍵字進行修飾,Reduce函數沒有使用static關鍵字修飾。也確實是這樣,我將Reduce函數也使用static關鍵字修飾之后就能正常運行了。所以,為什么會這樣呢?

  所有static成員都是在程序裝載時初始化的,被分配在一塊靜態存儲區域。 這個區域的成員一旦被分配,就不會再改變地址,直到程序結束才會被釋放。在Java機制中,當一個方法或者變量需要進行初始化加載,或者是經常被調用的時候需要用static關鍵字進行修飾。用static修飾的方法可以用類名直接調用,而不用需要一定要先實例化一個對象然后才可以調用。因為在main函數中是按照類名來調用方法的,所以要將Reduce內部類申明為靜態的。

 

 

以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關注博主以第一時間獲取更新哦,謝謝!

 

 

 

 版權聲明:本文為博主原創文章,未經博主允許不得轉載。

 


免責聲明!

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



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