• 使用Eclipse搭建Hadoop编程环境


    在前人的基础上,进行总结学习,发现bug,修改bug。

    系统平台:Ubuntu14.04TLS(64位)

    Hadoop环境:Hadoop2.7.1

    Eclipse:Neon.2 Release(4.6.2)

    Eclipse插件:hadoop-eclipse-plugin-2.7.1.jar

    一.编译环境搭建


    1.在eclipse上安装Hadoop插件

    把下载好的hadoop-eclipse-plugin-2.7.1.jar文件拷贝到eclipse安装目录中的plugins文件夹内。如下图:

    2.继续配置hadoop编译环境(方便配置,确保已经开启了 Hadoop)

    启动 Eclipse 后就可以在左侧的Project Explorer中看到DFS Locations

    3.插件的配置

    第一步:选择 Window 菜单下的 Preference。

    此时会弹出一个窗体,点击选择Hadoop Map/Reduce 选项,选择 Hadoop 的安装目录(例如:/home/hadoop/hadoop)。

    第二步:切换 Map/Reduce 开发视图

    选择Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择Map/Reduce 选项即可进行切换。

    第三步:建立与 Hadoop 集群的连接

    点击Eclipse软件右下角的Map/Reduce Locations 面板,在面板中单击右键,选择New Hadoop Location

    在弹出来的General选项面板中,General 的设置要与 Hadoop 的配置一致。一般两个 Host值是一样的,如果是伪分布式,填写 localhost 即可,这里使用的是Hadoop伪分布,设置fs.defaultFShdfs://localhost:9000,则 DFS MasterPort 改为 9000Map/Reduce(V2) MasterPort 用默认的即可,Location Name 随意填写。

    Advanced parameters 选项面板是对 Hadoop 参数进行配置,就是填写 Hadoop 的配置项(/home/hadoop/hadoop/etc/hadoop中的配置文件),如果配置了 hadoop.tmp.dir,就要进行相应的修改。但修改起来会比较繁琐,可以通过复制配置文件的方式解决。只要配置General 就行了,点击 finishMap/Reduce Location 就创建完成。

    二.在 Eclipse 中操作 HDFS 中的文件

    配置好后,点击左侧Project Explorer 中的 MapReduce Location 就能直接查看 HDFS 中的文件列表了(HDFS 中要有文件,如下图是 WordCount的输出结果),双击可以查看内容,右键点击可以上传、下载、删除 HDFS 中的文件。

    如果无法查看,可右键点击Location 尝试 Reconnect 或重启 EclipseHDFS 中的内容更新后Eclipse 不会同步刷新,需要右键点击 Project Explorer中的MapReduce Location,选择Refresh,(文件比较大的情况下eclipse可能死掉,重启eclipse就行)才能看到更新后的文件。

    三.在 Eclipse 中创建 MapReduce 项目

    点击 File 菜单,选择 New -> Project…:

    选择Map/Reduce Project,点击Next

    填写 ProjectnameWordCount 即可,点击Finish就创建好了项目。

    然后在左侧的Project Explorer可以看到刚才建立的项目。

    接着右键点击刚创建的WordCount 项目,选择 New -> Class

    需要填写两个地方:在Package 处填写 org.apache.hadoop.examples;在Name 处填写WordCount。(包名、类名可以随意起)

    创建 Class 完成后,在 Projectsrc中可以看到 WordCount.java 这个文件。将如下 WordCount的代码拷贝到该文件中。

    package org.apache.hadoop.examples;
     
    import java.io.IOException;
    import java.util.Iterator;
    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;
     
    public class WordCount {
        public WordCount() {
        }
     
        public static void main(String[] args) throws Exception {
            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 = Job.getInstance(conf, "word count");
            job.setJarByClass(WordCount.class);
            job.setMapperClass(WordCount.TokenizerMapper.class);
            job.setCombinerClass(WordCount.IntSumReducer.class);
            job.setReducerClass(WordCount.IntSumReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(IntWritable.class);
     
            for(int i = 0; i < otherArgs.length - 1; ++i) {
                FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
            }
     
            FileOutputFormat.setOutputPath(job, new Path(otherArgs[otherArgs.length - 1]));
            System.exit(job.waitForCompletion(true)?0:1);
        }
     
        public static class IntSumReducer extends Reducer {
            private IntWritable result = new IntWritable();
     
            public IntSumReducer() {
            }
     
            public void reduce(Text key, Iterable values, Reducer.Context context) throws IOException, InterruptedException {
                int sum = 0;
     
                IntWritable val;
                for(Iterator i$ = values.iterator(); i$.hasNext(); sum += val.get()) {
                    val = (IntWritable)i$.next();
                }
     
                this.result.set(sum);
                context.write(key, this.result);
            }
        }
     
        public static class TokenizerMapper extends Mapper {
            private static final IntWritable one = new IntWritable(1);
            private Text word = new Text();
     
            public TokenizerMapper() {
            }
     
            public void map(Object key, Text value, Mapper.Context context) throws IOException, InterruptedException {
                StringTokenizer itr = new StringTokenizer(value.toString());
     
                while(itr.hasMoreTokens()) {
                    this.word.set(itr.nextToken());
                    context.write(this.word, one);
                }
     
            }
        }
    }
    
    • 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
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81

    四.通过eclipse运行mapreduce

    运行 MapReduce 程序前,务必将 /home/hadoop/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要core-site.xml 和 hdfs-site.xml),以及log4j.properties复制到WordCount 项目下的 src文件夹(~/workspace/WordCount/src)中。

    原因:

    在使用 Eclipse 运行 MapReduce 程序时,会读取 Hadoop-Eclipse-PluginAdvanced parameters作为 Hadoop 运行参数,如果未进行修改,则默认的参数其实就是单机(非分布式)参数,因此程序运行时是读取本地目录而不是HDFS 目录,就会提示Input 路径不存在。

    Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/hadoop/workspace/WordCountProject/input
    
    • 1

    所以需要将配置文件拷贝到项目中的 src 目录,来覆盖这些参数。让程序能够正确运行。log4j用于记录程序的输出日记,需要log4j.properties 这个配置文件,如果没有拷贝该文件到项目中,运行程序后在Console 面板中会出现警告提示:

    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.
    
    • 1
    • 2
    • 3

    这种情况不影响程序的正确运行的,但程序运行时无法看到任何提示消息,只能看到出错信息。

    拷贝完成后,右键点击 WordCount 选择 refresh 进行刷新(不会自动刷新,需要手动刷新),可以看到文件结构如下所示:

    点击工具栏中的 Run 图标,或者右键点击 Project Explorer 中的 WordCount.java,选择 Run As -> Run on Hadoop,就可以运行 MapReduce 程序了。不过由于没有指定参数,运行时会提示 “Usage: wordcount”,需要通过Eclipse设定一下运行参数。

    右键点击刚创建的 WordCount.java,选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数(如果 Java Application 下面没有 WordCount,那么需要先双击 Java Application)。切换到 "Arguments"栏,在Program arguments 处填写参数**“****/input /****output”**。

    注意:在环境下测试,如果没有**“/”,**会提示如下错误信息:

    Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/hadoop/input
    
    • 1

    也可以直接在代码中设置好输入参数。可将代码 main() 函数的String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();改为(没有测试):

    // String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    String[] otherArgs=new String[]{"input","output"}; /* 直接设置输入参数 */
    
    • 1
    • 2

    设定参数后,运行程序,可以看到运行成功的提示,刷新DFS Location后也能看到输出的 output 文件夹。

    五.在eclipse中导出可运行的jar包

    1. 鼠标右键点击项目名称,并选择Export

    2. 选择Java–> Runnable JAR file

    3. 选择正确的项目配置信息,和输出路径以及重命名jar

    4. 点击OK完成导出可运行jar(测试方法与运行Hadoop自带的Wordcount方法一样,不在赘述)

    参考资料:

    http://dblab.xmu.edu.cn/blog/hadoop-build-project-using-eclipse/

  • 相关阅读:
    Mybatis做批量操作
    一幅长文细学TypeScript(一)——上手
    AI助力剧本创作:如何5分钟内构思出热门短剧大纲
    数据结构【AVL树模拟实现】
    CSS 3之美化表格样式
    以客户为中心,CRM系统可以给企业带来哪些价值?值得一看
    lizard的基本使用
    2023年云南省职业院校技能大赛中职组“网络安全”赛项样题
    【Java课堂】String类
    centos8.5安装mysql8.0时出现GPG检查失败
  • 原文地址:https://blog.csdn.net/m0_67393157/article/details/126553692