在java中将写好的mapper,reducer,以及dirver打包放到集群上运行
在集群中运行可以将数据存放到hdfs中方便管理
提前配置——>编写好内容——>运行中一些报错的解决
使用的eclipse创建的maven项目中编写的mapper
package com.bob.mr; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; //map阶段 //KEYIN 输入数据的key //VALUEIN 输入数据的value //KEYOUT 输出数据的key类型 map输出的类型被划分成了key:value 键值对text //VALUEOUT 输出数据的value类型 //LongWritable 偏移量 long,表示该行在文件中的位置,而不是行号 //Text map阶段的输入数据 一行文本信息 字符串类型 String //Text map阶段的数据字符串类型 String //IntWritable map阶段输出的value类型,对应java中的int型,表示行号 public class wordcountmapper extends Mapper { //新建key对象获取需输出的key名 Text k=new Text(); //新建value对象设置输出值为1 IntWritable v=new IntWritable(1); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { //bob bob //获取一行的数据 将类型转换为string 原来为text String line =value.toString(); //数据之间有空格通过split切分为两个单词 String[] words=line.split(" "); //将数组中的数据循环写出 for(String word:words) { k.set(word); //context写入下一步 context.write(k, v); } } }
reducer
package com.bob.mr; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class wordcountreducer extends Reducer{ //创建IntWritable对象去获取int类型的sum结果 IntWritable v=new IntWritable(); @Override protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { //从mapper传入的数据为bob,1 bob,1 reduce对value进行一个累加和操作 int sum=0; for (IntWritable value:values) { //需要对传入值进行求和 sum为int,传入的为IntWritable sum+=value.get(); } //将结果设置转换为IntWritable类型 v.set(sum); //写出 context.write(key, v); } }
driver
package com.bob.mr;
import java.io.IOException;
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;
//驱动类
public class workcountdriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf=new Configuration();
//获取job对象
Job job=Job.getInstance(conf);
//设置jar存储位置
job.setJarByClass(workcountdriver.class);
//关联对应map和reduce类
job.setMapperClass(wordcountmapper.class);
job.setReducerClass(wordcountreducer.class);
//设置mapper阶段输出的数据的key和value值 固定格式
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//设置最终输出的key,value类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//设置输入路径和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
//提交job
//job.submit();
boolean result =job.waitForCompletion(true);
System.exit(result?0:1);
}
}
可以先在eclipse中运行一次
在driver中右击 – run as – run configurations --双击java Application就会出现对应的类名称 – 点击Arfuments 在Program arguments中填写输入输出路径空格隔开 --run
将容易报错有3点
1在Hadoop2以上版本,在Hadoop2的bin目录下没有winutils.exe
2找不到NativeIO.java以及需要复制到项目新建的org.apache.hadoop.io.nativeio项目中
3就是将编译过后的hadoop的/bin/目录下的hadoop.dll和winutils.exe文件复制到系统盘的C:WindowsSystem32目录下
解决完成运行后不报错后进行打包前的配置
为驱动程序文件路径demo.driver
就是包和文件名
在pom.xml下添加
maven-compiler-plugin 2.3.2 1.8 1.8 maven-assembly-plugin jar-with-dependencies 为驱动程序文件路径demo.driver make-assembly package single
完成后
如果工程上显示红叉。在项目上右键->maven->updateproject即可。
进行打包右击项目->Run As ->Maven Install
刷新
在target目录下出现两个jar包名字较长的是有hadoop依赖的jar包,较短则没有上传较短的集群自己有所以就不需要依赖
上传到集群节点上
在集群上运行jar包
hadoop jar wc .jar 包和文件名 输入路径 输出路径
hadoop jar wc.jar demo.driver /input/ /output
运行容易报错,结果出来了但是报错了这个是历史服务器没有配置好造成的报错
Diagnostics: Exception from container-launch. Container id: container_1645083854599_0005_02_000001 Exit code: 1
配置历史服务器
在hadoop-2.7.2/etc/hadoop/mapred-site.xml
添加
mapreduce.jobhistory.webapp.address centos73:10020 mapreduce.jobhistory.webapp.address centos73:19888
在hadoop-2.7.2/etc/hadoop/yarn-site.xml
添加
yarn.log-aggregation-enable true yarn.nodemanager.remote-app-log-dir /user/container/logs
启动historyserver
sbin/mr-jobhistory-daemon.sh start historyserver
修改权限
hadoop fs -chmod -R 777 /
我按照步骤完成后重新运行jar包就解决了,参考参考吧!



