MapReduce编程实战(2)-词频统计结果存入mysql数据库

摘要

通过实现MapReduce计算结果保存到MySql数据库过程,掌握多种方式保存计算结果的技术,加深了对MapReduce的理解;

Api 文档地址:http://hadoop.apache.org/docs/current/api/index.html

maven资源库:https://mvnrepository.com/repos/central     ##用于配置pom.xml的时候查询资源

 

1.master主机安装mysql

参见文章:https://www.cnblogs.com/hemomo/p/11942661.html

创建maven项目,项目名称hdfs,这里不再说明。

2.修改pom.xml文件

红色部分为增加内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>

  <groupId>com.scitcgroupId>
  <artifactId>hdfsartifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>jarpackaging>

  <name>hdfsname>
  <url>http://maven.apache.orgurl>

  <properties>
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <hadoop.version>2.7.5hadoop.version>
  properties>

  <dependencies>
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>3.8.1version>
      <scope>testscope>
    dependency>
    
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-mapreduce-client-commonartifactId>
      <version>${hadoop.version}version>
    dependency>
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-mapreduce-client-jobclientartifactId>
      <version>${hadoop.version}version>
      <scope>providedscope>
    dependency>
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-clientartifactId>
      <version>${hadoop.version}version>
    dependency>
    
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-yarn-commonartifactId>
      <version>${hadoop.version}version>
    dependency>
     
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-mapreduce-client-coreartifactId>
      <version>${hadoop.version}version>
    dependency> 
    
    <dependency>
      <groupId>org.apache.hadoopgroupId>
      <artifactId>hadoop-hdfsartifactId>
      <version>${hadoop.version}version>
    dependency>
    
    
      mysql
      mysql-connector-java
      5.1.27
      compile
      true
    
    
    <dependency>  
      <groupId>jdk.toolsgroupId>  
      <artifactId>jdk.toolsartifactId>  
      <version>1.8version>  
      <scope>systemscope>  
      <systemPath>${JAVA_HOME}/lib/tools.jarsystemPath>  
   dependency>
   
  dependencies>
  
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.pluginsgroupId>
            <artifactId>maven-compiler-pluginartifactId>
            <configuration>
            <source>1.8source>
            <target>1.8target>
            configuration>
    plugin>
    
    
             maven-assembly-plugin
             
                 
                     jar-with-dependencies
                 
                 
                     
                         
                     
                 
             
             
                 
                     make-assembly
                     package
                     
                         single
                     
                 
             
         
    
    plugins>
build>
  
project>

2. 自定义数据类型(WordCountTb)

Hadoop给封装了许多输入输出的类型,如LongWritable、Text、 IntWritable、NullWritable等基础类型,这些类型和Java的基本数据类型一样,不能满足实际的业务需求;因此,我们可以通关过自定义输入输出类型来实现。

com.scitc.hdfs下新建WordCountTb.java类:

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第1张图片

 

 

 代码如下:

package com.scitc.hdfs;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.lib.db.DBWritable;

public class WordCountTb implements Writable, DBWritable {  
    
//定义字段和构造函数
String name; int value; public WordCountTb(String name, int value) { this.name = name; this.value = value; }

//获取数据库表的字段值 @Override public void readFields(ResultSet resultSet) throws SQLException { // TODO Auto-generated method stub this.name = resultSet.getString(1); this.value = resultSet.getInt(2); } @Override public void write(PreparedStatement statement) throws SQLException { // TODO Auto-generated method stub statement.setString(1, this.name); statement.setInt(2, this.value); } @Override public void write(DataOutput out) throws IOException { // TODO Auto-generated method stub out.writeUTF(name); out.writeInt(value); } @Override public void readFields(DataInput in) throws IOException { // TODO Auto-generated method stub name = in.readUTF(); value = in.readInt(); } }

3.数据库属性类StaticConstant

普通类中定义常量://参考https://blog.csdn.net/rlnlo2pnefx9c/article/details/81277528 

com.scitc.hdfs下新建StaticConstant.java类

代码如下:

package com.scitc.hdfs;

public class StaticConstant {
    public static final String jdbcDriver = "com.mysql.jdbc.Driver";
    public static final String jdbcUrl = "jdbc:mysql://192.168.56.110:3306/test?useUnicode=true&characterEncoding=utf8";
    public static final String jdbcUser = "root";
    public static final String jdbcPassword = "bigData@123";
}

3.编写MapReduce类WordCountToDb

com.scitc.hdfs下新建WordCountToDb.java类

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第2张图片

 

 

 

4:本地运行程序

本地测试非常方便调试。省去排除错误的时候,来回打包在集群运行。

在WordCountToDb类的编辑界面上右击鼠标,在弹出的菜单中选中Run As -> Java Application开始运行该类。

eclipse的console输出如下:

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第3张图片

 

 

 

打开数据库wordcount表查看运行结果:

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第4张图片

5:打包、上传、在集群中运行

运行之前记得删除掉mysql中表wordcount里之前本地运行生成的数据

1.打包

项目名hdfs上右键>>Run As>>Maven clean

项目名hdfs上右键>>Run As>>Maven install

2.上传

项目根目录下的target文件夹中找到hdfs-0.0.1-SNAPSHOT.jar,改文件名为hdfs1.jar,上传到master的/opt/data/目录中

3.用hadoop jar 命令运行hdfs1.jar包

cd /opt/data

hadoop jar hdfs1.jar com.scitc.hdfs. WordCountToDb 

##命令语法:hadoop jar  jar包 类的全名称

 

查看结果:

在集群中运行,出现问题:Error: java.io.IOException: com.mysql.jdbc.Driver

 

解决方法1:

pom配置的插件maven-assembly-plugin

在mavne install之后有两个jar包

一个hdfs-0.0.1-SNAPSHOT-jar-with-dependencies.jar 包含所有依赖

因此在集群运行这个jar包,也会正常执行。  ##测试通过

但是这样jar包40多M,太大了。

 

解决方法2:(推荐)

把jar包传到集群上,命令如下

hadoop fs –mkdir –p /lib/mysql     ##创建目录

hadoop fs -put mysql-connector-java-5.1.27.jar /lib/mysql        ##上传驱动到hdfs的lib/mysql目录中

在WordCountToDb.java中提交任务代码前。添加如下代码:

job.addArchiveToClassPath(new Path("hdfs://master:9000/lib/mysql/mysql-connector-java-5.1.27.jar"));

//8:提交任务
boolean result = job.waitForCompletion(true);

查看结果:

查看集群执行结果:没问题,输出为0字节,因为我们是输出到mysql的。

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第5张图片

 查看mysql数据库:

MapReduce编程实战(2)-词频统计结果存入mysql数据库_第6张图片

 

 

============================

问题集:

问题1:集群中运行jar包,报错:Error: java.io.IOException: com.mysql.jdbc.Driver

解决参考资料:https://www.cnblogs.com/codeOfLife/p/5464613.html

 

你可能感兴趣的:(MapReduce编程实战(2)-词频统计结果存入mysql数据库)