MapReduce入门实例——WordCount

摘要:MapReduce的IDEA配置及WordCount案例

Maven项目配置

创建一个空的Maven项目

打开根目录下的 pom.xml文件,参考配置:


    UTF-8
    3.2.2

        junit
        junit
        4.10
        test

        org.apache.hadoop
        hadoop-client
        ${hadoop.version}

        org.apache.hadoop
        hadoop-common
        ${hadoop.version}

        org.apache.hadoop
        hadoop-hdfs
        ${hadoop.version}

在项目的 src/main/java/resources下新建 log4j.properties,参考配置

参考配置1
log4j.rootLogger = info,console

log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = %d{ABSOLUTE} %5p %c:%L - %m%n

glibc lib version diff
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
参考配置2
log4j.rootLogger = debug,stdout

### 输出信息到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

编写应用程序


/**
 * 导入包
 */

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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import java.io.IOException;

/**
 * WordCount应用程序
 */
public class WordCountApp {

    /**
     * Mapper
     */
    public static class MyMapper extends Mapper {
        LongWritable one = new LongWritable(1);
        @Override
        public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            // 接收到的每一行数据
            String line = value.toString();
            // 按照指定分隔符进行拆分
            String[] words = line.split(" ");
            for(String word: words){
                // 通过上下文把map的处理结果输出
                context.write(new Text(word), one);
            }
        }
    }

    /**
     * Reduce归并
     */
    public static class MyReducer extends Reducer{
        @Override
        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException{
            long sum = 0;
            for(LongWritable value: values){
                // 求key出现的次数
                sum += value.get();
            }
            // 最终统计结果输出
            context.write(key, new LongWritable(sum));
        }
    }

    /**
     * 定义Driver:封装了MapReduce作业的所有信息
     */
    public static void main(String[] args) throws Exception{
        // windows版本设置HADOOP_HOME环境变量后,若不重启电脑,需要填加该语句
        //System.setProperty("hadoop.home.dir", "C:/Development/hadoop");
        System.setProperty("hadoop.home.dir", "/usr/local/hadoop");
        // 设置操作用户,默认root
        System.setProperty("HADOOP_USER_NAME", "root");
        //创建Configuration
        Configuration configuration = new Configuration();
        // 设置fs.defaultFS参数,默认本地读取
        configuration.set("fs.defaultFS", "hdfs://master:9000");
        // 若参数数量不为2,报错退出,第一个参数读取是输入目录(HDFS),第二个参数是输出目录
        if (args.length != 2) {
            System.err.println("Usage: MyDriver  ");
            System.exit(2);
        }
        // 如果输出目录存在,则删除
        Path mypath = new Path(args[1]);
        FileSystem hdfs = mypath.getFileSystem(configuration);
        if (hdfs.isDirectory(mypath)) {
            hdfs.delete(mypath, true);
        }
        //创建Job
        Job job = Job.getInstance(configuration, "wordcount");
        //设置job的处理类
        job.setJarByClass(WordCountApp.class);
        //设置作业处理的输入路径
        FileInputFormat.setInputPaths(job, new Path(args[0]));
        //设置map相关参数
        job.setMapperClass(MyMapper.class);
        //设置Map阶段的输出类型: k2 和V2的类型
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(LongWritable.class);
        //分区,排序,规约,分组步骤采用默认方式
        //设置reduce相关参数
        job.setReducerClass(MyReducer.class);
        //设置Reduce阶段的输出类型
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(LongWritable.class);
        //设置作业处理的输出路径
        FileOutputFormat.setOutputPath(job, new Path(args[1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

IDEA配置

编辑运行环境

使用远程环境,设置ssh连接,添加input和output目录

Debug

Original: https://www.cnblogs.com/dominickk/p/16361606.html
Author: DominicKK
Title: MapReduce入门实例——WordCount

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585428/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • VR一体机如何退出FFBM

    Fast Factory Boot Mode(FFBM)是一种半开机的模式,它的主要目的是方便工厂测试,提高生产效率。正常情况下终端用户是不会碰到的。但售后的同学最近连续收到几台客…

    Linux 2023年6月7日
    0239
  • sublime 3同步编辑线上代码

    1.打开编辑器输入框(Ctrl+Shift+P),并执行 2.回车后输入sftp 3.回车,安装,等待 4.右键项目 5.修改配置信息,保存 Original: https://w…

    Linux 2023年6月7日
    089
  • 经典45个git使用技巧与场合,专治不会合代码。

    前言 git对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和…

    Linux 2023年6月13日
    0128
  • 七、软件包管理

    Linux软件管理分类: 1、rpm包管理 —– yum工具2、源码包管理RedhatCentosDebianUbuntu包名.rpm如何获取rpm包?互联…

    Linux 2023年6月7日
    0100
  • Nginx/Tengine安装配置详解

    1 概念 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。官方测试…

    Linux 2023年6月14日
    093
  • uniapp封装request请求,常用公共函数等,非常实用

    1、项目目录如下图,utils目录下的文件和main.js文件在下面可以直接下载使用 2、demo案例,前端代码 php;gutter:true; export default {…

    Linux 2023年6月7日
    0105
  • linux 普通分区与lvm分区

    安装linux系统时 有时候会提示lvm分区与标准分区 首先普及一下lvm分区:lvm是 logical volume manager (逻辑卷管理),linux环境下对磁盘分区的…

    Linux 2023年6月14日
    097
  • Ajax

    前戏 概念 异步提交,局部刷新 最大的优点是在页面不刷新的情况下可以与后端进行数据交互 用户注册无需点击按钮内部也可完成数据交互 同步交互:客户端发出一个请求后,需要等待服务器响应…

    Linux 2023年6月7日
    082
  • linux bash 手册

    1、Linux shell简介 shell是一种特殊的交互式工具,包含了一组内部命令,这些命令可以完成复制文件,移动文件,显示和终止程序等操作。shell的核心是命令行提示符,它允…

    Linux 2023年6月7日
    087
  • 转:多线程环境下调用 HttpWebRequest 并发连接限制

    .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 windows xp , windows 7 下默认…

    Linux 2023年6月13日
    0108
  • 学习一下 SpringCloud (五)– 配置中心 Config、消息总线 Bus、链路追踪 Sleuth、配置中心 Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)– 从单体架构到微服务架构、代码拆分(maven 聚合): https://www.cnblogs.com/l-y…

    Linux 2023年6月14日
    0123
  • redis的GEO实战 (RedisTemplate)

    geoadd 时间复杂度为O(log(N)) geoadd cityGeo 116.405285 39.904989 “北京”geoadd cityGeo …

    Linux 2023年5月28日
    097
  • centos8 安装kudu

    1、安装cmake yum install cmake -y 2、安装python yum install python39 -y 设置默认Python版本 alternative…

    Linux 2023年6月8日
    067
  • Mysql 安全加固经验总结

    本文为博主原创,转载请注明出处: 1.内网部署Mysql mysql 数据库在使用过程中,需要给服务提供连接和访问的权限,而不需要进行公网连接和访问,所以在安全环境和现网环境部署m…

    Linux 2023年6月14日
    097
  • 优化gcc

    优化gcc 目的是改善程序的执行性能,通过编译选项(On)来控制优化代码生成,(n)是一个代表优化级别的整数, 典型的有(0, 1, 2, 3) 其中(-O)等价于(-O_1), …

    Linux 2023年6月7日
    0115
  • Django补充

    django配置文件相关操作 django实际上有两个配置文件 一个是提供给用户可以自定义的基本配置 from 项目名 import settings 一个是全局的系统默认的配置 …

    Linux 2023年6月7日
    0106
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球