本文相关idea的代码出自:https://blog.csdn.net/weixin_38468167/article/details/108658531
实验内容:开发MapReduce算法,实现统计分析
具体操作流程:
第一步:给windows准备好JDK环境并配置系统环境变量,系统环境变量需要设置三个地方:CLASSPATH,JAVA_HOME(jdk路径)和PATH如图.
第二步,安装IDEA2019.3.3版本,并破解(这里只需将IDEA打开,并且把idea破解包(自行下载)拖至IDEA界面即可)
安装过程过于简单就不详细介绍了
第三步,给IDEA创建新项目,选择JDK版本(注意jdk版本必须与本机一致否则后面写代码会出错),如图:
第四步,编写函数
(1)MyMainClass(main函数,驱动函数)
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;
import java.io.IOException;
public class MyMainClass {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf = new Configuration();
Job wordCountJob = Job.getInstance(conf);
//指定本job所在的jar包
wordCountJob.setJarByClass(MyMainClass.class);
//设置wordCountJob所用的mapper逻辑类为哪个类
wordCountJob.setMapperClass(MyMapClass.class);
//设置wordCountJob所用的reducer逻辑类为哪个类
wordCountJob.setReducerClass(MyReduceClass.class);
//设置map阶段输出的kv数据类型
wordCountJob.setMapOutputKeyClass(Text.class);
wordCountJob.setMapOutputValueClass(IntWritable.class);
//设置最终输出的kv数据类型
wordCountJob.setOutputKeyClass(Text.class);
wordCountJob.setOutputValueClass(IntWritable.class);
//设置要处理的文本数据所存放的路径
FileInputFormat.setInputPaths(wordCountJob, "hdfs://192.168.1.24:9000/mapreduce/input/mydata1");
FileOutputFormat.setOutputPath(wordCountJob, new Path("hdfs://192.168.1.24:9000/mapreduce/output/"));
//提交job给hadoop集群
wordCountJob.waitForCompletion(true);
}
}
注意文件输入(FileInputFormat)那里,必须和自己在hdfs下mapreduce里所创建的文件路径一致,输出同理。
创建输入文件命令:
Hdfs dfs -mkdir -p /mapreduce/input(-p表示逐级创建)
创建输出文件命令:
Hdfs dfs -mkdir -p /mapreduce/output
(2)MyMapClass(分割,map节点)
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class MyMapClass extends Mapper {
@Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String line=value.toString();
String[] words=line.split(",");
for (String word:words){
context.write(new Text(word),new IntWritable(1));
}
}
}
(3)MyReduceClass(reduce节点)
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class MyReduceClass extends Reducer {
@Override
protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
int total=0;
//遍历value,求和
for (IntWritable value:values){
total+=value.get();
}
context.write(key,new IntWritable(total));
}
}
(4)MyPartitionerClass(分页)
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;
import org.w3c.dom.Text;
public class MyPartitioner extends Partitioner {
@Override
public int getPartition(Text text, IntWritable intWritable, int i) {
return Math.abs(text.hashCode())%i;
}
}
第五步,新建一份需要统计的文本命名为mydata1,命名随意,里面的内容也随意,示例如图:
上传到input文件:命令 hdfs dfs -put mydata1 /mapreduce/input(只能云端查看文件)
第六步,把函数打包成jar包(IDEA上的简单操作,如下图)
以上步骤完成就会在本地文件生成jar包,如下图:
第七步,将生成的jar包上传到hadoop(这里我用PowerShell远程传输到hadoop),命令:scp java.hadoop.jar [email protected]:/home/Flume(Flume为自己的用户,“:”后面是自己上传的虚拟机的路径)
第八步,启动生成的jar包程序
这里遇到一些问题,就是直接启动会报错,后来通过查询知道jar包上传时自动生成了一些文件,必须删掉,命令:zip -d java.hadoop.jar META-INF/*.RSA META-INF/*.DSA META-INF/*.SF,如下图:
然后启动jar包:
输出结果:命令:hdfs dfs -cat /mapreduce/output
端口查看: