微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

本地IDEA打包wordcount jar包上传至服务器并使用docker完全分布式运行

工具:

xshell,ubuntu虚拟机20.04,docker,IDEA2020.3

准备:

一、xshell能够链接上虚拟机

  1. 虚拟机使用桥接模式,并在终端配置静态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
  1. 本来使用的是net模式,导致xshell链接不上虚拟机,改为桥接模式后解决。此处可以了解一下net模式、主机模式、桥接模式的区别。
  2. 使用这个配置后可能发现虚拟机ping不通主机了,是因为桥接模式下虚拟机相当于一个独立的主机了,ping我们的宿主机时,宿主机有防火墙阻止,所以会失败,如果想ping主机,就修改防火墙设置叭。

二、 本地IIDEA开发wordcount程序并打包

  1. 创建一个maven项目
  2. 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>


  1. 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

  1. 写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);
        }
    }
}

  1. 写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);
    }
}

  1. 写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);

    }
}

  1. 运行本地wordcount程序
    首先配置参数,主要就是文件输入路径和输出路径,对应我们在driver文件中设置的path(args[0]) 和 path(args[1])。注意输出路径不能先存在。

    在这里插入图片描述

    在这里插入图片描述

  2. 打包
    根据pom文件的打包插件,直接一键打包

    在这里插入图片描述

    打包完会生成一个jar包,准备上传服务器。

三、jar包上传服务器并在docker进行完全分布式运行

  1. xshell已经链接上了服务器,使用rz命令可以将本地文件上传至服务器。sz命令则是从服务器上下载文件
  2. 在服务器端开启docker多个节点容器,将文件发送到master节点,用 : docker cp 本地文件路径 ID全称:容器路径 这条命令即可。(docker配置hadoop完全分布式可以看我上一篇文章
  3. master开启hadoop服务
  4. 打包的jar包其实就和hadoop自带的wordcount例子是一样的
bin/hadoop jar  wc.jar
src.WordcountDriver /user/hadoop/input /user/hadoop/output
#wc.jar是打包的jar包名
#src.WordcountDriver是driver类的全类名

运行成功

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐