标签:
mysql数据库读写
hadoop技术推出一度曾遭到关系数据库研究者的挑衅和批评,认为MapReduce不具有关系数据库中的结构化数据存储和处理能力。为此,hadoop社区和研究人员做了多的努力,在hadoop0.19版支持MapReduce访问关系数据库,如:MySQL[lz1] 、Mongodb[lz2] 、PostgreSQL[lz3] 、Oracle [lz4] 等几个数据库系统。Hadoop 访问关系数据库主要通过DBInputFormat类实现的,包的位置在 org.apache.hadoop.mapred.lib.db。以 Mysql为例来学习 MapReduce读写数据。
[lz1]MySQL百度百科:
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
[lz3]PostgreSQL百度百科:
[lz4]Oracle百度百科:
DBInputFormat 在 Hadoop 应用程序中通过数据库供应商提供的 JDBC接口来与数据库进行交互,并且可以使用标准的 SQL 来读取数据库中的记录。学习DBInputFormat首先必须知道二个条件。
第一、在使用 DBInputFormat 之前,必须将要使用的 JDBC 驱动拷贝到分布式系统各个节点的$HADOOP_HOME/lib/目录下。
第二、MapReduce访问关系数据库时,大量频繁的从MapReduce程序中查询和读取数据,这大大的增加了数据库的访问负载,因此,DBInputFormat接口仅仅适合读取小数据量的数据,而不适合处理数据仓库。
提示 处理数据仓库的方法有:利用数据库的 Dump 工具将大量待分析的数据输出为文本,并上传到 HDFS 中进行处理。
http://baike.baidu.com/view/22424.htm?fromtitle=Oracle&fromid=301207&type=syn
下面我们来看看 DBInputFormat类的内部结构,DBInputFormat 类中包含以下三个内置类。
1、protected class DBRecordReader implements RecordReader< LongWritable, T>:用来从一张数据库表中读取一条条元组记录。
2、public static class NullDBWritable implements DBWritable,Writable:主要用来实现 DBWritable 接口。DBWritable接口要实现二个函数,第一是write,第二是readFileds,这二个函数都不难理解,一个是写,一个是读出所有字段。原型如下:
public void write(PreparedStatement statement) throwsSQLException;
public void readFields(ResultSet result);
3、protected static class DBInputSplit implements InputSplit:主要用来描述输入元组集合的范围,包括 start 和 end 两个属性,start 用来表示第一条记录的索引号,end 表示最后一条记录的索引号。
下面对怎样使用 DBInputFormat 读取数据库记录进行详细的介绍,具体步骤如下:
步骤一 、配置 JDBC 驱动、数据源和数据库访问的用户名和密码。代码如下。
DBConfiguration.configureDB (Job job, StringdriverClass, String dbUrl, String userName, String passwd)
MySQL 数据库的 JDBC 的驱动为“com.mysql.jdbc.Driver”,
数据源为“jdbc:mysql://localhost/testDB”,
其中testDB为访问的数据库。useName一般为“root”,passwd是你数据库的密码。
步骤二、使用 setInput 方法操作 MySQL 中的表,setInput 方法的参数如下。
DBInputFormat.setInput(Job job, Class< extends DBWritable> inputClass, String tableName, String conditions,String orderBy, String... fieldNames)
这个方法的参数很容易看懂,inputClass实现DBWritable接口。string tableName表名, conditions表示查询的条件,orderby表示排序的条件,fieldNames是字段,这相当与把sql语句拆分的结果。当然也可以用sql语句进行重载,代码如下。
setInput(Job job, Class< extends DBWritable> inputClass, String inputQuery, StringinputCountQuery)。
步骤三、编写MapReduce函数,包括Mapper 类、Reducer 类、输入输出文件格式等,然后调用job.waitForCompletion(true)。
标签:
原文地址:http://www.cnblogs.com/zlslch/p/5659460.html