最近在研究数据在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的使用的更多相关文章

  1. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. [Hadoop in Action] 第7章 细则手册

    向任务传递定制参数 获取任务待定的信息 生成多个输出 与关系数据库交互 让输出做全局排序   1.向任务传递作业定制的参数        在编写Mapper和Reducer时,通常会想让一些地方可以配 ...

  3. Hadoop相关日常操作

    1.Hive相关 脚本导数据,并设置运行队列 bin/beeline -u 'url' --outputformat=tsv -e "set mapreduce.job.queuename= ...

  4. Hadoop:输入,输出,key,value格式

    map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3) (K1, V1): jobConf.setInputKeyClas ...

  5. Hadoop学习资料

    转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...

  6. hadoop MapReduce 笔记

    1.        MapReduce程序开发步骤 编写map 和 reduce 程序–> 单元测试 -> 编写驱动程序进行验证-> 本地数据集调试 ->  部署到集群运行 用 ...

  7. hadoop之输入输出格式

    <STRONG>jobConf.setInputFormat(MyInputFormat. class ); InputFormat:</STRONG> TextInputFo ...

  8. Hadoop中常用的InputFormat、OutputFormat(转)

    Hadoop中的Map Reduce框架依赖InputFormat提供数据,依赖OutputFormat输出数据,每一个Map Reduce程序都离不开它们.Hadoop提供了一系列InputForm ...

  9. Hadoop基础教程之高级编程

    从前面的学习中,我们了解到了MapReduce整个过程需要经过以下几个步骤: 1.输入(input):将输入数据分成一个个split,并将split进一步拆成<key, value>. 2 ...

随机推荐

  1. 【Unity】UGUI控件大小适配父容器

    需求:需要把UGUI控件的尺寸调整到指定大小,如匹配至设计的分辨率.或者说想制定覆盖全屏的背景图片. 做法:将这个UGUI控件的RectTransform组件里的Anchor Presets设为预设的 ...

  2. Qt 4.8.5 icpc: Command not found

    icpc: Command not found 交叉编译Qt4.8.5的时候出现

  3. ATM交换机 和普通交换机区别

    运行在 ATM协议上的交换机 普通的是运行在 以太网协议上的 ATM交换机 转发的是广域网二层协议数据包,以太网交换机转发的是局域网二层协议数据包. 网络的ATM是指:异步传输模式,全称是什么 Asy ...

  4. UVA 11019 Matrix Matcher 矩阵匹配器 AC自动机 二维文本串查找二维模式串

    链接:https://vjudge.net/problem/UVA-11019lrjP218 matrix matcher #include<bits/stdc++.h> using na ...

  5. iOS开发小技巧--tableView中实现无数据无分割线,有数据才有分割线

    通过通讯录练习GET的技能

  6. windows server 2003中用系统自带工具调整磁盘分区大小

    先在需要扩展的右边留出未分配的磁盘空间,可以通过 我的电脑 右键 管理 磁盘管理来操作 首先 进入cmd界面 然后输入Diskpart 这个时候进入DISKPART> 界面 然后你 先选择磁盘一 ...

  7. KBEngine 服务器端-loginapp-协议构建、解析执行详细介绍

    宏宏宏 由于 C++ 是静态语言,不能像 js 一样通过函数名字符串来直接执行函数,所以将 messageId 映射到可执行函数的复杂性大大提升:KBEngine 使用了一系列精巧的「宏」来解决这个问 ...

  8. JetBrains PyCharm 4.0.4 key

    用户名 yueting3527 注册码 ===== LICENSE BEGIN ===== 93347-12042010 00001FMHemWIs"6wozMZnat3IgXKXJ 2!n ...

  9. apt-get强制使用Ipv4

    sudo apt-get -o Acquire::ForceIPv4=true update 永久解决办法: 创建文件 /etc/apt/apt.conf.d/99force-ipv4 加入代码: A ...

  10. ubuntu 16.04 安装pycharm

    Ubuntu16.04下安装Cuda8.0+Caffe+TensorFlow-gpu+Pycharm过程(Simple) ubuntu 16.04 安装pycharm 1.安装java  jdk 直接 ...