java打包jar,(集群中)运行mr进行wordcount的过程以及报错,以及历史服务器安装

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包就解决了,参考参考吧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值