内容来源,工具下载:点此链接  点此链接

Mapreduce概述:

MapReduce是一种分布式计算模型,主要用于搜索领域,解决海量数据的计算问题。MR是由两个阶段组成,Map和Reduce,用户只需要实现map()和reduce()两个函数,即可实现分布式计算,这两个函数的形参是key,value对,表示函数的输入信息。

举例:

实战:

Linux下的data文件夹创建一个文本:

cd /home/data
touch words //创建文本words
gedit words //编辑words

words文本内容:

hello a
hello b
hello c

进行操作:

bin/hadoop fs -mkdir /words //创建words文件夹
bin/hdfs dfs -put /home/data/words /words //words文件上传到hdfs的words路径下
//如果hdfs路径内已经有words路径了,删除
bin/hdfs dfs -rm -r /words

接下来,我们来在Windows下的eclipse里编写mapreduce代码:

首先安装打开eclipse,创建一个maven项目:

pom.xml:添加依赖

    <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hadoop.version>2.7.1</hadoop.version>
</properties> <dependencies>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>${hadoop.version}</version>
</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-core</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>

右键项目名,Build Path —— Configure Build Path,修改jdk版本

创建java 文件,开始编写mapper:

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {//LongWritable相当于long,Text相当于String,IntWritable相当于int
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
// 得到输入的每一行数据 hello a
String line = value.toString(); // 分割数据,通过空格来分割 hello,a
String[] words = line.split(" "); // 循环遍历并输出
// hello,1
// a,1
for (String word : words) {
context.write(new Text(word), new IntWritable(1));//每个值输出一次
} }
}

编写Reducer:

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> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context content) throws IOException, InterruptedException {
Integer count = 0;
for (IntWritable value : values) {//迭代遍历
count += value.get();
}
content.write(key, new IntWritable(count));
}
}

编写Mapreduce:

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 WordCountMapReduce {
public static void main(String[] args) throws Exception {
// 创建配置对象
Configuration conf = new Configuration(); // 创建job对象
Job job = Job.getInstance(conf, "wordcount"); // 设置运行job的主类
job.setJarByClass(WordCountMapReduce.class); // 设置mapper类
job.setMapperClass(WordCountMapper.class);
// 设置reducer类
job.setReducerClass(WordCountReducer.class); // 设置map输出的key value
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 设置reducer输出的key value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class); // 设置输入输入的路径
FileInputFormat.setInputPaths(job, new Path("hdfs://hadoop:9000/words"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop:9000/out")); // 提交job
boolean b = job.waitForCompletion(true); if(!b) {
System.err.println("This task has failed!!!");
} }
}

导出jar包:

第一种方式:

项目右键——Export

第二种方式:(把所有jar包都导入进去,包括依赖的jar包)先运行(报错不用管)

打开虚拟机,终端启动hadoop(hadoop目录下sbin/start-all.sh)

把刚刚导出的jar包放入/home/jars中,

//运行jar包
bin/yarn jar /home/jars/wc.jar

运行进程可以打开hadoop:8088查看

运行完成后打开hadoop:50070,上方Utilities——第一个,查看hdfs中目录是否有out

//查看out中数据
bin/hdfs dfs -ls /out
bin/hdfs dfs -cat /out/part-r-

可以看到结果

a
b
c
hello

在Windows下连接hadoop:

在第一个链接里面有个源码的文件包,里面有两个工具,hadoopbin包和hadoop-eclipse-plugin-2.7.0.jar。

先将hadoop包打开,放在一个目录下,然后进行环境配置:

path里添加:

将hadoop-eclipse-plugin-2.7.0.jar放入eclipse安装目录下的plugins目录下,将hadoopbin包中的文件放在hadoop安装目录的bin目录下,全部替换。

把hadoopbin包中的hadoop.dll文件放在 C:\Windows\System32 中

打开eclipse(如果此时eclipse是打开状态,请重启):如果此时左侧的DFS Locations没有出现,说明插件有问题,请换一个插件

确定

上方Window -> Show View -> Other -> Map/Reduce Tools :

下方会出现:点击右方小象:

(1)添加你想起的location名字,我这里起名hadoop

(2)(3)应该和mapred-site.xml里的一致,如果没有,默认IP地址,port为50020;

(4)(5)和core-site.xml一致

(6)Linux下使用的用户名

如果出现:说明成功了

如果没成功,可能是插件版本或者插件本身问题(我被这个插件折腾了几个星期),试着换插件。

PS1.输入输出中的hadoop对应的IP地址,如果不直接写IP地址的话,可以在Windows下添加映射:

打开C:\Windows\System32\drivers\etc 下的hosts文件,末尾添加:

hadoop  10.128.255.203

注意一下,如果虚拟机的ip地址换了的话,不要忘记更换此处的映射;如果虚拟机的hosts文件也添加了映射,也不要忘记更换。

PS2.如果怀疑是端口连不上,可以使用telnet:

打开控制面板:

安装完成后打开命令行:

出现

说明端口连接成功。

MapReduce初学习的更多相关文章

  1. clisp, scheme 和 clojure 初学习

    clisp, scheme和clojure 初学习 1 clojure "clojure绝对会成为你的编程工具箱里的终极武器" "其他语言可能只是工具,但 Clojure ...

  2. 第2节 mapreduce深入学习:14、mapreduce数据压缩-使用snappy进行压缩

    第2节 mapreduce深入学习:14.mapreduce数据压缩-使用snappy进行压缩 文件压缩有两大好处,节约磁盘空间,加速数据在网络和磁盘上的传输. 方式一:在代码中进行设置压缩 代码: ...

  3. 第2节 mapreduce深入学习:8、手机流量汇总求和

    第2节 mapreduce深入学习:8.手机流量汇总求和 例子:MapReduce综合练习之上网流量统计. 数据格式参见资料夹 需求一:统计求和 统计每个手机号的上行流量总和,下行流量总和,上行总流量 ...

  4. 第2节 mapreduce深入学习:7、MapReduce的规约过程combiner

    第2节 mapreduce深入学习:7.MapReduce的规约过程combiner 每一个 map 都可能会产生大量的本地输出,Combiner 的作用就是对 map 端的输出先做一次合并,以减少在 ...

  5. 第2节 mapreduce深入学习:6、MapReduce当中的计数器

    第2节 mapreduce深入学习:6. MapReduce当中的计数器 计数器是收集作业统计信息的有效手段之一,用于质量控制或应用级统计.计数器还可辅助诊断系统故障.如果需要将日志信息传输到map ...

  6. 第2节 mapreduce深入学习:4, 5

    第2节 mapreduce深入学习:4.mapreduce的序列化以及自定义排序 序列化(Serialization)是指把结构化对象转化为字节流. 反序列化(Deserialization)是序列化 ...

  7. 第2节 mapreduce深入学习:2、3

    第2节 mapreduce深入学习:2.MapReduce的分区:3.分区案例的补充完成运行实现 在MapReduce中,通过我们指定分区,会将同一个分区的数据发送到同一个reduce当中进行处理,例 ...

  8. c# window服务-初学习

    window服务-初学习 一.工具: VS2015+NET Framework4.5. 二.操作: 1.新建windows服务的项目: 2.修改windows服务相关内容: 3.预览windows服务 ...

  9. Python初学习:简单的练习题

    Python初学习 一些见到那的练习题: 初级难度 设计一重量转换器,输入以g为单位的数字后,返回换算结果以Kg为单位的结果 中级难度 设计一个求直角三角形斜边长的函数,(以两个直角边为参数,求最长边 ...

随机推荐

  1. C#格式化时间,货币

    1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...

  2. Selenium2+python自动化53-unittest批量执行(discover)【转载】

    前言 我们在写用例的时候,单个脚本的用例好执行,那么多个脚本的时候,如何批量执行呢?这时候就需要用到unittet里面的discover方法来加载用例了. 加载用例后,用unittest里面的Text ...

  3. k8s的chart学习(上)

    chart 是 Helm 的应用打包格式.chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源,比如 Service.Deployment.PersistentV ...

  4. mysql数据库设计之物理设计

    一.存储引擎 推荐使用Innodb,这也是mysql默认使用的存储引擎,支持事务 二.属性的选择 字符选择: 1.char,存定长,速度快,存在空间浪费的可能,会处理尾部空格,上限255字节.(utf ...

  5. Lookup 组件用法全解

    Lookup是查找的意思,Lookup组件实现两个数据源的连接,和Join语句实现的功能类似,使用Lookup 组件需要配置: 两个输入:一个是上游数据流的输入Source Table,一个是要查找的 ...

  6. Java的位运算符与二进制转换

    转换: Java整型数据类型有:byte.char.short.int.long.要把它们转换成二进制的原码形式,必须明白他们各占几个字节.,一个字节==8位数 数据类型                ...

  7. 遇见requestAnimationFrame

    今天,在读javascript异步编程的js事件深入理解部分的时候,了解到了requestAnimationFrame 这个api,在这里记录一下. 原文: setTimeout 和 setInter ...

  8. 51nod 最长公共子序列问题(动态规划)(LCS)(递归)

    最长公共子序列问题 输入 第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000) 输出 输出最长的子序列,如果有多个,随意输出1个. 输入示例 abcicba abdkscab 输 ...

  9. ASP.NET Core 2.2 基础知识(十三) WebAPI 概述

    我们先创建一个 WebAPI 项目,看看官方给的模板到底有哪些东西 官方给出的模板: [Route("api/[controller]")] [ApiController] pub ...

  10. (转) C#解惑:HashSet<T>类

    HashSet<T>是一个相对“冷门”的类型,平时在项目中用得不多,但是在特定的业务中可以大用. 先来了解下HashSet<T>类,主要被设计用来存储集合,做高性能集运算,例如 ...