准备

前面我们已经编译好了 hadoop2.7.7,在 /opt/hadoop/hadoop-2.7.7/hadoop-dist/target/ 下 生成了 hadoop-2.7.7.tar.gz

首先我们创建一个 /opt/bigdata 目录,并修改所属为当前用户

1
2
sudo mkdir /opt/bigdata
sudo chown -R $USER:$GROUPS /opt/bigdata

将安装包复制到 /opt/bigdata/

1
cp /opt/hadoop/hadoop-2.7.7/hadoop-dist/target/hadoop-2.7.7.tar.gz /opt/bigdata/

解压安装包

1
2
cd /opt/bigdata/
tar -zxvf hadoop-2.7.7.tar.gz

配置环境变量

1
sudo vim /etc/profile

配置 HADOOP_HOME 变量,将 hadoopbin 目录加入到 PATH 变量中

1
2
export HADOOP_HOME=/opt/bigdata/hadoop-2.7.7
PATH=$PATH:$HADOOP_HOME/bin

前言

Hadoop 的集中安装模式

  1. 本地模式: Hadoop 本地模式只是用于本地开发调试,或者快速安装体验 Hadoop
  2. 伪分布式模式: 学习 Hadoop 一般是在伪分布式模式下进行。这种模式是在一台机器上各个进程上运行 Hadoop 的各个模块,伪分布式的意思是虽然各个模块是在各个进程上分开运行的,但是只是运行在一个操作系统上的,并不是真正的分布式。
  3. 完全分布式安装: 完全分布式模式才是生产环境采用的模式,Hadoop 运行在服务器集群上,生产环境一般都会做 HA,以实现高可用。
  4. HA 完全分布式: HA 是指高可用,为了解决 Hadoop 单点故障问题,生产环境一般都做 HA 部署。

不同模式安装的区分的依据是NameNodeDataNodeResourceManagerNodeManager 等模块运行在几个 JVM 进程、几个机器。

模式名称各个模块占用的 JVM 进程数各个模块运行在几个机器数上
本地模式1 个1 个
伪分布式模式N 个1 个
完全分布式模式N 个N 个
HA 完全分布式N 个N 个

本地模式也就是单机模式,本地模式是最简单的模式,所有模块都运行与一个JVM进程中,使用的本地文件系统,而不是HDFS,本地模式主要是用于本地开发过程中的运行调试用。

Linux 环境

前面编译hadoop到时候已经配置过JDK相关环境变量,下面我们直接运行hadoop自带的wordcount示例

首先创建一个 words 文件,

1
vim words

随机输入一些单词

1
2
3
4
java hadoop spark
python scala hive
hive hbase scala spark
java php spark hadoop

运行 hadoop 的 wordcount mapreduce 示例

1
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar wordcount words output

查看output 目录下生成了两个文件 part-r-00000_SUCCESS
_SUCCESS 说明运行成功了,我们查看 part-r-00000 的输出结果

1
2
3
4
5
6
7
8
hadoop	2
hbase 1
hive 2
java 2
php 1
python 1
scala 2
spark 3

Windows 环境

windows 需要配置 hadoop 环境,配置 HADOOP_HOME 环境变量
windows 环境需要 hadoop.dll 动态链接库, winutils.exe 文件。

关于这些文件,我们可以选择自己编译,也可以下载别人已经编译好的。
贴心的博主在github找到了已经编译好的hadoop2.7.7文件。

  • hadoop2.7.7 下载下来, 配置好环境 HADOOP_HOME 以及 PATH 变量。(可选)
  • 将 bin 目录下的 hadoop.dll 复制到 C:\Windows\System32 下。

windows我们直接使用 IDE 写一个 wordcount 示例运行。

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
/**
* Word Count
*/
public class WordCount {

static {
// 如果没有配置过 HADOOP_HOME 设置 property 也是可以的
System.setProperty("hadoop.home.dir","D:\\Program Files\\hadoop-2.7.7");
}


public static class WordCountMapper extends MapReduceBase implements Mapper<LongWritable, Text, Text, IntWritable> {

private final static IntWritable ONE = new IntWritable(1);
private Text text = new Text();

@Override
public void map(LongWritable key, Text value, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
String line = value.toString();
// 将字符串根据 , 进行切割
StringTokenizer tokenizer = new StringTokenizer(line);
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
if (StringUtils.isNotBlank(token)) {
text.set(token);
// 输出为 text:1 的格式
output.collect(text, ONE);
}
}
}
}

private static class WordCountReducer extends MapReduceBase implements Reducer<Text, IntWritable, Text, IntWritable> {

@Override
public void reduce(Text key, Iterator<IntWritable> values, OutputCollector<Text, IntWritable> output, Reporter reporter) throws IOException {
int sum = 0;
while (values.hasNext()) {
sum += values.next().get();
}
// 统计每个 text 出现的格式,输出格式为 key:sum
output.collect(key, new IntWritable(sum));
}
}




public static void main(String[] args) throws IOException {
JobConf conf = new JobConf(WordCount.class);
conf.setJobName("WordCount");
// 指定 MapTask 的输出类型
conf.setOutputKeyClass(Text.class);
conf.setOutputValueClass(IntWritable.class);
// 指定 Mapper 类
conf.setMapperClass(WordCountMapper.class);
// 指定 Combiner 类
conf.setCombinerClass(WordCountReducer.class);
// 指定 Reducer 类
conf.setReducerClass(WordCountReducer.class);
//指定输入/输出格式化类型
conf.setInputFormat(TextInputFormat.class);
conf.setOutputFormat(TextOutputFormat.class);
// 指定 MapReduce 程序数据的输入和输出路径
FileInputFormat.setInputPaths(conf, new Path("words"));
FileOutputFormat.setOutputPath(conf, new Path("output"));
JobClient.runJob(conf);
}
}

运行一下,看看结果。

我们再看一下输出目录 output

_SUCCESS 说明运行成功了,我们查看 part-00000 的输出结果。

1
2
3
4
5
6
7
8
hadoop	2
hbase 1
hive 2
java 2
php 1
python 1
scala 2
spark 3