一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java)

使用IDEA编写第一个MapReduce程序(Java)

上两篇文章已经搭建好了hadoop为伪分布式集群,这节我们是编写第一个MapReduce程序(单词字母检查)
1.安装Idea
2.创建maven程序
3.编写程序,导入hadoop jar包
4.打包使用shell命令运行

1.安装Idea
下载安装即可:Idea官网
2.创建maven程序
安装好maven之后(配置环境变量),即可创建maven程序了
在这里插入图片描述

在这里插入图片描述
创建完成,然后添加依赖jar包,和Eclipse一样,要给项目添加相关依赖包,否则会出错。
点击Idea的File菜单,然后点击“Project Structure”菜单,如下图所示:
在这里插入图片描述
导入jar包:
选择hadoop的包,我用得是hadoop3.*。把下面的依赖包都加入到工程中,否则会出现某个类找不到的错误。

(1)”/usr/local/hadoop/share/hadoop/common”目录下的hadoop-common-2.6.1.jar和haoop-nfs-2.6.1.jar;

(2)/usr/local/hadoop/share/hadoop/common/lib”目录下的所有JAR包;

(3)“/usr/local/hadoop/share/hadoop/hdfs”目录下的haoop-hdfs-2.6.1.jar和haoop-hdfs-nfs-2.7.1.jar;

(4)“/usr/local/hadoop/share/hadoop/hdfs/lib”目录下的所有JAR包。

3.编写程序,打包运行

Mapper类:

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;


public class WordcountMap extends Mapper<LongWritable,Text,Text,IntWritable> {
        public void map(LongWritable key,Text value,Context context)throws IOException,InterruptedException{

        String line = value.toString();//读取一行数据

        String str[] = line.split("");//因为英文字母是以“ ”为间隔的,因此使用“ ”分隔符将一行数据切成多个单词并存在数组中

        for(String s :str){//循环迭代字符串,将一个单词变成<key,value>形式,及<"hello",1>
            context.write(new Text(s),new IntWritable(1));
        }
    }
}

Reduce类:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.io.Text;
import java.io.IOException;

public class WordcountReduce extends Reducer<Text,IntWritable,Text,IntWritable> {
        public void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException,InterruptedException{
        int count = 0;
        for(IntWritable value: values) {
            count++;
        }
        context.write(key,new IntWritable(count));
        }
}

入口类:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;

public class WordCount {

    public static void main(String[] args)throws Exception{
        Configuration conf = new Configuration();
        //获取运行时输入的参数,一般是通过shell脚本文件传进来。
        String [] otherArgs = new         GenericOptionsParser(conf,args).getRemainingArgs();
        if(otherArgs.length < 2){
            System.err.println("必须输入读取文件路径和输出路径");
            System.exit(2);
        }
        Job job = new Job();
        job.setJarByClass(WordCount.class);
        job.setJobName("wordcount app");
    
        //设置读取文件的路径,都是从HDFS中读取。读取文件路径从脚本文件中传进来
        FileInputFormat.addInputPath(job,new Path(args[0]));
        //设置mapreduce程序的输出路径,MapReduce的结果都是输入到文件中
        FileOutputFormat.setOutputPath(job,new Path(args[1]));

         //设置实现了map函数的类
        job.setMapperClass(WordcountMap.class);
        //设置实现了reduce函数的类
        job.setReducerClass(WordcountReduce.class);

         //设置reduce函数的key值
        job.setOutputKeyClass(Text.class);
        //设置reduce函数的value值
        job.setOutputValueClass(IntWritable.class);
        System.exit(job.waitForCompletion(true) ? 0 :1);
    }
}

代码写好之后,开始jar包,按照下图打包。点击“File”,然后点击“Project Structure”,弹出如下的界面。
在这里插入图片描述
依次点击"Artifacts" -> “+” -> “JAR” -> “From modules with dependencies”,然后弹出一个选择入口类的界面,选择刚刚写好的WordCount类,如下图(我这里没有用wordCount类):
在这里插入图片描述
点击“Build”之后就会生成一个jar包。jar的位置看下图,依次点击File->Project Structure->Artifacts就会看到如下的界面:
在这里插入图片描述
4.打包使用shell命令运行

然后将jar包放入hadoop主机,使用下图命令即可运行jar包(第一个是hadoop关键字,第二个jar一样,第三个是jar包名称,如果jar包有main方法入口则不需要制定方法名,如果没有则需要制定类名和方法名,第四个是args数组参数)
下图我是用另外的hadoop运行jar包的命令测试,格式一样,大家修改就行。
在这里插入图片描述
最后是将生成的hdfs文件系统输出文件导入到本地文件系统(-get 参数是将hdfs文件复制到本地文件系统,从本地复制到hdfs是 -CopyFromLocal)
输出文件 :hadoop fs -get /output/sampleout/part-r-00000 /home/test1/
这样我们就可以在/home/test文件夹下看到输出文件了。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值