IDEA开发第一个Hadoop程序WordCount

1. 新建Java项目

2. 导入开发Hadoop所需的jar包

  1. 此处jar包比较多,可以专门整理下放在一个文件夹里。我放在了D:\source\hadoop\hadoop-lib目录下。
  2. 导入jar包过程参照博客idea导入jar

3. 编写程序

  1. 主类MyWC.java
package com.hpe.hadoop.mr.wc;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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;
/**
 * @author achu
 * @create 2020-09-01 10:19
 */
public class MyWC {

    public static void main(String[] args) throws Exception {
        // 1.读取配置文件
        Configuration conf = new Configuration(true);
        // 创建作业并设置名称
        Job job = Job.getInstance(conf);
        job.setJobName("myjob");
        // 2.设置作业的处理类
        job.setJarByClass(MyWC.class);
        // 3.设置作业的输入数据路径和输出结果路径
        // 输入路径
        Path input = new Path(args[0]);
        FileInputFormat.addInputPath(job,input);
        // 4. 判断输出路径是否存在,若存在则删除
        Path output = new Path(args[1]);
        // 根据输出目录获取分布式文件系统对象fs
        FileSystem fs = output.getFileSystem(conf);
        if(fs.exists(output)){
            fs.delete(output,true);
        }
        // 设置输出路径
        FileOutputFormat.setOutputPath(job,output);
        // 5.设置作业处理的Mapper类
        job.setMapperClass(MyMapper.class);
        // 6. 设置作业处理的Reduce类
        job.setReducerClass(MyReducer.class);
        // 7.设置Mapper输出key和value的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        // 8.提交作业
        job.waitForCompletion(true);
    }
}
  1. 逻辑实现类MyMapper.java
package com.hpe.hadoop.mr.wc;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
import java.util.StringTokenizer;
/**
 * @author achu
 * @create 2020-09-01 11:05
 */
public class MyMapper extends Mapper<Object, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    protected void map(Object key, Text value, Context context) throws IOException, InterruptedException {
        // StringTokenizerzi是一个接口,处理字符串,进行分割,最终形成一个迭代器
        StringTokenizer itr = new StringTokenizer(value.toString());
        while(itr.hasMoreTokens()){
            // 指定key
            word.set(itr.nextToken());
            // 通过上下文对象指定Map的输出key和value
            context.write(word,one);
        }
    }
}
  1. 逻辑实现类MyReducer.java
package com.hpe.hadoop.mr.wc;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
/**
 * @author achu
 * @create 2020-09-02 8:29
 * Map输出:
 *  <hello,1>
 *  <world,1>
 *  <world,1>
 * Reduce输入:
 *  <hello,list(1)>
 *  <world,list(1,1)>
 * Reduce输出
 *  <hello,1>
 *  <world,2>
 */
public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

    // 输出的value
    private IntWritable result = new IntWritable();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
        // 存放每个key对应的的单词总数
        int sum = 0;
        // 遍历value集合
        for (IntWritable value : values) {
            // 将Hadoop类型转化为Java类型,再累加
            sum += value.get();
        }
        // 将java类型转化为hadoop类型
        result.set(sum);
        // 通过上下文对象输出key和value
        context.write(key,result);
    }
}

4. 将所编写的程序打成jar包

  1. 打jar包的过程参照博客idea打jar包

5. 将jar包上传到集群上

  1. 使用WinSCP工具上传jar包

6. 安装zip命令,删除jar包中一个文件

  1. 安装命令
    安装命令zip: yum install zip #提示输入时,请输入y;
    安装命令unzip:yum install unzip #提示输入时,请输入y;
  2. 删除jar包中一文件
zip -d hadoop.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF

7. 执行jar

  1. 命令:hadoop jar 具体Jar名称 主类全类名 输入参数文件(或文件夹) 输出路径文件夹
hadoop jar hadoop.jar com.hpe.hadoop.mr.wc.MyWC /user/root/hello.txt /output1

补充

  1. 访问分布式文件系统web网址:http://192.168.228.11:50070
  2. 访问resourcemanager网址:http://192.168.228.13:8088/cluster
  3. 基础程序,测试该程序之前需要下载配置文件core-site.xml,hdfs-site.xml
package com.hpe.hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.*;

/**
 * @author achu
 * @create 2020-08-25 21:13
 */
public class TestHDFS {

    Configuration conf = null;
    FileSystem fs = null;
    // 打开
    @Before
    public void conn() throws Exception {
        // 读取配置文件(true:默认读取)
        conf = new Configuration(true);
        fs = FileSystem.get(conf);
    }

    // 创建目录
    @Test
    public void mkdir() throws Exception {
        Path path = new Path("/tempDir");
        // 如果目录存在则删除,若不存在则创建
        if(fs.exists(path)){
            // 删除
            fs.delete(path,true);
        }
        // 创建
        boolean mkdirs = fs.mkdirs(path);
    }
    // 上传文件
    @Test
    public void uploadFile() throws Exception {
        // 准备输入流
        InputStream is = new BufferedInputStream(new FileInputStream(new File("D:\\test.txt")));
        // 准备输出流,得到输出流对象
        Path path = new Path("/tempDir/test1.txt");
        FSDataOutputStream fsDataOutputStream = fs.create(path);
        // 写入文件
        IOUtils.copyBytes(is,fsDataOutputStream,conf,true);
    }

    // 下载文件
    public void downloadFile(){

    }

    // 关闭
    @After
    public void close() throws Exception {
        fs.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值