(Mac下)hadoop2.8.1伪分布式的搭建,以及用eclipse开发Hadoop

前言

  • 声明

    我所有参考的文章,均在我的简书中已标明参考链接出处。

    • Mac系统。(当然其他的系统也可以参考,区别并不大。)

    • Hadoop2.8.1

    • homebrew

    • eclipse

    • 相关的插件

最近在学习Hadoop,在搭建环境当中遇到了一些问题,如今总算是解决了,花了不少时间,毕竟万事开头难嘛,现在也有一些了解了。在此,我将记录下我遇到的所有的问题以及搭建的所有详细过程,以此帮助需要的朋友。


准备

用homebrew下载可以自动为此配置系统环境,是Mac系统不可或缺的下载神器,但就是它的镜像在国外,所以有时下载会非常慢,甚至于没有动静。若是下载太慢,可以参考这篇文章

  • homebrew下载之后打开终端,输入 brew install Hadoop ,开始自动下载Hadoop,我的是Hadoop2.8.1版本。homebrew下载到的目录(如图)


  • Hadoop-eclipse-plugin2.7.3.jar插件,见我的百度云下载 。实际上这个插件对于Hadoop2.8.1版本同样适用,本人已经用此搭建环境成功。当然,如果你有强迫症之类的可以见我的百度云下载2.7.3版本 ,这个版本已经在官网查找不到了,实际上经过我的测试这个对应的版本问题多多..
  • GitHub上的Hadoop-eclipse-plugin2.X.jar插件,见我的百度云下载
  • eclipse下载。自行去官网解决吧。
  • 声明

以上的插件资源来自此处

开始Hadoop的伪分布式配置

配置ssh

  • 打开 系统偏好设置 –> 共享 –> 远程登录 –> 所有用户(如图)

  • 配置ssh

    即为免密码输入的繁琐过程的配置

打开终端,输入 ssh localhost 是否以前有过配置,没有的话 输入ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 回车至可以输入下一行命令行,输入 cat ~/.ssh/id_dsa.pub >>~/.ssh/authorized_keys,再次输入验证 ssh localhost,发现不需要密码输入了(如图)


配置Hadoop伪分布式

找到下面所有需要的配置文件 Finder –> hadoop2.8.1 –> libexec –> etc –> hadoop

打开 hadoop-env.sh

将其中的
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"

改为
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc="


`

打开 yarn-env.sh

在下面添加
YARN_OPTS="$YARN_OPTS -Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"


`

打开 core-site.xml

添加配置如下:

` <configuration>

    <property>  
    <name>fs.defaultFS</name>
    <value>hdfs://localhost:9000</value>          
      </property>
</configuration>`

如图:

其中端口号:9000的对应以下的用eclipse搭建Hadoop时的窗口连接的 DFS Master Port

其中的 localhost 对应本机号,也可以自己根据需要设置


打开 hdfs-site.xml

添加配置如下:

`<configuration>

     <property>
       <name>dfs.replication</name>
       <value>1</value>
    </property>

</configuration>

`

因为是一台机伪分布式,1 即可


打开 mapred-site.xml ,其中一般没有,需要将文件 mapred-site.xml.template 改为 mapred-site.xml 之后再进行配置过程

添加配置如下:

`

<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
 </property>
 <property>
<name>mapred.child.java.opts</name>
<value>-Xmx4096m</value>
</property>
 <property>
<name>mapred.job.tracker</name>
<value>localhost:9001</value>
 </property>

`

其中的 localhost 同样对应本机端,9001 默认端口号对应eclipse Hadoop环境搭建时的连接窗口中的 Map/Reducr Master Port,均可根据需要更改


打开 yarn-site.xml

添加配置如下:

`

 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
</property>

`


启动过程

  • 打开终端,先将目录对应到Hadoop2.8.1安装目录 cd /usr/local/Cellar/hadoop/2.8.1/sbin

  • 格式化 HDFS

若是以前有过Hadoop启动,清除 rm -rf /tmp/hadoop-tanjiti

格式化 hadoop namenode -format

  • 启动
1
`./start-all.sh`
  • 输入 jps,查看是否部署伪分布式成功(如图)

  • 在想要关闭Hadoop可以如下输入推出
1
`./stop-all.sh`

配置Hadoop伪分布式介绍结束,开始eclipse的Hadoop开发环境搭建,这是一个折磨人的过程,我花了一天时间终于建好(比较幸运了..)。记录在下

  • 再次声明,在我的简书均已声明来处,同时感谢那一些默默分享的人们。

eclipse搭建Hadoop开发环境

配置好需要的前提

参考:参考

进行以下过程前提: 在Hadoop端打开的情况下进行连接开发


  • 将下载好的插件放入eclipse的 plugin 目录文件夹(如图1,图2),之后重新打开eclipse之后,打开eclipse preferences 偏好设置可以看到插件(如图3)

  • 图1

  • 图2

  • 图3


  • 对应自己的Hadoop下载地址(如图)

  • 打开窗口端添加 Map/Reduce 窗口(如图)


  • 右键添加 DFS Locations 连接配置(如图1,图2)

  • 图1

  • 图2

其中 Localtion name 随意

两边的端口号根据我上方提到的,可以根据需要自行更改


  • 若是有文件夹出现(如图),表示连接成功


如果是文件显示为0,不要慌张,这是需要自己来增加文件的(如图1)增加文件,注意,并且在在每一次创建文件要自行刷新(如图2),也大大避免了运行命令行的繁琐过程,增加一个 user 文件夹(如图3),在user 下增加一个 hadoop 文件夹,在 hadoop 下增加一个 input 文件夹,在其下并且导入安装Hadoop目录中的 README.txt文件(如图4,图5)。注意,许多教程中说的 output 文件夹是不需要自行增加的,是系统在运行结果出来后自行创建的,这是一个坑

  • 图1

  • 图2

  • 图3

  • 图4

  • 图5

最终效果:


建立一个Hadoop项目

  • 如图1,图2,图3

  • 图1

  • 图2

名字随意取

  • 图3


  • 在这个项目下像建立一个java工程一样建立一个Hadoop工程名为 WorkCount 文件(如图1),并且自行配置导入所有的Hadoop的包(如图2,图3),包得要自行导入了,这个是比较麻烦一点,但是毕竟一个项目导入一次就一劳永逸啦~

  • 图1

  • 图2

  • 图3

  • 之后效果如下


  • 将Hadoop内的被修改过的文件与日志文件加入在工程下,即将配置过的文件与其中的日志文件加入到工程文件中的 src 目录下,否则会发生不必要的错误。如下图

  • 我是将整个的 Hadoop 目录(其中包括所有配置文件的哪个Hadoop文件夹)都加入在了 src 目录下

  • 效果如下

测试WorkCount例子

注意,工程命为 WorkCount 的前提下

  • 在建立的工程中输入如下
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
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);
}
}

配置参数

  • 如图1,如图2,其中的参数配置,即机号,端口号,我们先前建立的 user hadoop input 一一对应,可以根据需要自行更改,其中的 output 是结果出来以后自行创建的,并且记得要在每一次运行结果前更改 output 为其他的不冲突的名字,比如 output1(如图3)

  • 图1

  • 图2

  • 图3


运行

  • 点击运行刚刚配置好的参数配置运行(如图)


  • 在系统自行创建的 output 的文件夹(看不到文件夹就如上刷新)下面的文件可以看到结果输出了(如图)


至此,环境搭建大功告成!!!期间没有像其他人遇到什么问题,不过虽然是迟早的事,不过也是在以后了,哈哈😹。

  • GoodJ,可以开始安心学习Hadoop基础理论了🤓

在eclipse中直接读取Hadoop源码

最后

提示

  • 要记得在看不到文件时就刷新。

  • 注意配置的字母多少与大小。

  • 每一次在输出时要将参数中的 output 部分更改名字,以免冲突。

资源链接

---------------本文终---------------

文章作者:刘俊

最后更新:2019年01月02日 - 15:01

许可协议: 转载请保留原文链接及作者。