【问题标题】:Mapreduce job spitting java.io.IOException: com.mysql.jdbc.DriverMapreduce作业吐java.io.IOException:com.mysql.jdbc.Driver
【发布时间】:2017-04-25 01:30:08
【问题描述】:

hadoop - 2.7.3

我正在创建一个从 HDFS 输入文件读取数据并将数据写入 mysql 的 mapreduce 作业。

在启动连接时抛出错误。没有其他信息,例如连接被拒绝或 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);

    }

我已将 mysql-connector 添加到类路径、HADOOP_CLASSPATH、-libjars、引用的库和 lib 文件夹中。这些似乎都不起作用。

任何帮助将不胜感激。

【问题讨论】:

  • 几个月前我们遇到了类似的问题。我们必须连接 java 远程调试器才能查看异常中的详细信息,以便我们确定问题。我们还没有找到从系统中获取这些必要细节的方法。
  • 我通过将mysql-connect jar添加到hadoop库(例如mapreduce文件夹,hdfs文件夹,common文件夹,yarn文件夹,工具文件夹下的lib)解决了这个问题。我确信 hadoop 正在这些文件夹之一中寻找外部 jar。

标签: java mysql hadoop jdbc mapreduce


【解决方案1】:

查看此特定堆栈跟踪时,这看起来像是权限问题:

在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:415) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)

我猜 Yarn 用户对 temp 目录的写入权限不足。

【讨论】:

  • 感谢您的帮助。我通过将mysql-connect jar添加到hadoop库来解决它,例如mapreduce文件夹,hdfs文件夹,common文件夹,yarn文件夹,工具文件夹下的lib。我确信 hadoop 正在这些文件夹之一中寻找外部 jar。
【解决方案2】:

希望此网址有助于跟踪问题:

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

使用 try 和 catch 跟踪问题,然后可能会修复。

【讨论】:

  • 感谢您的帮助。我通过将mysql-connect jar添加到hadoop库来解决它,例如mapreduce文件夹,hdfs文件夹,common文件夹,yarn文件夹,工具文件夹下的lib。我确信 hadoop 正在这些文件夹之一中寻找外部 jar。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多