从日志文件进行单词计数:

首先,使用JAVA IDEA软件新建项目CountByData,并利用该软件编译并自动生成jar包:

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce

在idea中执行mapreduce idea搭建mapreduce_mapreduce_02

在idea中执行mapreduce idea搭建mapreduce_mapreduce_03

然后在项目中添加如下代码段:

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_04

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>3.1.4</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>3.1.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-examples -->
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-examples</artifactId>
        <version>3.1.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

在idea中执行mapreduce idea搭建mapreduce_mapreduce_05

  

在idea中执行mapreduce idea搭建mapreduce_hadoop_06

确定项目下有src\main\java文件如图:

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_07

如果没有选择file---new---directory新建:

在idea中执行mapreduce idea搭建mapreduce_intellij idea_08

确保有了java之后在src\main\java下新建包demo:

在idea中执行mapreduce idea搭建mapreduce_mapreduce_09

在idea中执行mapreduce idea搭建mapreduce_hadoop_10

在idea中执行mapreduce idea搭建mapreduce_mapreduce_11

然后在demo下新建class类:

在idea中执行mapreduce idea搭建mapreduce_大数据_12

 

在idea中执行mapreduce idea搭建mapreduce_hadoop_13

在idea中执行mapreduce idea搭建mapreduce_intellij idea_14

然后向class文件中加入代码:

在idea中执行mapreduce idea搭建mapreduce_intellij idea_15

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

import java.io.IOException;
import java.util.StringTokenizer;

public class CountByDate {
    public static class SplitMapper
            extends Mapper<Object, Text, Text, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
//value email | date
        public void map(Object key, Text value, Context context
        ) throws IOException, InterruptedException {
            String data[] = value.toString().split("\\|", -1);
            word.set(data[1]);
            context.write(word, one);
            }
        }
    public static class IntSumReducer
            extends Reducer<Text,IntWritable,Text,IntWritable> {
        private IntWritable result = new IntWritable();

        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context
        ) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            result.set(sum);
            context.write(key, result);
        }
    }

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if (otherArgs.length < 2) {
            System.err.println("Usage: wordcount <in> [<in>...] <out>");
            System.exit(2);
        }
        Job job = Job.getInstance(conf, "word count");
        job.setJarByClass(CountByDate.class);
        job.setMapperClass(SplitMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        for (int i = 0; i < otherArgs.length - 1; ++i) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        FileOutputFormat.setOutputPath(job,
                new Path(otherArgs[otherArgs.length - 1]));
        System.exit(job.waitForCompletion(true) ? 0 : 1);
    }
}

 结果如图:

在idea中执行mapreduce idea搭建mapreduce_intellij idea_16

 

在idea中执行mapreduce idea搭建mapreduce_intellij idea_17

在idea中执行mapreduce idea搭建mapreduce_intellij idea_18

在idea中执行mapreduce idea搭建mapreduce_大数据_19

然后点击ok即可。

在idea中执行mapreduce idea搭建mapreduce_intellij idea_20

 会有一个小的弹窗出来,点击built即可:

在idea中执行mapreduce idea搭建mapreduce_hadoop_21

 然后下方的输出台会有变化,并且出现了out的文件夹,自动生成了jar包:

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_22

然后使用xftp将jar包以及所需的txt文件传输到虚拟机中:

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_23

在idea中执行mapreduce idea搭建mapreduce_hadoop_24

 这个txt文件我放到百度网盘中:

链接:https://pan.baidu.com/s/1S7de2iWSJPZh-_4k3HxZSA 
提取码:ccjy

这两个文件我是想要传输到root/wc00中的,由于开始传输的位置不对,我把它挪了一下,挪到了wc00中:

在idea中执行mapreduce idea搭建mapreduce_大数据_25

 然后在xshell中进行操作:

先打开Hadoop集群:

cd /opt/hadoop-3.1.4/sbin
./start-dfs.sh
./start-yarn.sh
./mr-jobhistory-daemon.sh start historyserver
jps

然后要先cd进入根目录再进入wc00目录中,然后ls查看刚才上传的文件:

在idea中执行mapreduce idea搭建mapreduce_mapreduce_26

再打开50070的页面,发现没有刚才我们上传的文件,所以接下来就需要将文件上传到Hadoop分布式文件系统中,并编译文件:

hdfs dfs -put email_log_with_date.txt /input
yarn jar CountByDate.jar demo.CountByDate /input /resultsYarn

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_27

然后可以在50070的页面中看到新增的三个文件夹以及运行的结果:

在idea中执行mapreduce idea搭建mapreduce_大数据_28

在idea中执行mapreduce idea搭建mapreduce_mapreduce_29

 

在idea中执行mapreduce idea搭建mapreduce_intellij idea_30

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_31

 现在我们需要从日志文件中按日期统计email的数量,我们在写Mapreduce的时候可以参考他的一些官方文档,我们可以从MVN仓库中搜索Mapreduce-example的一些东西,网站地址为:

https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-mapreduce-examples/3.1.4

下面的查找不用实现: 

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_32

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_33

在idea中执行mapreduce idea搭建mapreduce_intellij idea_34

复制依赖,添加到pom.xml文件中:

在idea中执行mapreduce idea搭建mapreduce_mapreduce_35

 如图,有mapreduce-examples的依赖出现,但其实我最开始复制的源代码过来时是有这个依赖的,所以不用进行查找粘贴依赖这一步: 

在idea中执行mapreduce idea搭建mapreduce_hadoop_36

 然后在xshell中配置时间同步服务:

(1)先使用命令安装ntp,再进入ntp文件中进行配置:

yum -y install ntp
vi /etc/ntp.conf

在idea中执行mapreduce idea搭建mapreduce_mapreduce_37

 

在idea中执行mapreduce idea搭建mapreduce_hadoop_38

(2)对主节点master进行配置的命令,在输入下面的命令之前要先将4个server注释掉:

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10

修改过后的主节点master中的结果如图:

在idea中执行mapreduce idea搭建mapreduce_mapreduce_39

在idea中执行mapreduce idea搭建mapreduce_大数据_40

 (3)对3个克隆机node1、2、3也要进行相同的操作,依旧要先安装ntp然后进入ntp文件进行配置。配置命令与主机略有不同,但依旧要注释掉前面的4个server:

restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap
server 127.127.1.0
fudge 127.127.1.0 stratum 10

server master

在idea中执行mapreduce idea搭建mapreduce_在idea中执行mapreduce_41

 (4)因为之前关闭掉了主机和3个克隆机的防火墙,所以这里就不需要再次关闭防火墙了,只需要查看一下防火墙的状态就好,也是主机master和3个克隆机node1、2、3都要查看:

systemctl status firewalld.service

在idea中执行mapreduce idea搭建mapreduce_大数据_42

(5)最后就是启动ntp服务:

在主机master上执行代码:

service ntpd start & chkconfig ntpd on

在3个克隆机node1、2、3执行代码,其中第一句是同步时间,第二句是启动并永久启动ntp服务:

ntpdate master
service ntpd start & chkconfig ntpd on

在idea中执行mapreduce idea搭建mapreduce_大数据_43