• Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)


    使用IDEA直接运行Hadoop项目,有两种方式,分别是本地式:本地安装Hadoop+IDEA;远程式:远程部署Hadoop,本地安装IDEA并连接, 本文介绍第二种。

    一、安装配置Hadoop

    (1)虚拟机伪分布式

    上才艺!CentOS7从0到1部署Apache Hadoop生态集群

    (2)云服务器分布式

    如果是云主机,需要注意hosts映射问题和安全组开放问题,见阿里云腾讯云等云服务器搭建hadoop集群服务器,内外网hosts配置文件问题

    二、配置IDEA

    1、安装配置Maven

    IDEA自带了Maven,为了更方便和更好的管理,推荐自己安装Maven

    Maven是什么?
    Maven 是专门用于构建和管理Java相关项目的工具

    使用Maven管理项目的3个好处:
    1、使用Maven管理的Java 项目都有着相同的项目结构。 有一个pom.xml 用于维护当前项目都用了哪些jar包。所有的java代码都放在 src/main/java 下面; 所有的测试代码都放在src/test/java 下面 。
    2、便于统一维护jar包。把所有的jar包都放在了本地"仓库“ 里,然后哪个项目需要用到这个jar包,只需要给出jar包的名称和版本号就行了,这样就实现了jar包共享,避免每一个项目都有自己的jar包带来的麻烦。
    3、帮助开发人员将精力倾注在开发而不是在包的管理当中,开发人员无需关注包的冲突问题和管理问题。

    1. 下载解压(注意Maven版本需要和IDEA匹配,否则可能会报错)
      下载地址:apache-maven-3.6.3-bin.zip百度网盘链接
      提取码:hgdh
      我的IDEA是201903,运行实测无障碍。如果IDEA版本低,可以百度升级方法
    2. 配置环境变量
      (1)先解压到自己的目录当中(随意)
      配置环境变量
      (2)打开电脑环境变量,新建MAVEN_HOME为自己的解压目录,紧接着添加/bib目录到Path_
      查看版本
      (3)完成后使用mvn -v查看版本,如果出现如图则环境变量配置完成
    3. 配置仓库
      进入解压目录,备份修改setting.xml
    
    <localRepository>D:/server/maven/repositorylocalRepository>
    
    • 1
    • 2
    1. 配置镜像地址
      国内镜像速度更快,推荐修改
    <mirrors>
    	<mirror>
    		<id>alimavenid>
    		<mirrorOf>centralmirrorOf>
    		<name>aliyun mavenname>
    		<url>http://maven.aliyun.com/nexus/content/repositories/central/url>
    	mirror>
    
    	<mirror>
    		<id>alimavenid>
    		<name>aliyun mavenname>
    		<url>http://maven.aliyun.com/nexus/content/groups/public/url>
    		<mirrorOf>centralmirrorOf>
    		mirror>
    
    	<mirror>
    		<id>centralid>
    		<name>Maven Repository Switchboardname>
    		<url>http://repo1.maven.org/maven2/url>
    		<mirrorOf>centralmirrorOf>
    	mirror>
    
    	<mirror>
    		<id>repo2id>
    		<mirrorOf>centralmirrorOf>
    		<name>Human Readable Name for this Mirror.name>
    		<url>http://repo2.maven.org/maven2/url>
    	mirror>
    
    	<mirror>
    		<id>ibiblioid>
    		<mirrorOf>centralmirrorOf>
    		<name>Human Readable Name for this Mirror.name>
    		<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/url>
    	mirror>
    
    	<mirror>
    		<id>jboss-public-repository-groupid>
    		<mirrorOf>centralmirrorOf>
    		<name>JBoss Public Repository Groupname>
    		<url>http://repository.jboss.org/nexus/content/groups/publicurl>
    	mirror>
    
    	<mirror>
    		<id>google-maven-centralid>
    		<name>Google Maven Centralname>
    		<url>https://maven-central.storage.googleapis.com
    url>
    		<mirrorOf>centralmirrorOf>
    	mirror>
    
    	<mirror>
    		<id>maven.net.cnid>
    		<name>oneof the central mirrors in chinaname>
    		<url>http://maven.net.cn/content/groups/public/url>
    		<mirrorOf>centralmirrorOf>
    	mirror>
    
    	mirrors>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    1. 在IDEA中配置Maven
      (1)关闭所有项目,防止配置只生效当前项目!
      (2)打开Settings,在输入框输入maven,这里要注意,选择了自定义的maven后, 一定要勾选Override(覆盖)。同时保证 Local repository 项填写的路径和你勾选的配置文件中配置的路径是一致的。
      IDEA配置Maven
      (3)设置镜像源(如果在setting中设置,可跳过!)
      IDEA Maven配置国内镜像
      (4)配置Intellij IDEA中自动下载jar包 :依次点击File -> Setting ->Maven ->Importing:选中Automatically download中的两个多选框Sources和Documentation
      自动安装Jar包
    2、新建Maven项目

    点击File–>New–>Project,选择Maven
    选择下一步
    创建Maven项目
    新建后会出现如图所示界面:
    默认界面
    1:SRC,项目代码所属目录,放到Java文件中,正式
    2:TEST,测试代码
    3:POM.xml:包管理文件,需要的包以键值对的方式传入
    4:导入包的方式,点击导入
    5:也是导入包的方式,点击后本项目的包自动导入

    三、设置连接Hadoop

    新建完成后需要设置导入包,新建class

    1、Linux中操作

    (1)拷出hdfs-site.xml和core-site.xml文件
    安装lrzsz后可以选择sz保存到Windows中,或者使用软件拷出也可以
    (2)启动集群

    $HADOOP_HOME/sbin/start-all.sh
    
    • 1

    (3)创建目录,上传文件到hdfs中

    [root@master ~]# hdfs dfs -mkdir /data
    [root@master ~]# hdfs dfs -mkdir /out
    [root@master ~]# hdfs dfs -put ./word.txt /data/
    [root@master ~]# hdfs dfs -ls /data/
    Found 1 items
    -rw-r--r--   3 root supergroup         22 2020-08-08 18:14 /data/word.txt
    [root@master ~]# hdfs dfs -cat /data/word.txt
    hello word
    hello Java
    [root@master ~]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    2、IDEA中操作

    (1)导入hadoop配置文件到resources中
    配置文件导入
    (2)查看一下本项目的Maven是否配置生效了,如果没有则修改
    项目Maven配置

    (3)修改pom.xml文件,导入需要的包(无需更改内容)

    
    <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.0modelVersion>
    
        <groupId>org.examplegroupId>
        <artifactId>JavaHadoopProJectSartifactId>
        <version>1.0-SNAPSHOTversion>
    
    <packaging>jarpackaging>
    
    <dependencies>
      <dependency>
        <groupId>org.apache.hadoopgroupId>
        <artifactId>hadoop-clientartifactId>
        <version>2.7.3version>
      dependency>
    dependencies>
    
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.pluginsgroupId>
          <artifactId>maven-jar-pluginartifactId>
          <version>2.4version>
          <configuration>
            <archive>
              <manifest>
                <mainClass>org.hhrz.mapreduce.demo.JobMainmainClass>
              manifest>
            archive>
          configuration>
        plugin>
      plugins>
    build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    修改文件后点击右下角的自动导入包
    (4)新建wordcount类(注意编程规范)
    wordcount

    package hadoop;
    import java.io.IOException;
    import java.util.StringTokenizer;
    
    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.Mapper;
    import org.apache.hadoop.mapreduce.Reducer;
    import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
    import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
    import org.apache.hadoop.util.GenericOptionsParser;
    import org.apache.log4j.BasicConfigurator;
    
    public class WordCount {
        public static class Map extends Mapper<Object,Text,Text,IntWritable>{
            private static IntWritable one = new IntWritable(1);
            private Text word = new Text();
            public void map(Object key,Text value,Context context) throws IOException,InterruptedException{
                StringTokenizer st = new StringTokenizer(value.toString());
                while(st.hasMoreTokens()){
                    word.set(st.nextToken());
                    context.write(word, one);
                }
            }
        }
    
        public static class Reduce extends Reducer<Text,IntWritable,Text,IntWritable>{
            private static IntWritable result = new IntWritable();
            public void reduce(Text key,Iterable<IntWritable> values,Context context) throws IOException,InterruptedException{
                int sum = 0;
                for(IntWritable val:values){
                    sum += val.get();
                }
                result.set(sum);
                context.write(key, result);
            }
        }
    
        static {
            try {
                System.load("D:/JavaFile/bin/hadoop.dll");//建议采用绝对地址,bin目录下的hadoop.dll文件路径
            } catch (UnsatisfiedLinkError e) {
                System.err.println("Native code library failed to load.\n" + e);
                System.exit(1);
            }
        }
    
        public static void main(String[] args) throws Exception{
            BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。
            System.setProperty("HADOOP_USER_NAME", "root");
            Configuration conf = new Configuration();
            String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
            if(otherArgs.length != 2){
                System.err.println("Usage WordCount  ");
                System.exit(2);
            }
            Job job = new Job(conf,"word count");
            job.setJarByClass(WordCount.class);
            job.setMapperClass(Map.class);
            job.setCombinerClass(Reduce.class);
            job.setReducerClass(Reduce.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
            FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
            System.exit(job.waitForCompletion(true) ? 0 : 1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71

    (5)传入参数
    设置
    设置路径
    第一个路径是输入路径,可以精确到某个文件,也可以模糊到文件夹,但是注意:输入参数是文件夹时,文件夹内不能再包含文件夹;第二个路径是输出路径,输出路径后不能存在,否则会报错。两个文件路径都是HDFS上
    (6)运行
    运行过程

    四、可能出现的问题

    1.org.apache.hadoop.io.nativeio.NativeIO$Windows.createDirectoryWithMode0(Ljava/lang/String;I)V
    原因:缺少hadoop.dll或winutils.exe等驱动,需要下载对应hadoop版本的hadoop.dll(相差较少版本据说也可以,如2.7.3版本Hadoop可以使用2.6的Hadoop.dll)。
    解决方案(1)将文件放置到$Hadoop/bin下;或者 (2)添加到代码当中 (建议放到main的上面)
    链接:hadoop-common-2.7.3-bin百度网盘链接
    提取码:qf5b

    static {
            try {
                System.load("D:/JavaFile/bin/hadoop.dll");//建议采用绝对地址,bin目录下的hadoop.dll文件路径
            } catch (UnsatisfiedLinkError e) {
                System.err.println("Native code library failed to load.\n" + e);
                System.exit(1);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).log4j:WARN Please initialize the log4j system properly.log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

    原因:log4j缺省问题
    解决方法(1)配置log4j.properties(不推荐,复杂);或者 (2)添加代码

    	public static void main(String[] args) throws Exception{
            BasicConfigurator.configure(); //自动快速地使用缺省Log4j环境。建议放到mian当中
    
    • 1
    • 2

    以上两个问题的解决代码已经写入到WordCount中,无需额外复制粘贴


    参考链接:IntelliJ IDEA运行WordCount(详细版)

  • 相关阅读:
    分层化网络设计:核心层,汇聚层,接入层
    不同写法的性能差异
    SpringBoot自动配置原理分析
    springboot集成MyBatisPlus、自定义xml、打印SQL
    c++ 二分查找
    3个月测试员自述:4个影响我职业生涯的重要技能
    用DOM来读取XML时要注意的一些概念
    2022-08-10 第四小组 修身课 学习笔记(every day)
    机器人工程是否有红利期
    用户上传图片并将路径地址存入数据库中
  • 原文地址:https://blog.csdn.net/qq_44491709/article/details/107881124