2012-07-12 25 views
24

當我從命令提示符運行Hadoop .jar文件時,它會拋出一個異常說沒有這樣的方法StockKey方法。沒有這樣的方法異常Hadoop <init>

StockKey是我爲自己類型的鍵定義的自定義類。

這裏是個例外:

12/07/12 00:18:47 INFO mapred.JobClient: Task Id : 
attempt_201207082224_0007_m_000000_1, Status : FAILED 

java.lang.RuntimeException: java.lang.NoSuchMethodException: SecondarySort$StockKey.  
<init>() 
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) 
    at org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:109) 
    at org.apache.hadoop.io.WritableComparator.<init>(WritableComparator.java:95) 
    at org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:51) 
    at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795) 
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:817) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:383) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:270) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at  
    org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) 
    at org.apache.hadoop.mapred.Child.main(Child.java:264) 
+1

它**不**說*「沒有這樣的方法StockKey方法」*。剪切並粘貼** real **異常消息和完整的堆棧跟蹤到問題中。 – 2012-07-12 07:30:05

+0

在此處編輯。謝謝。你可以看看嗎? – 2012-07-12 07:32:09

+1

對於像我這樣的未來讀者來說,我也會提醒你將WritableComparable實現變成一個內部類(在我的例子中,它是我的映射器的內部類)。我得到了和上面一樣的例外。當我將它移動到它自己的類時,它運行良好 – 2015-04-23 01:04:50

回答

46

你必須提供你的關鍵類空的默認構造函數。 Hadoop正在使用反射,並且它無法猜測要提供的任何參數。

所以只需添加默認的構造函數:

public StockKey(){} 
+1

當使用內部默認的'Writable'實現'Writable'和'WritableComparable'時,我也遇到了這個問題 - 不僅需要提供默認構造函數,默認的構造函數也必須實例化任何其他的'Writable'實例變量;否則你會得到一個SpillError。 – bbengfort 2013-11-13 15:07:48

62

還有一件事讓錯誤時,這樣對作爲writables,映射器,減速器等

類如果類是檢查內部類,確保聲明爲static(即不需要包含類的實例)。否則,Hadoop不能實例化你的內部類,並會給出同樣的錯誤 - 需要一個零參數構造函數。

+3

你剛剛從吊索上取下了我的屁股。感謝關於靜態內部類的解釋! – 2014-07-03 19:22:18

+1

我不知道內部類必須是靜態才能在封閉類之外實例化,這爲我節省了很多時間和挫敗感。 – DragonDTG 2015-05-01 16:09:18

1

For scala too,我解決了這一問題將默認構造函數如下,

class IntPair (first : IntWritable, second : IntWritable) extends WritableComparable[IntPair] { 

    def this() = this(first = new IntWritable(), second = new IntWritable()) 

    def getFirst() : IntWritable = { 
     first 
    } 

    def getSecond() : IntWritable = { 
     second 
    } 

} 
0

沒有任何回答幫助了我。

在我的情況下,它發生在我錯誤或急於減少構造函數的可見性時。

E.g.父構造函數是公共的,繼承類的默認或保護!

0

正面臨着同樣的問題。 通過遵循@Thomas和@Chris的指針進行修復。

貌似都需要這兩個解決方案來解決這個問題:從@Thomas

  • 答案已被要求作爲Hadoop是使用反射和建設大項目時。

  • 當使用內部類並從main()調用Mappers/Reducers時,需要@Chris的回答。

0

請確保您有默認的構造函數,但我還必須將static關鍵字添加到我的類聲明中。也就是,

public class SecondarySort { 
    public static void main(String[] args) {...} 

    public static class StockKey extends ... {} 
} 
相關問題