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.0</modelVersion>

  <groupId>com.scitc</groupId>
  <artifactId>hdfs</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>hdfs</name>
  <url>http://maven.apache.org</url>

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

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-jobclient</artifactId>
      <version>${hadoop.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-client</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-yarn-common</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-mapreduce-client-core</artifactId>
      <version>${hadoop.version}</version>
    </dependency> 

    <dependency>
      <groupId>org.apache.hadoop</groupId>
      <artifactId>hadoop-hdfs</artifactId>
      <version>${hadoop.version}</version>
    </dependency>

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.27</version>
      <scope>compile</scope>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>jdk.tools</groupId>
      <artifactId>jdk.tools</artifactId>
      <version>1.8</version>
      <scope>system</scope>
      <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
   </dependency>

  </dependencies>

  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
            <source>1.8</source>
            <target>1.8</target>
            </configuration>
    </plugin>

    <plugin>
             <artifactId>maven-assembly-plugin</artifactId>
             <configuration>
                 <descriptorRefs>
                     <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
                 <archive>
                     <manifest>
                         <mainClass></mainClass>
                     </manifest>
                 </archive>
             </configuration>
             <executions>
                 <execution>
                     <id>make-assembly</id>
                     <phase>package</phase>
                     <goals>
                         <goal>single</goal>
                     </goals>
                 </execution>
             </executions>
         </plugin>

    </plugins>
</build>

</project>

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

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

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

代码如下:

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 = "[email protected]";
}

3.编写MapReduce类WordCountToDb

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

4:本地运行程序

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

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

eclipse的console输出如下:

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

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的。

查看mysql数据库:

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

问题集:

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

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

原文地址:https://www.cnblogs.com/hemomo/p/12289303.html

时间: 2024-11-06 11:35:21

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

MapReduce编程实战之“高级特性”

本篇介绍MapReduce的一些高级特性,如计数器.数据集的排序和连接.计数器是一种收集作业统计信息的有效手段,排序是MapReduce的核心技术,MapReduce也能够执行大型数据集间的""连接(join)操作. 计数器 计数器是一种收集作业统计信息的有效手段,用于质量控制或应用级统计.计数器还可用于辅助诊断系统故障.对于大型分布式系统来说,获取计数器比分析日志文件容易的多. 示例一:气温缺失及不规则数据计数器 import java.io.IOException; import

大数据MapReduce 编程实战

MapReduce 编程实战 一.大数据的起源1.举例:(1)商品推荐 问题1:大量订单如何存储?问题2:大量订单如何计算?(2)天气预报: 问题1:大量的天气数据如何存储?问题2:大量的天气数据如何计算? 2.大数据核心的问题: (1)数据的存储:分布式文件系统 (2)数据的计算:分布式计算(MapReduce) 3.MapReduce的计算模型的来源 (1)根据Google发表一篇论文:MapReduce (2)问题:PageRank(网页排名)---> 举例 二.MapReduce的编程模

用Python获取沪深两市上市公司股票信息,提取创近10天股价新高的、停牌的、复牌不超过一天或者新发行的股票,并存入mysql数据库

1 #该脚本可以提取沪深两市上市公司股票信息,并按以下信息分类:(1)当天股价创近10个交易日新高的股票:(2)停牌的股票:(3)复牌不超过一个交易日或者新发行的股票 2 #将分类后的股票及其信息(股价新高.当前状态等)存入mysql数据库 3 from time import * 4 import pandas as pd 5 import tushare as ts 6 from datetime import date 7 import datetime 8 import MySQLdb

Scrapy爬取慕课网(imooc)所有课程数据并存入MySQL数据库

爬取目标:使用scrapy爬取所有课程数据,分别为 1.课程名 2.课程简介 3.课程等级 4.学习人数 并存入MySQL数据库  (目标网址  http://www.imooc.com/course/list) 一.导出数据文件到本地 1.新建imooc项目 1 scrapy startproject imooc 2.修改 items.py,添加项目item 1 from scrapy import Item,Field 2 class ImoocItem(Item): 3 Course_na

特殊符号存入mysql数据库时报错:Incorrect string value: &#39;\xF0\x9F\x98\x84\xF0\x9F的解决方法

问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varchar,字符编码utf-8.部分插入成功,部分插入失败,报错如标题. 在网上查询,有人说是编码问题,建议修改编码格式,比如改成gbk,UTF-8,blob等等,但是几乎没有人给出更详细的答案.在一个英文网站上,才发现真正错误的原因.链接1 链接2 错误原因:我们可以看到错误提示中的字符0xF0 0x9F 0x98 0x84 ,这对应UTF-8编码格式中的4字节编码(UTF-8编码规范).正常的汉字一般不会超过3个字节,为

第二周结对编程作业:词频统计

程序实现的功能是统计文件中出现的词和每个词的频数. 这里的词的规定和平时语言上的规定不太一样,但是更标准化,规定了长度.组成字符和分隔符,在实现中也从这几个方面来寻找词. /*判断字符是否是字母*/ bool isAlphabetic (char c) { return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')); } /*判断字符是否是数字*/ bool isNumerical (char

MapReduce编程实战2——倒排索引(jar包)

任务要求: //输入文件格式 18661629496 110 13107702446 110 1234567 120 2345678 120 987654 110 2897839274 18661629496 //输出文件格式格式 11018661629496|13107702446|987654|18661629496|13107702446|987654| 1201234567|2345678|1234567|2345678| 186616294962897839274|2897839274

MapReduce编程实战1——WorldCout程序编写

import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.i

兔子--中文存入mysql数据库显示乱码

解决办法:吧所有的编码格式改成utf8 1.myeclipse的编码格式 2,数据库和表的编码格式 3.数据库连接的编码格式 url=jdbc:mysql://localhost:3306/project?useUnicode=true&characterEncoding=UTF8