2017-04-25 33 views
1

的Hadoop - 2.7.3MapReduce工作吐痰產生java.io.IOException:com.mysql.jdbc.Driver

我創建MapReduce工作,從HDFS輸入文件中讀取數據,併到MySQL寫入數據。

它啓動連接時發生錯誤。沒有像連接被拒絕或classNotFound異常的額外信息。簡單的IO異常,它對我沒有任何意義。

Error: java.io.IOException: com.mysql.jdbc.Driver 
at org.apache.hadoop.mapreduce.lib.db.DBOutputFormat.getRecordWriter(DBOutputFormat.java:185) 
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.<init>(ReduceTask.java:540) 
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:614) 
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:389) 
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164) 
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:1698) 
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158) 

我的MapReduce代碼:

public static void main(String[] args) throws Exception { 

    Configuration conf = new Configuration(); 

    DBConfiguration.configureDB(conf, "com.mysql.jdbc.Driver",    
      "jdbc:mysql://localhost:3306/db", 
      "user", 
      "password"); 

    Job job = Job.getInstance(conf, "test"); 
    job.setJar(DBMapReduce.class); 
    job.setMapperClass(DbMapper.class); 
    job.setReducerClass(DbSQLReducer.class);  

    job.setMapOutputKeyClass(DBKeyWritable.class); 
    job.setMapOutputValueClass(Text.class); 

    job.setOutputKeyClass(DBOutputWritable.class); 
    job.setOutputValueClass(NullWritable.class); 
    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(DBOutputFormat.class); 
    FileInputFormat.addInputPath(job, new Path(args[1])); 
    DBOutputFormat.setOutput(
      job, 
      "table_name", // output table name 
      new String[] { "dummy", 
        "code", 
        "code_type" 
    } //table columns 
    ); 

    System.exit(job.waitForCompletion(true) ? 0 : 1); 

    } 

我已經加入到classpath中,HADOOP_CLASSPATH,-libjars,引用的庫和lib文件夾mysql的連接器。這些似乎都不起作用。

任何幫助將不勝感激。

+0

幾個月前我們遇到類似的問題。我們必須連接java遠程調試器才能看到異常中的細節,以便我們確定問題。我們仍然沒有找到一種方法從系統中獲得這些必要的細節。 – Jason

+0

我通過將mysql-connect jar添加到hadoop庫,例如mapreduce文件夾,hdfs文件夾,常用文件夾,yarn文件夾,tools文件夾下的lib來解決問題。我相信hadoop正在這些文件夾之一尋找外部罐子。 –

回答

0

看着這個特殊的堆棧跟蹤時,這看起來像一個權限問題:

在java.security.AccessController.doPrivileged(本機方法) 在javax.security.auth.Subject.doAs(Subject.java :415) 在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)

我想沒有用於紗線用戶臨時目錄中有足夠的寫權限。

+0

謝謝你的幫助。我通過將mysql-connect jar添加到hadoop庫,例如mapreduce文件夾,hdfs文件夾,常用文件夾,紗線文件夾,tools文件夾下的lib來解決問題。我相信hadoop正在這些文件夾之一尋找外部罐子。 –

0

希望這個網址助陣追蹤問題:

https://examples.javacodegeeks.com/core-java/io/ioexception/java-io-ioexception-how-to-solve-ioexception/

通過嘗試跟蹤的問題,並趕上然後可能可以解決。

+0

謝謝你的幫助。我通過將mysql-connect jar添加到hadoop庫,例如mapreduce文件夾,hdfs文件夾,常用文件夾,紗線文件夾,tools文件夾下的lib來解決問題。我相信hadoop正在這些文件夾之一尋找外部罐子。 –