Ubuntu Hadoop2.7下使用Eclipse编译运行MapReduce程序

本文不生产内容,只是以下内容的搬运工
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程序的开发了。

推荐阅读更多精彩内容

  • 首先,我们在使用前先看看HDFS是什麽?这将有助于我们是以后的运维使用和故障排除思路的获得。 HDFS采用mast...
    W_Bousquet阅读 2,876评论 0 2
  • 随着全球经济的不断发展,大数据时代早已悄悄到来,而Hadoop又是大数据环境的基础,想入门大数据行业首先需要了解H...
    LeiLv阅读 2,393评论 0 31
  • Hadoop部署方式 本地模式 伪分布模式(在一台机器中模拟,让所有进程在一台机器上运行) 集群模式 服务器只是一...
    陈半仙儿阅读 901评论 0 9
  • 踮起脚尖够生活的人,永远在力所能及的范围内,给自己最好的人生体验。只有见到最好的,才知道人是为什么而努力,并不仅仅...
    阿葵哦阅读 553评论 0 0
  • 把大家写的都看了一遍,感觉都写得很好,迟迟不知道怎么下手…… 元能力包括同理心,自我认知,自我控制,自我激励,人际...
    Fineyoga智慧阅读 68评论 0 3