MapReduce 程序mysql JDBC驱动类找不到原因及学习hadoop写入数据到Mysql数据库的方法
报错 :ClassNotFoundException: com.mysql.jdbc.Driver
第二个方法:job2.addFileToClassPath(file)和DistributedCache.addFileToClassPath()
第三个方法:所有依赖三方包和MR程序打包到一个jar中,打包完接近180MB。jar包太大了。
第四个方法:依赖的第三方jar打包到lib中,本次任务不需要的jar包可以全删掉 (这里注意:工程的jar和集群jar版本不一致可能导致冲突)。可以运行,导出的lib也小。
conf.set(DBConfiguration.DRIVER_CLASS_PROPERTY,"com.mysql.jdbc.Driver");
conf.set(DBConfiguration.URL_PROPERTY,
"jdbc:mysql://x.x.x.x:3306/test");
conf.set(DBConfiguration.USERNAME_PROPERTY, "xxx");
conf.set(DBConfiguration.PASSWORD_PROPERTY, "xxxx"); //这三行代码是本机测试用的
// conf.set(DBConfiguration.URL_PROPERTY,
// "jdbc:mysql://localhost:3306/test");
// conf.set(DBConfiguration.PASSWORD_PROPERTY, "xxx");
Job job3 = Job.getInstance(conf,"step3:insertToMySqlDB");
job3.setJarByClass(ECMerchantMapReduceV2.class);
job3.setMapOutputKeyClass(DBOutputKey.class);
job3.setMapOutputValueClass(NullWritable.class);
job3.setMapperClass(ECMerchantThirdMap.class);
job3.setOutputFormatClass(DBOutputFormat.class);
job3.setNumReduceTasks(0);
job3.addFileToClassPath(new Path("/xxxx/mysql-connector-java-5.0.3-bin.jar"));
DBOutputFormat.setOutput(job3, "yourtablename", "column1","column2","column3","column4");
FileInputFormat.addInputPath(job3, new Path(otherArgs[3]));
if(!job3.waitForCompletion(true)) return ;
public static class DBOutputKey implements WritableComparable<DBOutputKey>,DBWritable { private String city = "";
private String ec="";
private String account="";
private Date date2=null;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
public DBOutputKey() { } public DBOutputKey(String city, String ec, String account, Date date2) {
super();
this.city = city;
this.ec = ec;
this.account = account;
this.date2 = date2;
} public void set(String city, String ec, String account, Date date2) {
this.city = city;
this.ec = ec;
this.account = account;
this.date2 = date2;
} @Override
public void readFields(DataInput in) throws IOException {
this.city = in.readUTF();
this.ec = in.readUTF();
this.account = in.readUTF();
try {
this.date2 = new Date(format.parse(in.readUTF()).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
} @Override
public void write(DataOutput out) throws IOException {
out.writeUTF(city);
out.writeUTF(ec);
out.writeUTF(account);
out.writeUTF(date2.toString());
} @Override
public int compareTo(DBOutputKey other) {
if (this.city.compareTo(other.city) != 0) {
return this.city.compareTo(other.city);
} else if (!this.ec .equals(other.ec) ) {
return ec .compareTo(other.ec);
} else if (!this.account.equals(other.account)) {
return account.compareTo(other.account);
}else {
return 0;
}
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
}
//下面这2个方法是DBWritable接口的方法
@Override
public void write(PreparedStatement statement) throws SQLException {
statement.setString(1, city);
statement.setString(2, ec);
statement.setString(3, account);
statement.setDate(4, date2);
} @Override
public void readFields(ResultSet resultSet) throws SQLException {
this.city=resultSet.getString(1);
this.ec=resultSet.getString(2);
this.account=resultSet.getString(3);
this.date2=resultSet.getDate(4);
}
}
注意:
1.DBOutputFormat写入数据库,是按照key输出的,没有value,key要实现WritableComparable和DBWritable接口;
2.数据库表字段有个为Sql.date类型private Date date2=null,readFields(DataInput in)和write(DataOutput out)输入输出流不支持Sql.Date类型,通过文中红色代码部分转换格式,即可使Hadoop序列化的时候支持sql.Date数据类型。
public static class ECMerchantThirdMap extends Mapper<LongWritable, Text, DBOutputKey, NullWritable> {
DBOutputKey dbKey=new DBOutputKey();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String date;
@Override
protected void setup(Mapper<LongWritable, Text, DBOutputKey, NullWritable>.Context context)
throws IOException, InterruptedException {
date=context.getConfiguration().get("eradiusDate");
}
public void map(LongWritable ikey, Text ivalue, Context context) throws IOException, InterruptedException {
String[] strs = ivalue.toString().split("\\s+");
if(strs.length!=3) return; Date date2=null;
try {
date2 = new Date(format.parse(date).getTime());
} catch (ParseException e) {
e.printStackTrace();
}
dbKey.set(strs[0], strs[1], strs[2], date2);
context.write(dbKey, NullWritable.get());
} }
Map类直接输出key就可以,不需要reduce类,可以设置reduce数量为0;
MapReduce 程序mysql JDBC驱动类找不到原因及学习hadoop写入数据到Mysql数据库的方法的更多相关文章
- MySQL JDBC驱动版本与MySQL数据库版本对应关系
前言:前段时间发现在家使用和公司一样的mysql jdbc驱动版本发生了异常,原因:家里mysql数据库版本与公司不一致导致.查询了相关资料,发现mysql jdbc驱动版本与mysql数据库版本有一 ...
- mysql的驱动类com.mysql.jdbc.Driver过时了,需要用com.mysql.cj.jdbc.Driver代替
springboot项目整合mybatis,配置文件如下: server: port: 8081 mybatis: config-location: classpath:mybatis/mybatis ...
- mysql——jdbc驱动下载&连接mysql例子
mysql-connector-java-5.1.46.zip[解压后里面jar文件就是所需要的] https://dev.mysql.com/get/Downloads/Connector-J/my ...
- 一个MySQL JDBC驱动bug引起的血案
1.1 问题背景 公司是做电商系统的,整个系统搭建在华为云上.系统设计的时候,考虑到后续的用户和订单数量比较大,需要使用一些大数据库的组件.关系型数据库这块,考虑到后续数据量的快速增长,不是 ...
- java web工程 数据库操作报驱动类找不到的错误
这几天在进行数据库的操作,写好数据库操作类后,用测试类测试成功通过,但是部署到tomcat后,从页面访问就会报异常. 最后终于发现是tomcat使用了连接池的数据连接方式. 解决方法是把jdbc ja ...
- VMware 克隆linux后找不到eth0(学习hadoop,所以想快速搭建一个集群)
发生情况: 由于在学习hadoop,所以想快速搭建一个集群出来.所以直接在windows操作系统上用VMware安装了CentOS操作系统,配置好hadoop开发环境后,采用克隆功能,直接克 ...
- mysql jdbc驱动与java 版本对应关系
当使用某些密码套件时,Connector/J5.1需要JRE 1.8.x才能使用SSL/TLS连接到MySQL 5.6,5.7和8.0.
- MySQL JDBC驱动下载
下载地址:https://pan.baidu.com/s/1VLNaV_rz2P1jMtYrjJydiQ
- windows各种程序中文显示乱码又找不到原因时
我电脑上的各种程序,如xshell,Navicat for MySQL都不正常显示中文,该软件的编码,utf-8,gbk,gb2312来回切换好几回,没一次正常,最好解决办法如下 进入控制 ...
随机推荐
- PS:老权限登录Action 中 WebObjManager有问题,一直登录不起问题
.ashx后面代码要多继承一个, IRequiresSessionState接口
- 【网络知识之七】QUIC(http3)
QUIC(Quick UDP Internet Connection)是谷歌制定的一种基于UDP的低时延的互联网传输层协议. 1.避免前序包阻塞HTTP2的最大特性就是多路复用,而HTTP2最大的问题 ...
- CentOS7 安装nginx-1.14.0
nginx源码包:http://nginx.org/en/download.html 1.安装gcc gcc是用来编译下载下来的nginx源码 yum install gcc-c++ 2.安装pcre ...
- 分布式文件系统fastdfs搭建
https://blog.csdn.net/qq_33009107/article/details/90641940 #Tracker 端口号 22122 启动tracker /etc/init.d/ ...
- Excel技能提升
函数 字符串全半角之间的转换 ASC将全角英文字母转换为半角英文字母,其语法是ASC(text) WIDECHAR()将半角英文字母转换为全角英文字母,语法是=WIDECHAR(text) find( ...
- 【须弥SUMERU】分布式安全服务编排实践
一.概要 1.分布式安全服务编排概念 2.须弥(Sumeru)关键实现思路 3.应用场景 二.前言 在笔者看来,安全防御的本质之一是增加攻击者的攻击成本,尤其是时间成本.那么从防御的角度来说,如何尽早 ...
- JavaScript变量与数据类型
变量 javascript的变量很松散,每个变量初始仅仅用于保存一个占位符而已.定义变量的操作符是 var, var 后面跟着一个标识符--当作变量的名字. 比如: var myname;//定义了一 ...
- MVC+Ninject+三层架构+代码生成 -- 总结(五、Ninject)
1.在寫邏輯層前,需要弄好反轉控制,因框架沒有寫接口,所以Ninject只負責返回當前實例,有點類似共享設計模式. public sealed class IOCHelper { private st ...
- Windows git和cmd代理设置
linux的比较简单,直接修改配置文件即可,这里就不再赘述 设置Git代理 http代理: 临时代理: export http_proxy=http://127.0.0.1:7777 export h ...
- 2019 医渡云java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.医渡云等公司offer,岗位是Java后端开发,因为发展原因最终选择去了医渡云,入职一年时间了,也成为了面试官 ...