Hadoop3.1 WordCount源代码远程执行(Windows + IDEA) 包含winutils.exe和hadoop.dll下载地址

2 篇文章 0 订阅
2 篇文章 0 订阅

一、配置Windows环境

部署hadoop请参考另外一篇文章Hadoop3.1伪分布式环境搭建(包含示例测试和详细错误解决方式)

  1. 把部署在Linux下的Hadoop安装包解压(解压缩工具要以管理员身份运行)。并配置环境变量

    例如解压到E:\software\hadoop-3.1.2

    配置环境变量

    HADOOP_HOME=E:\software\hadoop-3.1.2
    PATH新增 %HADOOP_HOME%\bin
    
  2. 将下载的对应版本的hadoop.dll和winutils.exe 复制到 %HADOOP_HOME%\bin\ 下。下载地址

  3. 在hosts文件下添加部署Hadoop所在服务器的主机名和IP的映射关系

    C:\Windows\System32\drivers\etc\hosts

    例如:

    192.9.6.25 hadoop

二、新建IDEA maven项目

在这里插入图片描述
在这里插入图片描述

三、编写代码

  1. 修改pom.xml文件,添加hadoop依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>hadoop-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <properties>
            <hadoop.version>3.2.0</hadoop.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-hdfs</artifactId>
                <version>${hadoop.version}</version>
            </dependency>
        </dependencies>
    </project>
    
  2. 新建包并编写三个类如下:

    
    import org.apache.hadoop.conf.Configuration;
    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 
     * @date 2020/8/19 19:38
     */
    public class WordCount {
        public static void main(String[] args) throws Exception {
            //为任务设定配置文件
            Configuration conf = new Configuration();
            // 定义一个job
            Job job = Job.getInstance(conf, "word count");
            //设置执行任务的jar
            job.setJarByClass(WordCount.class);
            //设置Mapper类
            job.setMapperClass(WordCountMapper.class);
            //设置Combine类
            job.setCombinerClass(WordCountReducer.class);
            //设置Reducer类
            job.setReducerClass(WordCountReducer.class);
            //设置job输出的key
            job.setOutputKeyClass(Text.class);
            //设置job输出的value
            job.setOutputValueClass(IntWritable.class);
            //设置输入文件的路径
            FileInputFormat.addInputPath(job, new Path(args[0]));
            //设置输出文件的路径
            FileOutputFormat.setOutputPath(job, new Path(args[1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    
    
    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;
    
    /**
     * 定义Map类实现字符串分解
     * @author
     * @date 2020/8/19 20:01
     */
    public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
    
        @Override
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
            //将字符串拆解成单词
            StringTokenizer itr = new StringTokenizer(value.toString());
            while (itr.hasMoreTokens()) {
                //将分解后的一个单词写入word类
                word.set(itr.nextToken());
                //收集<key, value>
                context.write(word, one);
            }
        }
    }
    
    
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    /**
     *  定义Reduce类规约同一key的value
     * @author
     * @date 2020/8/19 20:01
     */
    public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
        private IntWritable result = new IntWritable();
    
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;
            //遍历迭代values,得到同一key的所有value
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            //产生输出对<key, value>
            context.write(key, result);
        }
    }
    
    
  3. 把Linux部署的HADOOP_HOME/etc/hadoop/ 下的core-site.xml和log4j.properties 复制到项目的resources下

    全家福
    在这里插入图片描述

  4. 配置启动

    1) 准备好需要统计的文件并放到hdfs下,本例使用的时/input/hello.txt内容如下:
    在这里插入图片描述
    2) 配置启动类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

​ 这里要注意的是Program arguments,这里传入的远程hdfs上的输入文件和输出路径,hadoop是主机名。如果没有配置hosts,这里可以用IP。输出路径要保证在hdfs中不存在。

  1. 启动

    每次解决完错误一定要先clean一下项目,避免出现不必要的问题。

    启动时可能会报两个错误如下:

    错误1: 没有权限

在这里插入图片描述

解决方式: 关闭hdfs权限检查,在HADOOP_HOME/etc/hadoop/hdfs-site.xml新增属性。然后重启。

<property>
  <name>dfs.permissions.enabled</name>
  <value>false</value>
</property>

错误2
在这里插入图片描述
解决方式: 关闭namenode的安全状态 ,linux执行hadoop dfsadmin -safemode leave

执行成功会输出日志,部分日志如截图:
在这里插入图片描述

  1. 查看结果

    执行结果会输出到配置启动类时传入的参数对应的文件夹中,在hdfs上可查看输出结果
    在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值