zoukankan      html  css  js  c++  java
  • window下使用IDEA远程调试伪分布式hadoop集群

    在配置了伪分布式hadoop集群后,接下来就可以写MapReduce程序,在集群中运行并且可以调试。一般来说需要将代码打成jar包,然后在hadoop集群中使用hadoop jar命令来运行,但是这样无法调试打断点,因此IDEA远程调试是有必要的。

    本地准备hadoop包

    将安装了hadoop集群的tar包,在window选择一个目录,进行解压保存一份。

    IDEA中导包

    IDEA中建立Module后,需要导入依赖jar包,来源就是上面解压的share目录下的jar包,需要在对应Module点击Dependencies导入common、hdfs、MapReduce和yarn下的包,导入后效果如图。

    准备winutils.exe等文件

    hadoop天然对window开发不友好,因此需要添加如下插件,将其整体粘贴到本地hadoop的bin目录下,并且双击winutils.exe文件运行一下。如果不设置,后面运行MapReduce会提示winutils文件找不到的错误。

    window环境变量

    以上配置完成后,依然是无法远程调试的,还需要修改window环境变量,添加本地hadoop的bin目录,并且还需要添加HADOOP_USER_NAME这样系统变量。

    (1)hadoop环境变量设置。

    (2)添加HADOOP_USER_NAME系统变量,值为root,如果不设置后面运行MapReduce会报权限不够。

     

    准备MapReduce程序

    再完成上面的配置后,才能到这一步。这里简单的准备一个MapReduce程序,就是统计一段文本中单词出现的次数,需要使用空格拆分每行数据。

    mapper类

    package com.boe.mapreduce02;
    
    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;
    
    /**
     * Mapper类,来完成Map阶段
     */
    public class CharMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //每行读取
            //context 用它写到reducer
            String[] str = value.toString().split(" ");
            for (String c : str) {
                context.write(new Text(c),new IntWritable(1));
            }
        }
    }
    View Code

    reducer类

    package com.boe.mapreduce02;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Reducer;
    
    import java.io.IOException;
    
    /**
     * Reducer
     */
    public class CharReducer extends Reducer<Text,IntWritable,Text,IntWritable> {
        @Override
        protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            //values是迭代器,reduce阶段和并分区数据,并将结果存入到迭代器中,结果为[1111111...]这样的数据
            //context,用它写到hdfs
            int sum=0;
            for (IntWritable value : values) {
                sum+=value.get();
            }
            context.write(key,new IntWritable(sum));
        }
    }
    View Code

    主类

    package com.boe.mapreduce02;
    
    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;
    
    /**
     * mapreduce入门
     */
    public class CharacterCount {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
            //向yarn提交一个job
            Job job=Job.getInstance(new Configuration());
            //设置入口类
            job.setJarByClass(CharacterCount.class);
            //设置mapper类和reducer类
            job.setMapperClass(CharMapper.class);
            job.setReducerClass(CharReducer.class);
    
            //设置map输出格式
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(IntWritable.class);
            //设置reduce输出格式
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
            //如果map输出格式和reduce输出格式一样,就只需要设置reduce就行
    
            //设置读取的文件
            FileInputFormat.addInputPath(job,new Path("hdfs://192.168.200.100:9000/txt/words.txt"));
            //设置输出路径
            //输出路径必须不存在
            FileOutputFormat.setOutputPath(job,new Path("hdfs://192.168.200.100:9000/wordcount"));
            //提交
            job.waitForCompletion(true);
    
        }
    
    }
    View Code

    准备words.txt文件

    运行后查看输出结果,发现正常的输出统计结果,单词和统计数值之间是使用制表符'' ''来分开,发现它们间距有些不一致。因为一个制表符是8个空格的位置,比如football刚好8个空格,和1之间就会有8位的空格,而about这种不到8位的单词,它后面的1就会按照about的首字母a来开始算,往后退8个空格展示,因此就有了看上去不整齐的结果。

    这样就完成了window下IDEA实现远程调试Hadoop伪分布式集群的配置使用,记录一下后面查看用。 

    参考博文:

    (1)https://blog.csdn.net/weixin_39339717/article/details/94635390

  • 相关阅读:
    第五次作业之例行报告
    欢迎来怼—第三次Scrum会议
    例行报告
    探路者 Alpha阶段中间产物
    第六次作业—例行报告
    第五次作业—例行报告
    第四次作业—单元测试
    第四次作业—例行报告
    第四次作业—结对编程 四则运算
    第四次作业—1.代码规范
  • 原文地址:https://www.cnblogs.com/youngchaolin/p/11997906.html
Copyright © 2011-2022 走看看