Hadoop DBOutputFormat的使用
最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入;二是采用JDBC的方式进行导入。MapReduce默认提供了DBInputFormat和DBOutputFormat,分别用于数据库的读取和数据库的写入。为了使用DBOutputFormat我们需要完成以下工作。
首先,对于每一个数据库表编写对应的bean类,该类需要实现WritableComparable接口和DBWritable接口(如果是DBInputFormat,则需要实现Writable和DBWritable。之所以是这样是因为DBOutputFormat在输出的时候是将key写入到数据库而不是value。根据Hadoop的规定Key需要能够进行比较排序,所以需要实现WritableComparable)。Bean类的实现以下面的代码为例:
public void readFields(ResultSet result) throws SQLException {
int index = 1;
this.setTestId(result.getString(index++));
this.setTestName(result.getString(index++));
this.setAge(result.getInt(index++));
}
public void write(PreparedStatement statement) throws SQLException {
int index = 1;
statement.setString(index++, this.getTestId());
statement.setString(index++, this.getTestName());
statement.setInt(index, this.getAge());
}
上面两个方法对应着DBWriteable接口。readFields方法负责从结果集中读取数据库数据(注意ResultSet的下标是从1开始的),一次读取查询SQL中筛选的某一列。Write方法负责将数据写入到数据库,将每一行的每一列依次写入。
完成bean的定义后,进行Mapper的编写,主要是解析数据库的每一行数据然后将每一列赋值给bean对应的属性,这里不再做详细的介绍。
最后进行Job的一些配置,具体如下面代码所示:
Configuration conf = new Configuration();
conf.set(DBConfiguration.DRIVER_CLASS_PROPERTY, "com.mysql.jdbc.Driver");
conf.set(DBConfiguration.URL_PROPERTY,
"jdbc:mysql://localhost:3306/htestdb");
conf.set(DBConfiguration.USERNAME_PROPERTY, "root");
conf.set(DBConfiguration.PASSWORD_PROPERTY, "");
job.setNumReduceTasks(0);
DBOutputFormat.setOutput(job, "test", "testid","testname","age");
job.setOutputFormatClass(DBOutputFormat.class);
上面的配置主要包括以下几项:
l 数据库驱动的名称:com.mysql.jdbc.Driver
l 数据库URL:jdbc:mysql://localhost:3306/htestdb
l 用户名:root
l 密码:空
l 数据库表以及每列的名称:DBOutputFormat.setOutput(job, "test", "testid","testname","age")
除此之外还有Hadoop基础设置,比如reduce的个数、输入输出方式、输入输出路径等,这里不再做详细介绍。
需要提醒的是DBOutputFormat以MapReduce的方式运行,会并行的连接数据库。在这里需要合适的设置map活着reduce的个数,以便将并行连接的数量控制在合理的范围之内。
Hadoop DBOutputFormat的使用的更多相关文章
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- [Hadoop in Action] 第7章 细则手册
向任务传递定制参数 获取任务待定的信息 生成多个输出 与关系数据库交互 让输出做全局排序 1.向任务传递作业定制的参数 在编写Mapper和Reducer时,通常会想让一些地方可以配 ...
- Hadoop相关日常操作
1.Hive相关 脚本导数据,并设置运行队列 bin/beeline -u 'url' --outputformat=tsv -e "set mapreduce.job.queuename= ...
- Hadoop:输入,输出,key,value格式
map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3) (K1, V1): jobConf.setInputKeyClas ...
- Hadoop学习资料
转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...
- hadoop MapReduce 笔记
1. MapReduce程序开发步骤 编写map 和 reduce 程序–> 单元测试 -> 编写驱动程序进行验证-> 本地数据集调试 -> 部署到集群运行 用 ...
- hadoop之输入输出格式
<STRONG>jobConf.setInputFormat(MyInputFormat. class ); InputFormat:</STRONG> TextInputFo ...
- Hadoop中常用的InputFormat、OutputFormat(转)
Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...
- Hadoop基础教程之高级编程
从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2 ...
随机推荐
- SQL Server 禁止和启用约束
Alter Table XXX nocheck constraint xxx Alter Table XXX check constraint xxx
- pthread_setschedparam
#include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <sched.h&g ...
- Spring 事物传播特性
Spring 事物传播特性 这是Spring官方的定义 一共有7种 摘自源码省略了一部分 public interface TransactionDefinition { int PROPAGATIO ...
- 采用thinkphp中f方法实现快速缓存实例
一般使用文件方式的缓存就能够满足要求,而thinkphp还提供了一个专门用于文件方式的快速缓存方法f方法. 由于采用的是php返回方式,所以其效率较s方法较高. f方法具有如下特点: 1.简单数据缓存 ...
- GDB十分钟教程 (链接)
未联系作者,只能放个链接了. 十分赞的gdb教程. GDB十分钟教程
- More is better-多多益善
思路:在图中所有的连通分量中找出包含顶点最多的个数.继续使用并查集解决! #include <iostream> using namespace std; ; int tree[MAX]; ...
- 图片后门捆绑利用工具 – FakeImageExploiter
在这里,要向大家推荐一款名为“Fake Image Exploiter”的安全工具,该工具可以在图片文件中捆绑隐藏的恶意.bat或.exe程序,方便钓鱼或社工攻击测试过程中的入侵控制.如果受害者点击该 ...
- 演示-JQuery中伪元素和伪类选择器
HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...
- Socket.BeginConnect 方法
Socket.BeginConnect 方法 (IPAddress, Int32, AsyncCallback, Object) 开始一个对远程主机连接的异步请求. 主机由 IPAddress 和端口 ...
- 定义的函数在main中调用时提示找不到标识符
要把定义的函数放在main函数前,如果放在main函数后了,要在main前做声明.声明就是把函数定义的首部一行加一个分号放在main之前. 在c语言中自定义了一个函数,在main中调用时提示找不到标识 ...