今天在将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 会报依赖错误。
相关推荐
解决删除目录提示:System.IO.IOException: 目录不是空的
把 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 进行 ANT 时错误 Javadoc failed java.io.IOException Cannot run program javadoc
java.security.InvalidKeyException:illegal Key Size 微信开发过程中,JDK6的版本
针对java.io.IOException: entity content is too long [180278508] for the configured buffer limit [157286400]异常,将 DEFAULT_BUFFER_LIMIT修改为150M
报错:java.io.IOException: Could not locate executable null\bin\winutils.exe in the Hadoop binaries.-附件资源
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.io.IOException: Server returned HTTP response code: 403 for URL 处理过程记录 BASIC AUTH2 POST接口,解决403问题
复制并覆盖%JAVA_HOME%/jre/lib/security下的local_policy.jar 和 US_export_policy.jar
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,
ORA-29532: Java call terminated by uncaught Java exception: javax.mail.MessagingException: IOException while sending message; nested exception is: javax.activation.UnsupportedDataTypeException: no ...
java安装路径Java\jre\lib\security下替换这两个架包,即可解决 java.security.cert.CertificateException: Unable to initialize, java.io.IOException: Short read of DER length
本人的一片博客,http://blog.csdn.net/jackieriver/article/details/78882194,所需要的一些插件
JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信息传输的解决方案。它实现了SSL和TSL(传输层安全)协议。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术。通过...
Http-Multipart-Data-Parser-master,如需要http post接口开发、http post传文件等操作可以参考,源码的最原始地址忘记了,这个是从上面down下来新版,各位可参考
1、在上传文件前请在计算机C盘新建一个名为“upload”的文件夹,否则会出现如下异常:java.io.IOException: The temporary upload location [C:\upload] is not valid 2、请不要使用360安全浏览器演示本功能,否则会...
类google FS,不是通用的文件系统,只能通过专有API访问,目前提供了C、Java和PHP API 为互联网应用量身定做,解决大容量文件存储问题,追求高性能和高扩展性 FastDFS可以看做是基于文件的key value pair存储系统,...