ubuntu 16.04 下配置 hadoop + eclipse 开发环境

注:笔记有参考这篇文章,但实际还是碰到了不少坑,所以做了一些整理;程序来源于这篇文章,稍做了修改。

一、安装 JDK 1.8

我安装的是oracleJDK 1.8

1.先将含有相关包的清单导入。

$ sudo add-apt-repository ppa:webupd8team/java

2.然后更新一下包列表。

$ sudo apt-get update

3.安装oracleJDK

$ sudo apt-get install oracle-java8-installer

4.最后会有个图形界面的安装程序,选择 [OK] -> [Yes] ,然后静候安装完毕即可。

二、安装hadoop

我安装的是 hadoop 2.6.0(伪分布模式)

2.1 创建hadoop用户

$ sudo useradd -m hadoop -s /bin/bash  #创建hadoop用户,并使用/bin/bash作为shell
$ sudo passwd hadoop                   #为hadoop用户设置密码,之后需要连续输入两次密码
$ sudo adduser hadoop sudo             #为hadoop用户增加管理员权限
$ su - hadoop                          #切换当前用户为用户hadoop
$ sudo apt-get update                  #更新hadoop用户的apt,方便后面的安装

之后的配置都在hadoop用户的状态下进行。

2.2 安装SSH,并设置SSH无密码登陆

在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作,所以,需要安装SSH,但是,SSH远程登陆的时候,需要密码验证,为了方便,配置SSH无密码登录。

$ sudo apt-get install openssh-server   #安装SSH server
$ ssh localhost                         #登陆SSH,第一次登陆输入yes
$ exit                                  #退出登录的ssh localhost
$ cd ~/.ssh/                            #如果没法进入该目录,执行一次ssh localhost
$ ssh-keygen -t rsa

输入完 $ ssh-keygen -t rsa 语句以后,需要连续敲击三次回车,如下图:
enter3
其中,第一次回车是让KEY存于默认位置,以方便后续的命令输入。第二次和第三次是确定passphrase,相关性不大。两次回车输入完毕以后,如果出现类似于下图所示的输出,即成功:
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第1张图片

之后再输入:

$ cat ./id_rsa.pub >> ./authorized_keys #加入授权
$ ssh localhost                         

此时已不需密码即可登录localhost,并可见下图(如果失败则可以搜索SSH免密码登录来寻求答案)。以后都用这种方式登录即可。
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第2张图片

2.3 安装hadoop-2.6.0

先下载hadoop-2.6.0.tar.gz

进入下载目录,解压并安装

$ sudo tar -zxvf  hadoop-2.6.0.tar.gz -C /usr/local    #解压到/usr/local目录下
$ cd /usr/local
$ sudo mv  hadoop-2.6.0    hadoop                      #重命名为hadoop
$ sudo chown -R hadoop ./hadoop                        #修改文件权限

给hadoop配置环境变量,编辑.bashrc文件

$ vi ~/.bashrc

将下面代码添加到.bashrc文件最后并保存。

export HADOOP_HOME=/usr/local/hadoop
export CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath):$CLASSPATH
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

执行使设置生效

$ source ~./bashrc

查看hadoop是否安装成功

$ hadoop version

ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第3张图片

2.4 伪分布式配置

Hadoop可以在单节点上以伪分布式的方式运行,Hadoop进程以分离的Java进程来运行,节点既作为NameNode也作为DataNode,同时,读取的是HDFS中的文件,需要对其进行配置。我的Hadoop的配置文件位 /usr/local/hadoop/etc/hadoop/ 中。

首先讲jdk路径添加到hadoop-env.sh配置文件中(/usr/local/hadoop/etc/hadoop/ 下,后面默认),我的jdk路径为/usr/lib/jvm/java-8-oracle , 将下面代码添加在hadoop-env.sh的最后

export JAVA_HOME=/usr/lib/jvm/java-8-oracle

接下来需要修改2个配置文件 core-site.xml 和 hdfs-site.xml 。Hadoop的配置文件是 xml 格式,每个配置以声明 property 的 name 和 value 的方式来实现。

修改core-site.xml文件:

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

修改文件 hdfs-site.xml:

<configuration>
        <property>
             <name>dfs.replicationname>
             <value>1value>
        property>
        <property>
             <name>dfs.namenode.name.dirname>
             <value>file:/usr/local/hadoop/tmp/dfs/namevalue>
        property>
        <property>
             <name>dfs.datanode.data.dirname>
             <value>file:/usr/local/hadoop/tmp/dfs/datavalue>
        property>
        <property>
             <name>dfs.permissionsname>
             <value>falsevalue>
        property>
configuration>

注:这里我添加了dfs.permissions设置false,因为后面在访问dfs的时候出现了用户权限的问题,所以我干脆将检查取消了。

配置完成后,在hadoop文件夹下执行,执行 NameNode 的格式化

$ cd /usr/local/hadoop              #我的hadoop路径
$ ./bin/hdfs namenode -format       #执行 NameNode 的格式化

启动namenode和datanode进程,并查看启动结果

$ ./sbin/start-dfs.sh
$ jps

启动完成后,可以通过命令 jps 来判断是否成功启动,若成功启动则会列出如下进程,如图所示: “NameNode”、”DataNode” 和 “SecondaryNameNode”
配置hdfs

成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第4张图片

三、安装并配置eclipse

3.1 安装eclipse

下载官网的installer

我的安装版本为 Eclipse IDE for Java EE Developers,直接点安装就可以了。
在这里插入图片描述

3.2 配置hadoop插件

下载eclipse-hadoop插件
将插件文件hadoop-eclipse-plugin-2.6.0.jar 拷贝到eclipse安装目录下的dropins文件夹下。(挺多教程是放到plugins文件夹下,但是我放进去没反应)

选择菜单 window->Preference->Hadoop Map/Reduce,如图所示,设置hadoop的安装路径
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第5张图片

选择菜单 Window->Show View->other->MapReduce Tools->MapReduce Locations 打开MapReduce窗口
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第6张图片

可在Project Explorer窗口看到DFS管理界面
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第7张图片

在MapReduce Locations窗口右击新建一个location
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第8张图片

这边需要端口和之前的配置一致,不然会报错,我这里是9000
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第9张图片

最后添加一个文件测试一下
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第10张图片

四、WordCount程序示例

作为刚起步的小白,我选择运行wordcount程序作为hadoop的第一个小程序作为入门。
程序来源于这篇文章,稍做了修改,这里只是运行了一下,对于细节和hadoop的机制还不是特别清楚,有待学习。

先在hdsf创建一个in文件夹并且上传一个简单的文本文件,作为程序的输入。
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第11张图片

然后创建一个map/reduce工程
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第12张图片

直接复制粘贴一个WordCount类,运行程序,代码如下

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.LongWritable;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.mapreduce.Reducer.Context;

public class WordCount {

    // 继承Mapper类,Mapper类的四个泛型参数分别为:输入key类型,输入value类型,输出key类型,输出value类型
    public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
        
        private final static IntWritable one = new IntWritable(1); // output value
        private Text word = new Text(); // output key

        @Override
        public void map(LongWritable key, Text value, Context context) 
                throws IOException, InterruptedException {
            
            String line = value.toString();
            StringTokenizer tokenizer = new StringTokenizer(line);
            
            while (tokenizer.hasMoreTokens()) {
                word.set(tokenizer.nextToken());
                context.write(word, one);
            }
            
        }
    }

    // Reduce类,继承了Reducer类
    public static class Reduce extends
            Reducer<Text, IntWritable, Text, IntWritable> {

        @Override
        public void reduce(Text key, Iterable<IntWritable> values,
                Context context) throws IOException, InterruptedException {
            int sum = 0;
            for (IntWritable val : values) {
                sum += val.get();
            }
            context.write(key, new IntWritable(sum));
        }
    }

    public static void main(String[] args) throws Exception {

        Job job = new Job(); // 创建一个作业对象
        job.setJarByClass(WordCount.class); // 设置运行/处理该作业的类
        job.setJobName("WordCount");  

        FileInputFormat.addInputPath(job, new Path("hdfs://localhost:9000/in"));
        FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/out"));

        job.setMapperClass(Map.class);
        job.setReducerClass(Reduce.class);

        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        System.exit(job.waitForCompletion(true) ? 0 : 1);

    }

}

运行结果可以在out文件夹下看到,这里可能需要刷新一下文件夹。
ubuntu 16.04 下配置 hadoop + eclipse 开发环境_第13张图片

终于看到了运行结果,下面就可以继续hadoop的学习啦

你可能感兴趣的:(笔记)