工具:
xshell,ubuntu虚拟机20.04,docker,IDEA2020.3
准备:
一、xshell能够链接上虚拟机
- 虚拟机使用桥接模式,并在终端配置静态ip
#注意ubuntu18.04后不是在/etc/networks/interfaces里配置
cd /etc/netplan
vim xxx.yaml
#配置静态ip
network:
version: 2
renderer: NetworkManager
ethernets:
ens33: #网卡名 , 冒号后要加空格,同下
dhcp4: no #是否动态配置ip
addresses: #[要设置的ip地址并要符合规则且不能重复/24] 注意要中括号 #/24是掩码255.255.255.0
gateway4: #网关的ip地址
nameservers:
addresses: [223.5.5.5,223.6.6.6] #DNS,用来解析外网的ip
#上面的内容都可以ifconfig查看,注意网段和宿主机要一致
#重启网络
sudo netplan apply
- 本来使用的是net模式,导致xshell链接不上虚拟机,改为桥接模式后解决。此处可以了解一下net模式、主机模式、桥接模式的区别。
- 使用这个配置后可能发现虚拟机ping不通主机了,是因为桥接模式下虚拟机相当于一个独立的主机了,ping我们的宿主机时,宿主机有防火墙阻止,所以会失败,如果想ping主机,就修改防火墙设置叭。
二、 本地IIDEA开发wordcount程序并打包
- 创建一个maven项目
- pom配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mapreduce_test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>ch.cern.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.7.2</version>
</dependency>
<dependency>
<groupId>ch.cern.hadoop</groupId>
<artifactId>hadoop-hdfs</artifactId>
<version>3.2.1</version>
</dependency>
</dependencies>
<build>
<plugins> #打包的插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>WordcountDriver</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- log4j.properties配置(日志输出)
#此文件放在resources下
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
- 写mapper
package src;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
public class WordcountMapper extends Mapper<LongWritable , Text, Text , IntWritable> {
Text k = new Text();
IntWritable v = new IntWritable(1);
@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){
k.set(word);
context.write(k,v);
}
}
}
- 写reducer
package src;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;
public class WordcountReducer extends Reducer<Text, IntWritable , Text , IntWritable> {
int sum ;
IntWritable v = new IntWritable();
@Override
protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
sum = 0;
for(IntWritable count : values){
sum+=count.get();
}
v.set(sum);
context.write(key,v);
}
}
- 写driver
package src;
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 WordcountDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration configuration = new Configuration();
Job instance = Job.getInstance();
instance.setJarByClass(WordcountDriver.class);
instance.setMapperClass(WordcountMapper.class);
instance.setReducerClass(WordcountReducer.class);
instance.setMapOutputKeyClass(Text.class);
instance.setMapOutputValueClass(IntWritable.class);
instance.setoutputKeyClass(Text.class);
instance.setMapOutputValueClass(IntWritable.class);
FileInputFormat.setInputPaths(instance,new Path(args[0]));
FileOutputFormat.setoutputPath(instance,new Path(args[1]));
boolean result = instance.waitForCompletion(true);
System.exit(result?0:1);
}
}
- 运行本地wordcount程序
首先配置参数,主要就是文件输入路径和输出路径,对应我们在driver文件中设置的path(args[0]) 和 path(args[1])。注意输出路径不能先存在。
- 打包
根据pom文件的打包插件,直接一键打包
打包完会生成一个jar包,准备上传服务器。
- xshell已经链接上了服务器,使用rz命令可以将本地文件上传至服务器。sz命令则是从服务器上下载文件。
- 在服务器端开启docker多个节点容器,将文件发送到master节点,用 : docker cp 本地文件路径 ID全称:容器路径 这条命令即可。(docker配置hadoop完全分布式可以看我上一篇文章)
- master开启hadoop服务
- 打包的jar包其实就和hadoop自带的wordcount例子是一样的
bin/hadoop jar wc.jar
src.WordcountDriver /user/hadoop/input /user/hadoop/output
#wc.jar是打包的jar包名
#src.WordcountDriver是driver类的全类名
运行成功
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。