java打包jar,运行mr进行wordcount的过程以及报错
在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 键值对 <bob,1> text
//VALUEOUT 输出数据的value类型
//LongWritable 偏移量 long,表示该行在文件中的位置,而不是行号
//Text map阶段的输入数据 一行文本信息 字符串类型 String
//Text map阶段的数据字符串类型 String
//IntWritable map阶段输出的value类型,对应java中的int型,表示行号
public class wordcountmapper extends Mapper<LongWritable, Text, Text,IntWritable > {
//新建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<Text, IntWritable, Text, IntWritable> {
//创建IntWritable对象去获取int类型的sum结果
IntWritable v=new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> 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:\Windows\System32目录下
解决完成运行后不报错后进行打包前的配置
为驱动程序文件路径demo.driver
就是包和文件名
在pom.xml下添加
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>为驱动程序文件路径demo.driver</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
完成后
如果工程上显示红叉。在项目上右键->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
添加
<!--历史服务器地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>centos73:10020</value>
</property>
<!--历史服务器web端地址-->
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>centos73:19888</value>
</property>
在hadoop-2.7.2/etc/hadoop/yarn-site.xml
添加
<!-- 开启日志聚合 -->
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志聚合目录 container的-->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/user/container/logs</value>
</property>
启动historyserver
sbin/mr-jobhistory-daemon.sh start historyserver
修改权限
hadoop fs -chmod -R 777 /
我按照步骤完成后重新运行jar包就解决了,参考参考吧!