Hadoop一直在我看来是一个艰难的探索旅程,但是在一次又一次的失败之后,终于天道好轮回,看到了一个让人比较满意的结果,下面就这一过程进行总结:
1.安装配置Hadoop集群
这个可以在前面写的博客中看的到,https://blog.csdn.net/chunfenxiaotaohua/article/details/89280727
虽然刚开始是用centos,但是在Ubuntu中配置方式依然可以使用。
2.安装Eclipse IDE
这个安装只需要在官网下载https://www.eclipse.org/downloads/https://www.eclipse.org/downloads/
然后输入如下命令便可完成安装
cd download
mv eclispe-inst-linux64.tar.gz /usr/local
tar zxvf eclispe-inst-linux64.tar.gz
cd eclipse-installer
./eclipse-inst
然后就可以看到如下的界面:
然后点击下载就可以坐等安装完成。
3. 将Hadoop和Eclipse连接起来
想要将Hadoop和Eclipse连接起来,必不可少的一个东西就是:hadoop-eclipse-plugin-2.7.3.jar
链接:https://pan.baidu.com/s/1fSn0kOuS7Xgk65o_qyJv9Q
提取码:r3wa
这个虽然和版本相关,但是对于版本的区分不是很明显,网上现成的制作的经验比较多,但是懒就让我学会了收藏。
下载完插件之后就是关键的操作了:
(1.)制作Eclipse桌面的快捷方式;(本人实在是整不出来就放弃了,所以就只能每次从文件中启动)
(2.)将刚才下载的插件复制到两个文件夹中(/eclipse/dropins/)和(/eclipse/plugins)中
(3.)重启Eclipse。
(4.)打开Eclipse点击如下图的图标:
看到如下的界面就表示成功:
当你能看到这只小蓝象时恭喜你成功了(如果是没看到再重启一次,然后就会看到的)
4. 新建Eclipse项目
具体的操作过程如下: 点击File——>New——>Project
让后就按照提示完成就行了;
5. 完成Hadoop的经典代码(WorldCount)
在创建的项目里面新建一个class文件,然后就可以复制下面的代码:
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.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.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
public class WorldCount {
// 定义map
public static class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable>{
private String[] infos;
private Text oKey = new Text();
private IntWritable oValue = new IntWritable(1);
@Override
protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
throws IOException, InterruptedException {
//解析一行数据,转换成一个单词组成的数组
infos = value.toString().split("\\s");
for (String i : infos) {
// 把单词形成一个kv对发送给reducer(单词,1)
oKey.set(i);
context.write(oKey, oValue);
}
}
}
//定义reducer
public static class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
private int sum;
private IntWritable oValue = new IntWritable(0);
@Override
protected void reduce(Text key, Iterable<IntWritable> values,
Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
sum = 0;
for (IntWritable value : values) {
sum += value.get();
}
// 输出kv(单词,单词的计数)
oValue.set(sum);
context.write(key, oValue);
}
}
//组装一个job到mr引擎上执行
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException{
long startTime=System.currentTimeMillis();
// 构建一个configuration,用来配置hdfs 的位置,和mr的各项参数
Configuration configuration = new Configuration();
// 创建job对象
Job job = Job.getInstance(configuration);
job.setJarByClass(WorldCount.class);
job.setJobName("第一个mr作业:wordcount");
// 配置mr执行类
job.setMapperClass(WordCountMap.class);
//添加combinner,可以不写
// job.setCombinerClass(WordCountReducer.class);
job.setReducerClass(WordCountReducer.class);
// 设置输出kv类型(mapper和reduce输出类型一致时,可不写)
// job.setMapOutputKeyClass(Text.class);
// job.setMapOutputValueClass(IntWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置数据源(待处理)
Path inputPath = new Path("/usr/local/java/README.txt");
FileInputFormat.addInputPath(job, inputPath);
// 设置目标数据的存放位置
Path outputPath = new Path("/usr/local/java/output");
outputPath.getFileSystem(configuration).delete(outputPath, true);
FileOutputFormat.setOutputPath(job, outputPath);
// 启动作业,分布式计算提交给mr引擎
boolean result = job.waitForCompletion(true);
//如果job运行成功了,我们的程序就会正常退出
long timeUse=System.currentTimeMillis()-startTime;
System.out.println(timeUse);
System.exit(result?0:1);
}
}
先别急着运行,那是有原因的:
我们还没有创建我们的待处理文件:
cd /usr/local/java
gedit README.txt
输入以下的内容:
Hello World
Hello Hadoop
This is a test code
cd /usr/local/java
mkdir /output
基本完成准备工作,下面就是启动Hadoop集群,然后就运行
我们在/usr/local/java/output目录下会看到生成的文件
打开文件会看到:
完成了预定目标,但是本人预览了许多网上的经验,都感觉自己运行的特别容易,但是和自己的问题还有差距,所以就自己总结自己的经验,以便以后用的着。