1:安装ubuntu并在ubuntu中安装hadoop
参考链接:http://www.powerxing.com/install-hadoop/
hadoop /etc/hadoop中常用配置文件的解释
hadoop-env.sh
右上角的hadoop-env.sh之前我们已经用到过了,在里面配置了JAVA_HOME环境变量。并且由env这个缩写也可以大概猜到是environment,所以这个文件主要是做环境变量的配置的。
core-site.xml
hadoop core的配置项,该文件主要用来配置全局性的参数具体的配置模版可参考【官方core-site.xml模版】 。hadoop core提供了一套分布式文件系统以及支持Map-Reduce的计算框架。HBase、Pig等都是在hadoop core之上搭建的。
hdfs-site.xml
hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等。里面设置了诸如namenode的地址、datanode的地址等参数。配置模版可参考【官方hdfs-site.xml模版】
mapred-site.xml
mapreduce守护进程的配置项,包括jobtracker和tasktracker。具体参数及释义可参看【官方mapred-site.xml模版】。
log4j.properties
用来记录系统日志。log4j是apache旗下的一个日志记录项目。【log4j项目地址】
2:安装eclispe并且在eclipse中安装hadoop插件
参考链接:https://my.oschina.net/muou/blog/408543
我用的版本是hadoop2.6 ,eclispe是kepper的,用ant编译hadoop2x-eclipse-plugin-master后生成的插件还是不可以用最后换了个eclispe改用neon版本的问题就解决了,这个插件我建议自己编译,因为试过很多次网上的都不好用。
其中遇到的问题:
- ubuntu中eclipse找不到jdk
解决方法:
在eclipse.ini开始处添加
-vm
/opt/jdk1.8.0_121/jre/bin/java
- ./bin/hdfs namenode -format 出现错误 java.net.UnknownHostException: bogon: bogon: Name or service not known
运行以下命令:
echo "127.0.0.1 $HOSTNAME" | sudo tee -a /etc/hosts
3:编码,运行
MyMapper
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
public class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>{
/**
* 重写map方法单词切分
*/
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, LongWritable>.Context context)
throws IOException, InterruptedException {
String[] spilted = value.toString().split(" ");
for (String word : spilted) {
context.write(new Text(word), new LongWritable(1L));
}
}
}
MyReducer
import java.io.IOException;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
public class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>{
@Override
protected void reduce(Text key, Iterable<LongWritable> values,
Reducer<Text, LongWritable, Text, LongWritable>.Context context)
throws IOException, InterruptedException {
long count = 0L;
for (LongWritable value : values) {
count += value.get();
}
context.write(key, new LongWritable(count));
}
}
MyWordCountJob
package com.sl.mapreduceTest.mapper;
import java.net.URI;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
public class MyWordCountJob {
// 输入文件路径
public static final String INPUT_PATH = "hdfs://localhost:9000/testdir/input/words.txt";
// 输出文件路径
public static final String OUTPUT_PATH = "hdfs://localhost:9000/testdir/output";
public static void main(String[] args) throws Exception{
Configuration conf = new Configuration();
//conf.set("fs.hdfs.impl",DistributedFileSystem.class.getName());
// 0.0:首先删除输出路径的已有生成文件
FileSystem fs = FileSystem
.get(new URI(INPUT_PATH), conf);
Path outPath = new Path(OUTPUT_PATH);
if (fs.exists(outPath)) {
fs.delete(outPath, true);
}
@SuppressWarnings("deprecation")
Job job = new Job(conf, "WordCount");
job.setJarByClass(MyWordCountJob.class);
// 1.0:指定输入目录
FileInputFormat.setInputPaths(job, new Path(INPUT_PATH));
// 1.1:指定对输入数据进行格式化处理的类(可以省略)
job.setInputFormatClass(TextInputFormat.class);
// 1.2:指定自定义的Mapper类
job.setMapperClass(MyMapper.class);
// 1.3:指定map输出的<K,V>类型(如果<k3,v3>的类型与<k2,v2>的类型一致则可以省略)
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(LongWritable.class);
// 1.4:分区(可以省略)
job.setPartitionerClass(HashPartitioner.class);
// 1.5:设置要运行的Reducer的数量(可以省略)
job.setNumReduceTasks(1);
// 1.6:指定自定义的Reducer类
job.setReducerClass(MyReducer.class);
// 1.7:指定reduce输出的<K,V>类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(LongWritable.class);
// 1.8:指定输出目录
FileOutputFormat.setOutputPath(job, new Path(OUTPUT_PATH));
// 1.9:指定对输出数据进行格式化处理的类(可以省略)
job.setOutputFormatClass(TextOutputFormat.class);
// 2.0:提交作业
boolean success = job.waitForCompletion(true);
if (success) {
System.out.println("Success");
System.exit(0);
} else {
System.out.println("Failed");
System.exit(1);
}
}
}
需要用到的jar(全部都可以在你下的hadoop中找到)
其中遇到最大的问题就是找不到输入输出文件。但是按了eclipse的hadoop插件,hdfs路径自然就找到了。
输入:
word.txt
Hello Edison Chou
Hello Hadoop RPC
Hello Wncud Chou
Hello Hadoop MapReduce
Hello Dick Gu
输出
Chou 2
Dick 1
Edison 1
Gu 1
Hadoop 2
Hello 5
MapReduce 1
RPC 1
Wncud 1
eclispe运行结果