Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码

                                              作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

    本文主要是记录一写我在学习MapReduce时的一些琐碎的学习笔记, 方便自己以后查看。在调用API的时候,可能会需要maven依赖,添加依赖的包如下:

 <?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>HADOOP</artifactId>
<groupId>yinzhengjie.org.cn</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>MapReduce</artifactId> <dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.6.0</version>
</dependency> <dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency> </dependencies> </project>

一.MapReduce定义
  Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。
  Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。

二.MapReduce优点
1>.MapReduce 易于编程。
  它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce编程变得非常流行。
2>.良好的扩展性。
  当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3>.高容错性。
  MapReduce设计的初衷就是使程序能够部署在廉价的PC机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop内部完成的。
4>.适合PB级以上海量数据的离线处理。
  它适合离线处理而不适合在线处理。比如像毫秒级别的返回一个结果,MapReduce很难做到。

三.MapReduce缺点
  MapReduce不擅长做实时计算、流式计算、DAG(有向图)计算。
1>.实时计算。
  MapReduce无法像Mysql一样,在毫秒或者秒级内返回结果。
2>.流式计算。
  流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。
3>.DAG(有向图)计算。
  多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下。

四.MapReduce进程

  一个完整的mapreduce程序在分布式运行时有三类实例进程:
1>.MrAppMaster:
  负责整个程序的过程调度及状态协调。
2>.MapTask:
  负责map阶段的整个数据处理流程。
3>.ReduceTask:
  负责reduce阶段的整个数据处理流程。

五.MapReduce编程规范
  用户编写的程序分成三个部分:Mapper,Reducer,Driver(提交运行mr程序的客户端)
1>.Mapper阶段
  (1)用户自定义的Mapper要继承自己的父类
  (2)Mapper的输入数据是KV对的形式(KV的类型可自定义)
  (3)Mapper中的业务逻辑写在map()方法中
  (4)Mapper的输出数据是KV对的形式(KV的类型可自定义)
  (5)map()方法(maptask进程)对每一个<K,V>调用一次
2>.Reducer阶段
  (1)用户自定义的Reducer要继承自己的父类
  (2)Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
  (3)Reducer的业务逻辑写在reduce()方法中
  (4)Reducetask进程对每一组相同k的<k,v>组调用一次reduce()方法
3>.Driver阶段
  整个程序需要一个Drvier来进行提交,提交的是一个描述了各种必要信息的job对象

六.Hadoop序列化
1>.为什么要序列化?
  一般来说,“活的”对象只生存在内存里,关机断电就没有了。而且“活的”对象只能由本地的进程使用,不能被发送到网络上的另外一台计算机。 然而序列化可以存储“活的”对象,可以将“活的”对象发送到远程计算机。
2>.什么是序列化?
  序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储(持久化)和网络传输。
  反序列化就是将收到字节序列(或其他数据传输协议)或者是硬盘的持久化数据,转换成内存中的对象。
3>.为什么不用Java的序列化?
  ava的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系等),不便于在网络中高效传输。所以,hadoop自己开发了一套序列化机制(Writable),精简、高效。
4>.为什么序列化对Hadoop很重要?
  因为Hadoop在集群之间进行通讯或者RPC调用的时候,需要序列化,而且要求序列化要快,且体积要小,占用带宽要小。所以必须理解Hadoop的序列化机制。
  序列化和反序列化在分布式数据处理领域经常出现:进程通信和永久存储。然而Hadoop中各个节点的通信是通过远程调用(RPC)实现的,那么RPC序列化要求具有以下特点:
    (1)紧凑:紧凑的格式能让我们充分利用网络带宽,而带宽是数据中心最稀缺的资
    (2)快速:进程通信形成了分布式系统的骨架,所以需要尽量减少序列化和反序列化的性能开销,这是基本的;
    (3)可扩展:协议为了满足新的需求变化,所以控制客户端和服务器过程中,需要直接引进相应的协议,这些是新协议,原序列化方式能支持新的协议报文;
    (4)互操作:能支持不同语言写的客户端和服务端进行交互;
    (5).常用数据序列化类型
5>.常用的数据类型对应的hadoop数据序列化类型

七.MapReduce案例实操

1>.编写mapper类

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package mapreduce.yinzhengjie.org.cn; import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; import java.io.IOException; public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{ Text k = new Text();
IntWritable v = new IntWritable(1); @Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException { // 1 获取一行
String line = value.toString(); // 2 切割
String[] words = line.split(" "); // 3 输出
for (String word : words) { k.set(word);
context.write(k, v);
}
}
}

2>.编写Reduce类

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package mapreduce.yinzhengjie.org.cn; import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{ @Override
protected void reduce(Text key, Iterable<IntWritable> value,
Context context) throws IOException, InterruptedException { // 1 累加求和
int sum = 0;
for (IntWritable count : value) {
sum += count.get();
} // 2 输出
context.write(key, new IntWritable(sum));
}
}

3>.编写驱动类

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E7%94%9F%E6%80%81%E5%9C%88/
EMAIL:y1053419035@qq.com
*/
package mapreduce.yinzhengjie.org.cn; import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordcountDriver { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
/**
* 配合Hadoop的环境变量,如果没有配置可能会抛异常:“ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path”,
* 还有一件事就是你的HADOOP_HOME的bin目录下必须得有winutils.exe
*
*/
System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3"); //获取配置信息
Configuration conf = new Configuration();
Job job = Job.getInstance(conf); //设置jar加载路径
job.setJarByClass(WordcountDriver.class); //设置map和Reduce类
job.setMapperClass(WordcountMapper.class);
job.setReducerClass(WordcountReducer.class); //设置map输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设置Reduce输出
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); //设置输入和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1])); //等待job提交完毕
boolean result = job.waitForCompletion(true); System.exit(result ? 0 : 1);
}
}

八.本地测试

1>.在代码中配置HADOOP_HOME的环境变量

  System.setProperty("hadoop.home.dir", "D:\\yinzhengjie\\softwares\\hadoop-2.7.3");

2>.在resources目录下生成"log4j.properties"配置文件

log4j.rootLogger=${hadoop.root.logger}
hadoop.root.logger=INFO,console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{}: %m%n

3>.点击驱动类的配置文件,如下图的"Edit Configurations...."

4>.编辑“Program arguments”的输入和输出路径(注意,输入路径必须存在,输出路径的目录必须不存在!)

Apache Hive is an open source project run by volunteers at the Apache Software Foundation.
The Apache Hadoop software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models. It is designed to scale up from single servers to thousands of machines, each offering local computation and storage. Rather than rely on hardware to deliver high-availability, the library itself is designed to detect and handle failures at the application layer, so delivering a highly-available service on top of a cluster of computers, each of which may be prone to failures.
Use Apache HBase when you need random, realtime read/write access to your Big Data. This project's goal is the hosting of very
large tables -- billions of rows X millions of columns -- atop clusters of commodity hardware. Apache HBase is an open-source, distributed, versioned, non-relational database modeled after Google's Bigtable: A Distributed Storage System for Structured Data by Chang et al. Just as Bigtable leverages the distributed data storage provided by the Google File System, Apache HBase provides Bigtable-like capabilities on top of Hadoop and HDFS.
Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexible architecture based on streaming data flows. It is robust and fault tolerant with tunable reliability mechanisms and many failover and recovery mechanisms. It uses a simple extensible data model that allows for online analytic application.
Apache Spark is a unified analytics engine for large-scale data processing.

D:\yinzhengjie\data\hello.txt                                                        文件内容戳我!!!!

5>.运行“WordcountDriver.java”程序

6>.查看输出的结果

九.集群测试

1>.删除代码中指定的Windows中HADOOP_HOME的代码,并点击当前模块的设置,即下图中的“Open Module Setting”。

2>.添加"Artifacts"

3>.选择jar,点击“From modules with dependencies....”

4>.选择需要打包的Module和Main Class

5>.完成配置

6>.点击菜单栏的“Build”标签,选择“Build Artifacts...”

7>.点击Build

8>.找到咱们刚刚编译好的jar包,将其上传到hdfs集群中。

9>.将测试文件上传至hdfs集群中

[root@node105 ~]# hdfs dfs -put hello.txt /yinzhengjie/data/

10>.运行我们自己编译好的jar包

[root@node105 ~]# hadoop jar MapReduce.jar  mapreduce.yinzhengjie.org.cn.WordcountDriver /yinzhengjie/data/hello.txt /yinzhengjie/data/output

11>.查看输出的结果

Hadoop基础-MapReduce入门篇之编写简单的Wordcount测试代码的更多相关文章

  1. Hadoop基础-MapReduce的工作原理第一弹

    Hadoop基础-MapReduce的工作原理第一弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在本篇博客中,我们将深入学习Hadoop中的MapReduce工作机制,这些知识 ...

  2. Hadoop基础-MapReduce的Combiner用法案例

    Hadoop基础-MapReduce的Combiner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编写年度最高气温统计 如上图说所示:有一个temp的文件,里面存放 ...

  3. Hadoop基础-MapReduce的常用文件格式介绍

    Hadoop基础-MapReduce的常用文件格式介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MR文件格式-SequenceFile 1>.生成SequenceF ...

  4. Hadoop基础-MapReduce的排序

    Hadoop基础-MapReduce的排序 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce的排序分类 1>.部分排序 部分排序是对单个分区进行排序,举个 ...

  5. Hadoop基础-MapReduce的工作原理第二弹

    Hadoop基础-MapReduce的工作原理第二弹 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Split(切片)  1>.MapReduce处理的单位(切片) 想必 ...

  6. Hadoop基础-MapReduce的Join操作

    Hadoop基础-MapReduce的Join操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.连接操作Map端Join(适合处理小表+大表的情况) no001 no002 ...

  7. Hadoop基础-MapReduce的数据倾斜解决方案

    Hadoop基础-MapReduce的数据倾斜解决方案 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据倾斜简介 1>.什么是数据倾斜 答:大量数据涌入到某一节点,导致 ...

  8. Hadoop基础-MapReduce的Partitioner用法案例

    Hadoop基础-MapReduce的Partitioner用法案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Partitioner关键代码剖析 1>.返回的分区号 ...

  9. 自定义编写jmeter的Java测试代码

    我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","JavaV ...

随机推荐

  1. ffmpeg 转码命令与ffplay

    ffmpeg.exe用于视频的转码. ▫ 最简单的命令 ffmpeg -i input.avi -b:v 640k output.ts 该命令将当前文件夹下的input.avi文件转换为output. ...

  2. Qt5 入门

    main()函数中第一句是创建一个QApplication类的实例. 对于 Qt 程序来说,main()函数一般以创建 application 对象(GUI 程序是QApplication,非 GUI ...

  3. Flask 构建微电影视频网站(一)

    Flask构建电影视频网站 Python MTV模型 Flask微内核 Flask扩展插件配置及使用方法 根据业务开发网站前后台功能 Flask结合MySQL数据库 你将可以独立开发网站 独立部署运维 ...

  4. 【BZOJ4653】【NOI2016】区间 线段树

    题目大意 数轴上有\(n\)个闭区间\([l_1,r_1],[l_2,r_2],\ldots,[l_n,r_n]\),你要选出\(m\)个区间,使得存在一个\(x\),对于每个选出的区间\([l_i, ...

  5. thinkphp5.0.7 &===composer更新===& thinkphp5.0.9 debug “controller not found”

    当thinkphp5.0.7更新到最新版本时,问题来了... 控制类加载不了. 上线版本出现这个情况,也就悲哀了.====== 那么这种问题主要是因为 composer 没有合理的使用: 详细参考:如 ...

  6. 后台CRUD管理jqGrid 插件下载、使用、demo演示

    jqGrid:demo?version=5.2.1download src: http://www.trirand.com/blog/ github:https://github.com/tonyto ...

  7. linux中shell脚本引用另一shell脚本

    调用有三种方法: 1.fork:不同的shell,调用后返回父shell,子shell从父shell中继承变量,但子shell的变量不会带回父shell,直接用path/to/file.sh调用: 2 ...

  8. 【转】c语言中的#号和##号的作用

    @2019-01-25 [小记] c语言中的#号和##号的作用

  9. [CQOI2017]老C的方块

    题目描述 https://www.lydsy.com/JudgeOnline/problem.php?id=4823 题解 观察那四种条件 有没有什么特点? 我们可以把蓝线两边的部分看做两个区域,这样 ...

  10. django rest framework mixins

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXQAAAEZCAIAAAAIa0mAAAAU/0lEQVR4nO2d247cxoGG5y3yKH6AAf