今天在将hdfs的数据插入数据库时 报错:
java.io.IOException: ORA-00911: invalid character
咋一看此乃ORACLE的独家错误啊 , 难道是SQL写错了?
再仔细看 这个报的错是IO的问题!
顿时头大啊 这.... 怎么一回事啊!
没办法只有打断点跟程序 一步一步的运行了
在org.apache.hadoop.mapreduce.lib.db.DBOutputFormat.DBRecordWriter.close(TaskAttemptContext context)throws IOException ; 的第110行报错.throw new IOException(ex.getMessage());
public void close(TaskAttemptContext context) throws IOException { try { statement.executeBatch(); connection.commit(); } catch (SQLException e) { try { connection.rollback(); } catch (SQLException ex) { LOG.warn(StringUtils.stringifyException(ex)); } throw new IOException(e.getMessage()); } finally { try { statement.close(); connection.close(); } catch (SQLException ex) { throw new IOException(ex.getMessage()); } } }
根据断点可以判断程序是在结束所有的reduce方法(?存在疑问因为测试数据较少无法检测多reduce的情况)
后执行的批量数据插入操作,故需要查看设置SQL是否有问题。
继续往下看到了reduce方法中 Context.write的实现
public void write(K key, V value) throws IOException { try { key.write(statement); statement.addBatch(); } catch (SQLException e) { e.printStackTrace(); } }
在上面的方法中可以发现 传入的value根本没有用; 真正用到的只有key。因此在导出数据库的reduce中可以使用常量来表示value,从而避免无畏的内存消耗。
继续往下看org.apache.hadoop.mapreduce.lib.db.DBOutputFormat的其它方法,发现了constructQuery ()
观其方法内的拼接 SQL字符串的实现,判断:此方法就是插入操作的具体实现
在返回拼接字符串的最后 发现了括号内红色标记的分号;
我们知到在JAVA程序中拼接的SQL末尾是不能 加分号的,会不会就是这货造成的SQL错误呢?
由于源代码只读,因此需要在项目中添加同名DBOutputFormat.java文件
并放在当前项目的与源文件同名的org.apache.hadoop.mapreduce.lib.db.DBOutputFormat的包下
去除 刚刚找到的分号 运行程序 一切正常,接着查看出数据库 发现数据已成功添加.
结论:罪魁祸首 就是这个不起眼的分号!
后记 将自己写的DBOutputFormat.ava 打JAR包,然后用压缩文件的格式打开找到DBOutputFormat.class并替换hadoop-core-1.1.1.jar中的DBOutputFormat.class,而不用每次都重写它的方法了。直接javac 会报依赖错误。
相关推荐
在编程过程中,尤其是在使用C#进行文件系统操作时,可能会遇到这样一个问题:当你尝试删除一个目录,系统返回“System.IO.IOException: 目录不是空的”错误。这意味着该目录下仍有文件或子目录存在,因此无法直接...
在Java编程中,"java.io.FileNotFoundException: ***** (Too many open files)" 是一个常见的错误,意味着程序尝试打开的文件数量超过了操作系统的限制。这个错误通常出现在处理大量文件或长时间运行的程序中,尤其...
Java中的`CharConversionException`是`IOException`的一个子类,主要在字符编码转换过程中遇到问题时抛出。在你的问题中,错误提示是"java.io.CharConversionException: isHexDigit",这通常意味着在处理字符或字符...
报错:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.-附件资源
把 java 代码直接改成 jsp,上传时产生 如下异常: 2012-12-31 8:59:21 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service() for servlet jsp threw exception java.io.IOException: ...
在Eclipse集成开发环境(IDE)中使用ANT进行项目构建时,可能会遇到特定的错误提示:“Javadoc failed java.io.IOException Cannot run program javadoc”。这个错误信息表明在生成Java文档的过程中出现了问题,具体...
java安装路径Java\jre\lib\security下替换这两个架包,即可解决 java.security.cert.CertificateException: Unable to initialize, java.io.IOException: Short read of DER length
在Java编程环境中,"java.security.InvalidKeyException: illegal Key Size" 是一个常见的错误,通常发生在加密或解密操作中。这个错误表示你试图使用的密钥长度超过了Java默认的安全限制。在给定的上下文中,这个...
针对java.io.IOException: entity content is too long [180278508] for the configured buffer limit [157286400]异常,将 DEFAULT_BUFFER_LIMIT修改为150M
本教程将深入讲解如何使用Java Servlet、Apache Commons IO库(版本2.4)以及Apache Commons FileUpload库(版本1.3)来实现这一功能。 一、Apache Commons IO与FileUpload库介绍 Apache Commons IO是一个Java库,...
it.sauronsoftware.jave.EncoderException: java.io.IOException: Cannot run program "C:\Users\moxiao\AppData\Local\Temp\jave-1\ffmpeg.exe": CreateProcess error=740, 请求的操作需要提升。 在最新的liunx ...
在Java编程环境中,进行串口通信时,常常会遇到一个问题:缺少`gnu.io`包,导致无法正常编译或运行程序。这个问题主要出现在使用RXTX库进行串口操作的项目中。RXTX是一个开源的Java库,它提供了与硬件进行串行通信的...
java.io.IOException: Server returned HTTP response code: 403 for URL 处理过程记录 BASIC AUTH2 POST接口,解决403问题
ERROR org.apache.hadoop.mapred.TaskTracker: Can not start task tracker because java.io.IOException: Failed to set permissions of path: \tmp\hadoop-admin \mapred\local\ttprivate to 0700 at org.apache...
javax.mail.jar-Java发送邮件API。Apache Email基于javax.mail做了一个开源项目,参见:http://commons.apache.org/proper/commons-email/
Android Build 时报错: java.io.IOException: Could not parse XML from android/accounts/annotati...Android构建时报错: app:lintVitalRelease[Fatal Error] :3:214: 与元素类型 “item” 相关联的 “name” ...
Java.io.IOException: The same input jar [E:\Android\myProgram\angel\libs\alipaySdk-20160825.jar] is specified twice. 首先 看一下我项目中关于此jar的配置,我在libs中导入了alipaySdk-20160825.jar,
1. **安装 Java**:Jenkins 需要 Java 运行环境,确保系统已安装最新版的 JDK。 2. **下载 Jenkins**:从官方网站获取适合 Linux 平台的 Jenkins 可执行文件。 3. **启动 Jenkins**:通过命令行启动 Jenkins,例如...
ORA-29532: Java call terminated by uncaught Java exception: javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no ...