内容简介
一、Hadoop与数据库交互简介
Hadoop在处理数据过程中接触得较多的就是文本文件即TextInputFormat,这也是MapReducer框架默认的输入格式,但是在某些情况下Hadoop需要与关系型数据库,如MySQL、Oracle等进行交互,有以下原因:
- 需要将关系型数据库的数据作为处理的数据输入
- 需要将数据的统计结果存储进关系型数据库以备分析
- 将关系型数据库的数据迁移进HDFS
第于第三点而言,更为流行的做法就是使用Apache 的 Sqoop,先挖个坑这个以后会介绍。为此,Hadoop提供DBInputFormat输入类,满足这个需求。DBInputFormat使用JDBC从关系型数据库中读取数据,而与之对应的输出类是DBOutputFormat,它也是使用JDBC将数据写入关系型数据库中。
为了演示全面,本次操作将完成这样一个任务,从数据库的words表中读取单词,然后统计单词个数后将结果写入stats表中。具体做法是先编写类MySqlDBWritable,对从关系型数据库中取出的数据进行串行化与逆串行化,然后编写常规的Map与Reducer统计单词个数,并将数据分装进MySqlDBWritable中写入数据库。
二、操作前的准备
Hadoop版本是:2.6.0-cdh5.7.0
开发工具是:IDEA2018
关系型数据库是:MySQL5.6.26
1.创建表
在MySQL中执行如下命令:
创建表words:create table words(id int primary key auto_increment,line varchar(256))
,其中字段line代表一行空格分隔的单词。
创建表status:create table stats(word varchar(25),count int)
,其中字段word 代表统计的单词,count 是其统计个数。
2.将数据插入表words中
hello world hello hadoop
hello spark hello hbase
hello hive hello hadoop
hello kafka hello flume
hello flink hello sqoop
hello spark hello hbase
hello kafka hello flume
hello spark hello hbase
插入数据后words表数据为:
2.将MySQL的驱动分发到所有的Hadoop节点
这一步很关键,因为DBInputFormat和DBOutputFormat需要使用JDBC与MySQL进行交互,而Hadoop默认情况下是没有MySQL的驱动,所以需要将MySQL的驱动分发至所有数据节点上,具体路径是:$HADOOP_HOME/share/hadoop/common/lib
下。
三、Hadoop与MySQL交互实现
1.创建Java工程,添加Maven支持
完整的Maven依赖如下:
<properties>
<hadoop.version>2.6.0-cdh5.7.0</hadoop.version>
</properties>
<repositories>
<repository>
<id>cloudera</id>
<url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${
hadoop.version}</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default