分享

新手指导,该如何在开发环境中,创建mapreduce程序

本帖最后由 pig2 于 2014-6-2 13:18 编辑
问题导读
1.mapreduce程序与其他Java程序的区别是什么?
2.map类,reduce类可否放到同一个文件?
3.如何调用map类,reduce类?






对于mapreduce编程,很多同学不太知道,mapreduce到底该怎么写,虽然网络上还是比较案例,但是并没有全部的案例,这里来展示一下,算是给大家一个参考。
这里说一下操作步骤:
(1)首先你需要建立开发环境,如何建立,可以参考下面的帖子
hadoop开发方式总结及操作指导


(2)开发环境建立之后自己建立一个包,这个名字是随便起的,可以起名为mapreduce。
(3)然后建立一个.java文件,可以是mapreduce文件:mapreduce.java
(4)把下面代码放入放入mapreduce.java
(5)这样建立了一个mapreduce程序。

package mapreduce;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.output.*;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;

public class mapreduce {

static final String INPUT_PATH = "hdfs://aboutyun:9000/yy1";
static final String OUT_PATH = "hdfs://aboutyun:9000/Output";

public static void main(String[] args) throws Exception {
//主类
Configuration conf = new Configuration();
final Job job = new Job(conf, mapreduce.class.getSimpleName());
job.setJarByClass(mapreduce.class);
// 寻找输入
FileInputFormat.setInputPaths(job, INPUT_PATH);
// 1.2对输入数据进行格式化处理的类
job.setInputFormatClass(TextInputFormat.class);
job.setMapperClass(MyMapper.class);

// 1.2指定map输出类型<key,value>类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);

// 1.3指定分区
job.setPartitionerClass(HashPartitioner.class);
job.setNumReduceTasks(1);

// 1.4排序分组省略,使用默认
// 1.5规约省略,使用默认
job.setReducerClass(MyReduce.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// 指定输出路径
FileOutputFormat.setOutputPath(job, new Path(OUT_PATH));
// 指定输出的格式或则类
job.setOutputFormatClass(TextOutputFormat.class);

// 把作业提交给jobtracer
job.waitForCompletion(true);

}
//map类
static class MyMapper extends
Mapper<LongWritable, Text, Text, LongWritable> {
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
final String[] splited = value.toString().split("\t");
for (String word : splited) {
context.write(new Text(word), new LongWritable(1L));

}

}

}
//reduce类
static class MyReduce extends
Reducer<Text, LongWritable, Text, LongWritable> {
@Override
protected void reduce(Text k2, java.lang.Iterable<LongWritable> v2s,
Context ctx) throws java.io.IOException, InterruptedException {
long times = 0L;
for (LongWritable count : v2s) {
times += count.get();
ctx.write(k2, new LongWritable(times));
}

}

}

}

已有(23)人评论

跳转到指定楼层
blue5whale 发表于 2016-4-28 23:51:15
when30 发表于 2016-4-28 22:01
最有可能环境不同造成的,上图看看

这个图片是运行后的界面

这个图片是运行后的界面


回复

使用道具 举报

quenlang 发表于 2014-9-28 23:01:23
楼主,我在eclipse中运行WordCount的实例程序时,没有任何报错信息,设置好输入路径和输出路径后,run,然后控制台没有map  和  job 的信息输出,只有如下信息:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.util.Shell).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
但是我把整个project打成jar包,放到hadoop,命令行中就能执行成功,并有map和job的信息输出,请问你遇到过这种情况码?
回复

使用道具 举报

小熊007 发表于 2014-9-27 17:04:31
有点简单呢
回复

使用道具 举报

quenlang 发表于 2014-9-28 22:19:57
学习了   谢谢分享
回复

使用道具 举报

howtodown 发表于 2014-9-29 14:29:11
quenlang 发表于 2014-9-28 23:01
楼主,我在eclipse中运行WordCount的实例程序时,没有任何报错信息,设置好输入路径和输出路径后,run,然 ...
winutils.exe是否添加



详细参考:
零基础学习hadoop到上手工作线路指导(编程篇)

回复

使用道具 举报

hb1984 发表于 2014-11-23 16:31:20
谢谢楼主分享。        
回复

使用道具 举报

tang 发表于 2015-4-4 12:29:04
回复

使用道具 举报

lmf19900120 发表于 2015-4-14 11:49:37
现在对应的最新版本是多少了

点评

hadoop2.6  发表于 2015-4-14 12:20
回复

使用道具 举报

yunmin 发表于 2015-4-19 15:03:48
Exception in thread "main" java.net.UnknownHostException: unknown host: aboutyun
        at org.apache.hadoop.ipc.Client$Connection.<init>(Client.java:214)
        at org.apache.hadoop.ipc.Client.getConnection(Client.java:1196)
        at org.apache.hadoop.ipc.Client.call(Client.java:1050)
        at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:225)
        at $Proxy1.getProtocolVersion(Unknown Source)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:396)
        at org.apache.hadoop.ipc.RPC.getProxy(RPC.java:379)
        at org.apache.hadoop.hdfs.DFSClient.createRPCNamenode(DFSClient.java:119)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:238)
        at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:203)
        at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:89)
        at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:1386)
        at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:66)
        at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1404)
        at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254)
        at org.apache.hadoop.fs.Path.getFileSystem(Path.java:187)
        at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(FileInputFormat.java:352)
        at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.setInputPaths(FileInputFormat.java:321)
        at mapreduce.mapreduce.main(mapreduce.java:29)
回复

使用道具 举报

yunmin 发表于 2015-4-19 15:05:09
楼上那个什么问题造成的?每台机的InputPath和OutputPath都应该不一样吗?
回复

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条