准备工作:

1.设置HADOOP_HOME,指向hadoop安装目录

2.在window下,需要把hadoop/bin那个目录替换下,在网上搜一个对应版本的

3.如果还报org.apache.hadoop.io.nativeio.NativeIO$Windows.access0错,把其中的hadoop.dll复制到c:\windows\system32目录

依赖的jar

1.common
  hadoop-2.7.3\share\hadoop\common\hadoop-common-2.7.3.jar
  hadoop-2.7.3\share\hadoop\common\lib下的所有
2.hdfs
  hadoop-2.7.3\share\hadoop\hdfs\hadoop-hdfs-2.7.3.jar
  hadoop-2.7.3\share\hadoop\hdfs\lib下的所有
3.mapreduce
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-app-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-common-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-core-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-hs-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-hs-plugins-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-jobclient-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-jobclient-2.7.3-tests.jar
  hadoop-2.7.3\share\hadoop\mapreduce\hadoop-mapreduce-client-shuffle-2.7.3.jar
  hadoop-2.7.3\share\hadoop\mapreduce\lib下的所有
4.yarn
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-api-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-applications-distributedshell-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-applications-unmanaged-am-launcher-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-client-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-common-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-registry-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-applicationhistoryservice-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-common-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-nodemanager-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-resourcemanager-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-sharedcachemanager-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-tests-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib\hadoop-yarn-server-web-proxy-2.7.3.jar
  hadoop-2.7.3\share\hadoop\yarn\lib下的所有

可以通过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">
<modelVersion>4.0.0</modelVersion> <groupId>xiaol</groupId>
<artifactId>xiaol-hadoop</artifactId>
<version>1.0-SNAPSHOT</version>
<description>MapReduce</description> <properties>
<project.build.sourceencoding>UTF-8</project.build.sourceencoding>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>${hadoop.version}</version>
</dependency>
<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>
</dependencies>
</project>

配置Log4J,放到src/main/resources目录下

log4j.rootCategory=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n

编写Mapper:

package xiaol;

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; /**
* 整个工作过程:input->split->map->shuffle->reduce->output
* input: 每一行都是空格分割的单词
* hello java
* hello python
* split: 默认按行读取input,每一行作为一个KV对,交给下一步
* K就是行首地址,V就是行内容
* K:1 V:hello java
* K:11 V:hello python
* 当然这一步可以用户自己重写
* map: 必须由用户实现的步骤,进行业务逻辑处理
* 从split的结果中读取数据,统计单词,产生KEYOUT VALUEOUT交给shuffle
* 这里交给shuffle的K是单词,V是单词出现的次数
* hello 1
* java 1
* shuffle map的结果是KV对的形式,会把相同的K移动到同一个Node上去进行reduce
* 当传给reduce的时候会相同K的V组装成Iterable<VALUEOUT>类型
* hello 1,1
* 当然这一步可以用户自己重写
* reduce 必须由用户实现的步骤,进行业务逻辑处理,将shuffle过来的结果进行汇总
* 从shuffle的结果中读取数据,统计单词,产生KEYOUT VALUEOUT交给output
* hello 2
*/
/**
* org.apache.hadoop.mapreduce.Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
* KEYIN split完成后交给map的key的类型
* VALUEIN split完成后交给map的value的类型
* KEYOUT map完成后交给shuffle的key的类型
* VALUEOUT map完成后交给shuffle的key的类型
* org.apache.hadoop.io.LongWritable hadoop自己的Long包装类
* org.apache.hadoop.io.Text hadoop自己的Text
* org.apache.hadoop.io.IntWritable hadoop自己的Int包装类
*/
public class WordMapper extends Mapper<LongWritable,Text,Text,IntWritable> {
/**
* 重写map方法
* protected void map(KEYIN key, VALUEIN value, Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException
* KEYIN split完成后交给map的key的类型,就是那一行的起始地址
* VALUEIN split完成后交给map的value的类型,就是那一行的内容
* Context 整个MapReduce的执行环境
*/
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String s = value.toString();
String[] words = s.split(" "); //由于每一行都是空格分割的单词,比如hello java这种的,要统计个数,就先拆分
for(String word: words){
/**
* 在执行环境中写入KEYOUT和VALUEOUT作为下一步(shuffle)的输入
*
* 这一步是要统计在当前处理这一行里每个单词出现的次数,这里直接给了个1
* 这里可能有的人会有疑问:如果在某一行里出现了两个相同的单词会怎么样?
* 这个是不影响的,比如出现了两个hello,结果就是给shuffle的时候会有两个hello 1
* 然后shuffle的时候会把这两个hello 1交给reduce去处理
*/
context.write(new Text(word), new IntWritable(1));
}
}
}

编写Reducer

package xiaol;

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.Reducer; /**
* org.apache.hadoop.mapreduce.Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
*/
public class WordReducer extends Reducer<Text, IntWritable, Text, LongWritable> { /**
* 重写reduce方法
* protected void reduce(KEYIN key, Iterable<VALUEIN> values, Reducer<KEYIN, VALUEIN, KEYOUT, VALUEOUT>.Context context) throws IOException, InterruptedException
* KEYIN shuffle完成后交给reduce的key的类型,其实就是map的KEYOUT
* Iterable<VALUEIN> shuffle完成后交给reduce的value的类型的数组(shuffle那一步会把相同的K分发到同一个node上去进行reduce,所以这里是V数组),其实就是map的VALUEOUT数组
* Context 整个MapReduce的执行环境
*/
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, LongWritable>.Context context) throws IOException, InterruptedException {
long count = 0;
for(IntWritable v : values) {
count += v.get();
}
context.write(key, new LongWritable(count));
} }

编写启动类:

本地运行(本地数据源,本地计算):

package xiaol;

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.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.util.Properties; /**
*
*/
public class Test {
public static void main(String[] args) throws Exception {
//本地运行直接new一个Configuration,远程运行需要配集群相关的配置
Configuration conf = new Configuration(); Job job = Job.getInstance(conf); //设定mapper和reducer的class
job.setMapperClass(WordMapper.class);
job.setReducerClass(WordReducer.class); //设定mapper和outputKey和outputValue的class
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设定reducer和outputKey和outputValue的class
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); FileInputFormat.setInputPaths(job, "d:/test/test.txt");
FileOutputFormat.setOutputPath(job, new Path("d:/test/out/")); //等待结束,true代表打印中间日志
job.waitForCompletion(true);
}
}

拉取远程数据到本地运行

package xiaol;

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.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.util.Properties; /**
*
*/
public class Test {
public static void main(String[] args) throws Exception {
//本地运行直接new一个Configuration,远程运行需要配集群相关的配置
Configuration conf = new Configuration(); Job job = Job.getInstance(conf); //设定mapper和reducer的class
job.setMapperClass(WordMapper.class);
job.setReducerClass(WordReducer.class); //设定mapper和outputKey和outputValue的class
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设定reducer和outputKey和outputValue的class
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); FileInputFormat.setInputPaths(job, "hdfs://192.168.0.104:9000/input/input.txt");
FileOutputFormat.setOutputPath(job, new Path("d:/test/out/")); //等待结束,true代表打印中间日志
job.waitForCompletion(true);
}
}

在远程运行:

准备工作:把本地的工程打成一个jar包(程序里要用)

程序里需要告诉hadoop通过这个jar去做计算,不用手动传到yarn框架里,只要告诉程序就好了

我这个例子里,直接放在项目根目录下

package xiaol;

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.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import java.util.Properties; /**
*
*/
public class Test {
public static void main(String[] args) throws Exception {
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root"); Configuration conf = new Configuration();
//配置hdfs地址
conf.set("fs.defaultFS", "hdfs://192.168.0.104:9000/");
//配置运行的是那个jar
conf.set("mapreduce.job.jar", "xiaolhadoop.jar");
//配置计算框架
conf.set("mapreduce.framework.name", "yarn");
//配置yarn的ResourceManage地址
conf.set("yarn.resourcemanager.hostname", "192.168.0.104");
//告诉hadoop这是从window上提交的任务(好像这步也并没有做什么)
conf.set("mapreduce.app-submission.cross-platform", "true"); Job job = Job.getInstance(conf); //设定mapper和reducer的class
job.setMapperClass(WordMapper.class);
job.setReducerClass(WordReducer.class); //设定mapper和outputKey和outputValue的class
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class); //设定reducer和outputKey和outputValue的class
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class); FileInputFormat.setInputPaths(job, "/input/input.txt");
FileOutputFormat.setOutputPath(job, new Path("/out/")); //等待结束,true代表打印中间日志
job.waitForCompletion(true);
}
}

hadoop开发MapReduce程序的更多相关文章

  1. 本地idea开发mapreduce程序提交到远程hadoop集群执行

    https://www.codetd.com/article/664330 https://blog.csdn.net/dream_an/article/details/84342770 通过idea ...

  2. windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法

    按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...

  3. Hadoop之MapReduce程序应用三

    摘要:MapReduce程序进行数据去重. 关键词:MapReduce   数据去重 数据源:人工构造日志数据集log-file1.txt和log-file2.txt. log-file1.txt内容 ...

  4. [MapReduce_add_1] Windows 下开发 MapReduce 程序部署到集群

    0. 说明  Windows 下开发 MapReduce 程序部署到集群 1. 前提 在本地开发的时候保证 resource 中包含以下配置文件,从集群的配置文件中拷贝 在 resource 中新建  ...

  5. 在Eclipse中开发MapReduce程序

    一.Eclipse的安装与设置 1.在Eclipse官网上下载eclipse-jee-oxygen-3a-linux-gtk-x86_64.tar.gz文件并将其拷贝到/home/jun/Resour ...

  6. 用PHP编写Hadoop的MapReduce程序

    用PHP编写Hadoop的MapReduce程序     Hadoop流 虽然Hadoop是用Java写的,但是Hadoop提供了Hadoop流,Hadoop流提供一个API, 允许用户使用任何语言编 ...

  7. 如何在Windows下面运行hadoop的MapReduce程序

    在Windows下面运行hadoop的MapReduce程序的方法: 1.下载hadoop的安装包,这里使用的是"hadoop-2.6.4.tar.gz": 2.将安装包直接解压到 ...

  8. Windows平台开发Mapreduce程序远程调用运行在Hadoop集群—Yarn调度引擎异常

    共享原因:虽然用一篇博文写问题感觉有点奢侈,但是搜索百度,相关文章太少了,苦苦探寻日志才找到解决方案. 遇到问题:在windows平台上开发的mapreduce程序,运行迟迟没有结果. Mapredu ...

  9. HADOOP之MAPREDUCE程序应用二

    摘要:MapReduce程序进行单词计数. 关键词:MapReduce程序  单词计数 数据源:人工构造英文文档file1.txt,file2.txt. file1.txt 内容 Hello   Ha ...

随机推荐

  1. 使用淘宝 NPM 镜像

    http://www.runoob.com/nodejs/nodejs-npm.html ************************************** 大家都知道国内直接使用 npm ...

  2. Linux下出现Read-only file system的解决办法

    正常运行中的网站,忽然间出现session目录不可写,连接服务器一看,任何关于写硬盘的命令都不能用,提示Read-only file system,使用一条命令即可搞定此问题: mount -o re ...

  3. 1. Retrofit2 -- Getting Started and Create an Android Client

    1. Retrofit2 -- Getting Started and Create an Android Client Retrofit tutorial 什么是 Retrofit 如何申明请求 准 ...

  4. 标准差分进化算法matlab程序实现(转载)

    标准差分进化算法matlab程序实现 自适应差分演化算法方面的Matlab和C++代码及论文 差分进化算法 DE-Differential Evolution matlab练习程序(差异演化DE) [ ...

  5. springboot查找配置文件路径的过程

    spring加载配置文件是通过listener监视器实现的,在springboot启动时: 在容器启动完成后会广播一个SpringApplicationEvent事件,而SpringApplicati ...

  6. 【vijos】1629 八(容斥原理+dfs)

    https://vijos.org/p/1629 本来是想出来了的,,,,但是有个地方写挫了一直没发现,sad 就是dfs的时候我传的pos传错了QAQ 这题用容斥很好想 首先在区间[l, r]能被a ...

  7. 邮件正文及其附件的发送的C++实现

     这段代码我花了整整一天来编写,假设转载,请注明出处,谢谢!    前面的一篇文章已经讲了怎样发送邮件正文,原理我就不再叙述了.要了解的同学请到这里查看!    http://blog.csdn.ne ...

  8. 从零开始开发一个vue组件打包并发布到npm (把vue组件打包成一个可以直接引用的js文件)

    自己写的组件 有的也挺好的,为了方便以后用自己再用或者给别人用,把组件打包发布到npm是最好不过了,本次打包支持 支持正常的组件调用方式,也支持Vue.use, 也可以直接引用打包好的js文件, 配合 ...

  9. 微软官方SqlHelper类 数据库辅助操作类

    数据库操作类真的没有必要自己去写,因为成熟的类库真的非常完善了,拿来直接用就好,省时省力. 本文就为大家介绍微软官方的程序PetShop4.0中的SqlHelper类,先来做一下简单的介绍,PetSh ...

  10. poj 3204(最小割)

    题目链接:http://poj.org/problem?id=3204 思路:显然只有增大那最小割边集上的边才能增加最大流,因此,我们可以先跑一遍最大流,然后对于那些满足条件的边u->v,当且仅 ...