美文网首页
Ubuntu Hadoop2.7下使用Eclipse编译运行Ma

Ubuntu Hadoop2.7下使用Eclipse编译运行Ma

作者: 超越爱迪生 | 来源:发表于2016-02-07 11:49 被阅读1708次

    本文不生产内容,只是以下内容的搬运工
    http://www.cnblogs.com/kinglau/p/3794433.html
    http://www.powerxing.com/install-hadoop/
    http://www.powerxing.com/hadoop-build-project-using-eclipse/

    环境#

    本文基于Ubuntu 14.04 64bit, Hadoop2.7

    Hadoop伪分布式安装配置#

    创建Hadoop用户##

    首先创建Hadoop用户组

    sudo addgroup hadoop
    

    然后创建Hadoop用户

    sudo adduser -ingroup hadoop hadoop
    

    这会提示输入hadoop用户的密码。

    接下来为hadoop用户添加权限

    sudo gedit /etc/sudoers
    
    hadoop-user-priviledge.png

    用新创建的Hadoop用户登录##

    安装SSH##

    sudo apt-get install openssh-server
    

    安装完成后,启动服务

    sudo /etc/init.d/ssh start
    

    设置免登陆密码,生成私钥和公钥

    ssh-keygen -t rsa -P ""
    

    此时会再/home/hadoop/.ssh下生成两个文件,id_rsa和id_rsa.pub,前者为私钥,后者为公钥。

    下面我们将公钥追加到authorized_keys中,它用户保存所有允许以当前用户身份登录到ssh客户端用户的公钥内容。

    cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
    

    登录ssh

    ssh localhost
    

    退出

    exit
    

    安装JAVA环境##

    从官网http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,选择Linux x64下载到本地jdk-8u73-linux-x64.gz
    然后解压

    tar -zxvf jdk-8u73-linux-x64.gz
    

    我们这里想把JAVA安装到/usr/local/java,因此把解压出的文件移动到这里

    sudo mv jdk1.8.0_71 /usr/local/jdk1.8.0_71
    

    安装Hadoop##

    首先,从官网下载Hadoop 2.7
    http://mirror.bit.edu.cn/apache/hadoop/common/

    然后加压

    tar -zxvf hadoop-2.7.0.tar.gz
    

    本实验中我们想把hadoop安装在/usr/local下面,因此把解压出来的文件夹移动到/usr/local/hadoop

    sudo mv hadoop-2.7.0 /usr/local/hadoop
    

    配置##

    配置环境变量###

    首先我们需要知道上一步中JAVA的安装路径,上一步我们安装到了/usr/local/jdk1.8.0_71。
    打开 ~/.bashrc

    sudo gedit ~/.bashrc
    

    该命令会打开该文件的编辑窗口,在文件末尾追加下面内容,然后保存,关闭编辑窗口。

    #HADOOP VARIABLES START
    export JAVA_HOME=/usr/local/jdk1.8.0_71
    export HADOOP_INSTALL=/usr/local/hadoop
    export PATH=$PATH:$HADOOP_INSTALL/bin
    export PATH=$PATH:$HADOOP_INSTALL/sbin
    export HADOOP_MAPRED_HOME=$HADOOP_INSTALL
    export HADOOP_COMMON_HOME=$HADOOP_INSTALL
    export HADOOP_HDFS_HOME=$HADOOP_INSTALL
    export YARN_HOME=$HADOOP_INSTALL
    export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_INSTALL/lib/native
    export HADOOP_OPTS="-Djava.library.path=$HADOOP_INSTALL/lib"
    #HADOOP VARIABLES END
    

    执行下面命,使添加的环境变量生效:

    source ~/.bashrc
    

    配置hadoop-env###

    打开hadoop-env.sh

     sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh
    

    找到JAVA_HOME变量,修改此变量如下

    export JAVA_HOME=/usr/local/jdk1.8.0_71  
    

    WordCount单机模式测试#

    至此,我们的单机模式已经安装完成。通过hadoop自带的WordCount实例验证是否安装成功。

    cd /usr/local/hadoop
    mkdir input
    cp README.txt input
    bin/hadoop jar share/hadoop/mapreduce/sources/hadoop-mapreduce-examples-2.4.0-sources.jar org.apache.hadoop.examples.WordCount input output
    

    然后查看结果

    cat output/*
    

    伪分布式环境配置##

    Hadoop 可以在单节点上以伪分布式的方式运行,Hadoop 进程以分离的 Java 进程来运行,节点既作为 NameNode 也作为 DataNode,同时,读取的是 HDFS 中的文件。
    Hadoop 的配置文件位于 /usr/local/hadoop/etc/hadoop/ 中,伪分布式需要修改2个配置文件 core-site.xmlhdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。
    修改配置文件 core-site.xml (通过 gedit 编辑会比较方便: gedit ./etc/hadoop/core-site.xml
    ),将当中的

    <configuration>
    </configuration>
    

    修改为

    <configuration>
            <property>
                 <name>hadoop.tmp.dir</name>
                 <value>file:/usr/local/hadoop/tmp</value>
                 <description>Abase for other temporary directories.</description>
            </property>
            <property>
                 <name>fs.defaultFS</name>
                 <value>hdfs://localhost:9000</value>
            </property>
    </configuration>
    

    同样的,修改配置文件 hdfs-site.xml

    <configuration>
            <property>
                 <name>dfs.replication</name>
                 <value>1</value>
            </property>
            <property>
                 <name>dfs.namenode.name.dir</name>
                 <value>file:/usr/local/hadoop/tmp/dfs/name</value>
            </property>
            <property>
                 <name>dfs.datanode.data.dir</name>
                 <value>file:/usr/local/hadoop/tmp/dfs/data</value>
            </property>
    </configuration>
    

    配置完成后,执行 NameNode 的格式化

    ./bin/hdfs namenode -format
    

    成功的话,会看到 “successfully formatted” 和 “Exitting with status 0″ 的提示,若为 “Exitting with status 1″ 则是出错。

    接着开启 NameNode 和 DataNode 守护进程。

    ./sbin/start-dfs.sh
    

    启动时可能会出现如下 WARN 提示:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable WARN 提示可以忽略,并不会影响正常使用。

    启动完成后,可以通过命令 jps来判断是否成功启动,若成功启动则会列出如下进程:“NameNode”、”DataNode” 和 “SecondaryNameNode”
    (如果 SecondaryNameNode 没有启动,请运行 sbin/stop-dfs.sh 关闭进程,然后再次尝试启动尝试)。
    如果没有 NameNode 或 DataNode ,那就是配置不成功,请仔细检查之前步骤,或通过查看启动日志排查原因。


    install-hadoop-16-jps.png

    一般情况下,若是 DataNode 没有启动,可尝试如下的

    ./sbin/stop-dfs.sh   # 关闭
    rm -r ./tmp 删除 tmp 文件,注意这会删除 HDFS 中原有的所有数据
    ./bin/hdfs namenode -format 重新格式化 NameNode
    ./sbin/start-dfs.sh  # 重启
    

    成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。

    install-hadoop-17-web-ui.png

    运行Hadoop伪分布式实例##

    上面的单机模式,WordCount读取的是本地数据,伪分布式读取的则是 HDFS 上的数据。要使用 HDFS,首先需要在 HDFS 中创建用户目录:

    ./bin/hdfs dfs -mkdir -p /user/hadoop
    

    接着将 ./etc/hadoop 中的 xml 文件作为输入文件复制到分布式文件系统中,即将 /usr/local/hadoop/etc/hadoop 复制到分布式文件系统中的 /user/hadoop/input 中。我们使用的是 hadoop 用户,并且已创建相应的用户目录 /user/hadoop ,因此在命令中就可以使用相对路径如 input,其对应的绝对路径就是 /user/hadoop/input:

    ./bin/hdfs dfs -mkdir input
    ./bin/hdfs dfs -put ./etc/hadoop/*.xml input
    

    复制完成后,可以通过如下命令查看文件列表:

    ./bin/hdfs dfs -ls input
    

    伪分布式运行 MapReduce 作业的方式跟单机模式相同,区别在于伪分布式读取的是HDFS中的文件

    ./bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar input output
    

    安装配置Eclipse#

    安装Hadoop Eclipse Plugin##

    下载地址 hadoop2x-eclipse-plugin
    (备用下载地址:http://pan.baidu.com/s/1i4ikIoP

    下载后,将 release 中的 hadoop-eclipse-kepler-plugin-2.6.0.jar复制到 Eclipse 安装目录的 plugins 文件夹中,重启 Eclipse。

    配置Hadoop Eclipse Plugin##

    在继续配置前请确保已经开启了 Hadoop。即通过jps可以看到NameNode,DataNode,SecondaryNameNode都已在运行。

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

    hadoop-build-project-using-eclipse-03.png

    插件需要进一步的配置。
    第一步:选择 Window 菜单下的 Preference。
    此时会弹出一个窗体,窗体的左侧会多出 Hadoop Map/Reduce 选项,点击此选项,选择 Hadoop 的安装目录(如/usr/local/hadoop,Ubuntu不好选择目录,直接输入就行)。


    hadoop-build-project-using-eclipse-05.png

    第二步:切换 Map/Reduce 开发视图
    选择 Window 菜单下选择 Open Perspective -> Other,弹出一个窗体,从中选择 Map/Reduce 选项即可进行切换。

    第三步:建立与 Hadoop 集群的连接
    点击 Eclipse软件右下角的 Map/Reduce Locations 面板,在面板中单击右键,选择 New Hadoop Location

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

    最后的设置如下图所示:


    hadoop-build-project-using-eclipse-08.png

    在 Eclipse 中创建 MapReduce 项目##

    点击 File 菜单,选择 New -> Project…:
    选择 Map/Reduce Project,点击 Next。
    填写 Project name 为 WordCount 即可,点击 Finish 就创建好了项目。

    接着右键点击刚创建的 WordCount 项目,选择 New -> Class
    需要填写两个地方:在 Package 处填写 org.apache.hadoop.examples;在 Name 处填写 WordCount。

    创建 Class 完成后,在 Project 的 src 中就能看到 WordCount.java 这个文件。将如下 WordCount 的代码复制到该文件

    package org.apache.hadoop.examples;
     
    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;
     
    public class WordCount {
     
      public static class TokenizerMapper 
           extends Mapper<Object, Text, Text, IntWritable>{
     
        private final static IntWritable one = new IntWritable(1);
        private Text word = new Text();
     
        public void map(Object key, Text value, Context context
                        ) throws IOException, InterruptedException {
          StringTokenizer itr = new StringTokenizer(value.toString());
          while (itr.hasMoreTokens()) {
            word.set(itr.nextToken());
            context.write(word, one);
          }
        }
      }
     
      public static class IntSumReducer 
           extends Reducer<Text,IntWritable,Text,IntWritable> {
        private 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);
        }
      }
     
      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 <in> <out>");
          System.exit(2);
        }
        Job job = new Job(conf, "word count");
        job.setJarByClass(WordCount.class);
        job.setMapperClass(TokenizerMapper.class);
        job.setCombinerClass(IntSumReducer.class);
        job.setReducerClass(IntSumReducer.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);
      }
    }
    

    通过 Eclipse 运行 MapReduce##

    在运行 MapReduce 程序前,还需要执行一项重要操作(也就是上面提到的通过复制配置文件解决参数设置问题):将 /usr/local/hadoop/etc/hadoop 中将有修改过的配置文件(如伪分布式需要 core-site.xml 和 hdfs-site.xml),以及 log4j.properties 复制到 WordCount 项目下的 src 文件夹(~/workspace/WordCount/src)中:

    cp /usr/local/hadoop/etc/hadoop/core-site.xml ~/workspace/WordCount/src
    cp /usr/local/hadoop/etc/hadoop/hdfs-site.xml ~/workspace/WordCount/src
    cp /usr/local/hadoop/etc/hadoop/log4j.properties ~/workspace/WordCount/src
    

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

    hadoop-build-project-using-eclipse-17.png

    选择 Run As -> Run Configurations,在此处可以设置运行时的相关参数。切换到 “Arguments” 栏,在 Program arguments 处填写 “input output” 就可以了。这里的input即为之前创建在hadoop上的input路径。

    hadoop-build-project-using-eclipse-17.png

    至此,你就可以使用 Eclipse 方便的进行 MapReduce程序的开发了。

    相关文章

      网友评论

          本文标题:Ubuntu Hadoop2.7下使用Eclipse编译运行Ma

          本文链接:https://www.haomeiwen.com/subject/dujykttx.html