大数据
初次使用eclipse编写hdfs集群计算心得
计算数据文件需要自写3大块:Mapper,Recucer,RunJob
Mapper:获取数据的对键值并对键值对类型规划,并得到输出的键值对
自定义的Mapper类继承Mapper<xx1,xx2,xx3,xx4>
xx1,xx2代表输入数据键值对的类型 xx3,xx4代表输出时键值对的类型
写调用并map方法,将数据放到数组中,循环数组,得到输出结果<k,v>
判断输入数据类型,基本数据类型不能做序列化处理,Text重写了String,IntWriteable重写了Long
以字母为例,输入的键值对在排序过程中不会改变,mapper最终输出的是<单词,单词出现次数>
Recucer:获取Mapper键值对的输出结果并聚合,输出自己想得到的数据格式
Mapper的输出是Reducer的输入,自定义的Reducer类继承reducer<xx1,xx2,xx3,xx4>,理论同上
写调用并reduce方法,将数据聚合(统计数据),得到输出结果<k,v>
int sum=0;
for(IntWritable i:iter){
sum+=i.get();
}
context.write(key, new IntWritable(sum));
Iterable iter --迭代器(假),因为需要直接传参给Reduce
RunJob:
趋近于格式化,参考代码如下
public class RunJob {
public static void main(String[] args) {
//加载配置文件
Configuration conf =new Configuration();
try {
Job job =Job.getInstance(conf);
FileSystem fs =FileSystem.get(conf);
//job(任务)名字
job.setJobName("wc");
//job入口类(有main方法的类)
job.setJarByClass(RunJob.class);
//job指定所调用的Mapper和Reducer类
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//job输出的Map键值对的类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置reduce的数量,默认为1
job.setNumReduceTasks(1);
//设置计算输入数据
FileInputFormat.addInputPath(job, new Path("/input/wc.txt"));
//设置计算输出目录(mapreduce计算完成之后,最后的结果存放的目录)
Path outpath =new Path("/output/wc/"); //该目录必须不能存在,如果存在计算框架会出错
if(fs.exists(outpath)){//如果存在该目录,则删除
fs.delete(outpath, true);
}
FileOutputFormat.setOutputPath(job, outpath);
//开始执行
boolean f =job.waitForCompletion(true);
if(f){
System.out.println("mapreduce程序执行成功");
}
} catch (Exception e) {
e.printStackTrace();
}