如何在 Ubuntu 上安装配置 Hadoop

版本

  • JDK: 8u221
  • Hadoop: 3.1.2

下载

首先点击这里,进入 Hadoop 官网下载页面。

Hadoop下载页面

选择 3.0.3 版本进行下载,然后点击 binary 地址进行下载

Hadoop镜像选择页面

选中官方推荐的地址即可下载,其他地址也可用(建议采用迅雷等下载工具下载,速度比较会快很多,上传至 UBUNTU 系统)

或者使用 wget 命令进行下载

1
wget http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-3.1.2/hadoop-3.1.2.tar.gz

HOSTS

Hosts 是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的 IP 地址建立一个关联 “数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从 Hosts 文件中寻找对应的 IP 地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交 DNS 域名解析服务器进行 IP 地址的解析。

为了机器能够快速识别自己以及其他机器,我们可以做一下域名和 IP 的 hosts 映射,这样在之后的操作中,我们就可以直接用域名来代替 IP 地址

伪分布模式

使用 vi /etc/hosts 命令添加 master 映射,并修改 localhost

1
2
本机IP localhost
本机IP master

全分布模式

全分布模式下,需要你在每一台机器都设置好 hosts,例如我有三台机器,IP 分别为 192.168.0.1 192.168.0.2 192.168.0.3,那么 master 主节点机器的 hosts 内容就如下进行设置

1
2
3
4
5
192.168.0.1 localhost

192.168.0.1 master
192.168.0.2 slave1
192.168.0.3 slave2

方便计算机互相连接

SSH

简介

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

安装

Ubuntu 中一般默认安装了 ssh,如果没有安装,可以使用下面的命令进行安装

1
sudo apt-get install openssh-server

SSH安装

由于我的 Ubuntu 服务器已经安装好了 SSH,所以提示我无需安装。安装好后,我们需要启动一下 SSH 服务。

查看并启动 SSH

1
sudo ps -e | grep ssh

其中 ps -e 表示查看当前的进程,-e 表示显示全部,效果同 - A
grep sshgrep match_pattern,是正则表达式,它会获取包含 match_pattern 的文本段

查看ssh服务

当有类似如上结果显示时,表示服务器的 SSH 服务正在运行中。如果没有则需要启动 SSH 服务,可以运行下面的命令:

1
service ssh start

或者

1
service ssh restart

查看并修改 SSH 设置

SSH 的配置文件一般在 /etc/ssh/sshd_config

可以使用下面的命令编辑,或者使用 gedit 编辑

1
vi /etc/ssh/sshd_config

老版本的话,可能需要做如下修改才行。如果有 PermitRootLogin without-password, 加一个”#” 号,注释掉该行,并增加一句 PermitRootLogin yes

生成密钥对

使用下面的命令

1
ssh-keygen  -t rsa

该命令将在~/.ssh 目录下面产生一个密钥 id_rsa 和一个公钥 id_rsa.pub
将你的计算机 (A) 中的公钥传给别的计算机 (B),你才能免密码登录到计算机 B

免密登录本机

首先使用下面的命令,将公钥发放给自己

1
cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys

你可以进入 ~/.ssh/ 路径下,更方便的进行操作

需要查看 authorized_keys 文件的权限,需要保证是 600,

如果权限不正确,请使用下面的命令

1
chmod 600 authorized_keys

然后使用下面的命令,免密连接本机

1
ssh localhost

ssh免密登录

当有类似结果如上图所示,表示你已经可以成功免密登录了

全分布模式 (免密登录到别的计算机)

如果你需要登录到别的计算机,你需要将 id_rsa.pub 发送给别的电脑同样的路径,保存到 authorized_keys 文件中,如果对方计算机也要免密登录到你的计算机,也需要将它的 id_rsa.pub 发送到你的电脑同样的路径,保存到 authorized_keys 文件中

如果是多个计算机,比如三个(master slave1 slave2), 最方便的方法就是,每台计算机先运行 ssh-keygen -t rsa 生成 id_rsa.pub 文件,然后创建一个记事本,将 3 个 id_rsa.pub 文件中的内容都保存起来,然后重命名为 authorized_keys,然后使用下面 scp 命令,直接发放给每台计算机,发放时需要输入每天计算机密码,设置完毕后,再进行传输就不需要了

1
2
scp ~/.ssh/authorized_keys slave1:~/.ssh/authorized_keys
scp ~/.ssh/authorized_keys slave2:~/.ssh/authorized_keys

记得检查权限

环境配置

下载完毕后,使用下面的命令,将 hadoop 解压出来,并移动到合适的位置,我解压到了 /opt 目录下

1
tar -zxvf ./hadoop-3.1.2.tar.gz -C /opt

之后,需要配置以下的环境变量

使用 vi 命令编辑 vi /etc/profile,添加下面的环境变量

1
2
3
4
# HADOOP
export HADOOP_HOME=/opt/hadoop-3.1.2
export HADOOP_CONF_DIR=${HADOOP_HOME}/etc/hadoop
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH

添加完毕保存后,使用 source /etc/profile 更新环境变量

更新环境变量后,可以命令 hdfs 来检查环境变量是否配置成功

hdfs检查

当有类似的命令提示如上图所示,表示你已经成功配置好环境变量了

部署

hadoop 的部署分为 3 种模式,分别为单机模式 伪分布模式 (单节点) 全分布模式三种

无论部署哪种模式,我们都需要先配置环境变量,我们选择配置系统变量,无论是否是当前路径都可以使用

单机模式

如果你只是进行单节点运行,那么你现在已经完成安装了,不需要启动,可以直接进入测试环节

伪分布模式

首先打开 /opt/hadoop-3.2.0/etc/hadoop 这个目录,分别编辑下面几个文件,根据个人需求更改参数:

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
# 配置hdfs的namenode的地址,使用的是hdfs协议
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
# 配置hadoop运行时产生数据的存储目录,不是临时目录
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/tmp</value>
</property>
</configuration>

master 在 hosts 文件中做了映射,可以替换成本机 IP

hadoop 有时候并不能自己创建 namenode 和 datanode 文件夹,可以运行下面的命令手动创建这 2 个文件夹

1
2
3
mkdir -p /opt/data/namenode
mkdir -p /opt/data/datanode
mkdir -p /opt/tmp

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
# 配置在hdfs中,一份文件存几份,默认是3份,一台机器只能存一份,伪分布设置为1
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
# 是否打开权限检查系统
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
# 命名空间和事务在本地文件系统永久存储的路径
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/namenode</value>
</property>
# DataNode在本地文件系统中存放块的路径
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/datanode</value>
</property>
</configuration>

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
# 指定yarn的resourcemanager的地址(该地址是resourcemanager的主机地址,即主机名或该主机的ip地址)
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
# 指定mapreduce执行shuffle时获取数据的方式
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<configuration>
# 指定mapreduce运行在yarn上
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop-3.1.2</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop-3.1.2</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/hadoop-3.1.2</value>
</property>
</configuration>

hadoop-env.sh

在任意地方添加 JAVA_HOME

1
export JAVA_HOME=你的JDK安装地址

所有配置文件修改完毕后,进入 hadoop 初始化步骤

全分布模式

首先打开 /opt/hadoop-3.2.0/etc/hadoop 这个目录,分别编辑下面几个文件,根据个人需求更改参数:

core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
# 配置hdfs的namenode的地址,使用的是hdfs协议
<property>
<name>fs.defaultFS</name>
<value>hdfs://master:9000</value>
</property>
# 配置hadoop运行时产生数据的存储目录,不是临时目录
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/tmp</value>
</property>
</configuration>

master 在 hosts 文件中做了映射,可以替换成本机 IP

hadoop 有时候并不能自己创建 namenode 和 datanode 文件夹,可以运行下面的命令手动创建这 2 个文件夹

1
2
3
mkdir -p /opt/data/namenode
mkdir -p /opt/data/datanode
mkdir -p /opt/tmp

hdfs-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<configuration>
# 配置在hdfs中,一份文件存几份,默认是3份,一台机器只能存一份,小于datanode数量
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
# 是否打开权限检查系统
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
# 命名空间和事务在本地文件系统永久存储的路径
<property>
<name>dfs.namenode.name.dir</name>
<value>/opt/data/namenode</value>
</property>
# DataNode在本地文件系统中存放块的路径
<property>
<name>dfs.datanode.data.dir</name>
<value>/opt/data/datanode</value>
</property>
</configuration>

如果你只有 3 个 datanode,但是你却指定副本数为 4,是不会生效的,因为每个 datanode 上只能存放一个副本。

yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
<configuration>
# 指定yarn的resourcemanager的地址(该地址是resourcemanager的主机地址,即主机名或该主机的ip地址)
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
# 指定mapreduce执行shuffle时获取数据的方式
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

mapred-site.xml

1
2
3
4
5
6
7
<configuration>
# 指定mapreduce运行在yarn上
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>

workers

1
2
3
master
slave1
slave2

老版本文件名为 slaves,配置的是所有的从节点,用 IP 也可以,所有配置文件修改完毕后,进入 hadoop 初始化步骤

Hadoop 初始化

允许 root 账户运行

使用下面的命令进入 hadoop 脚本路径

1
cd $HADOOP_HOME/sbin/

使用 vi 编辑 start-dfs.shstop-dfs.sh 添加

1
2
3
4
HDFS_DATANODE_USER=root 
HDFS_DATANODE_SECURE_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

使用 vi 编辑 start-yarn.shstop-yarn.sh 添加

1
2
3
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

hdfs 初始化

伪分布模式

然后使用下面的命令初始化 hdfs

1
hdfs namenode -format

hdfs检查

格式化完毕后,如图所示,则表示初始化成功,如果初始化失败,需要用下面的命令手动清空 namenode 和 datanode 文件夹,调整配置后,重新初始化

1
2
rm -rf /opt/data/namenode/*
rm -rf /opt/data/datanode/*

全分布模式

集群模式下,不能能只在主机进行 hdfs 初始化,还需要到每一台机子中运行下面的命令进行 hdfs 初始化

1
hdfs namenode -format

启动 Hadoop

伪分布模式

初始化完毕后,我们就可以使用下面的命令启动 hadoop 了

1
start-yarn.sh & start-dfs.sh

JPS

启动完毕后可以使用 jps 命令查看启动的 hadoop 进程

hadoop运行图

可以访问 http://master:8088 查看所有任务的运行情况

hadoop运行图

可以访问 http://master:9870 查看 Hadoop 集群运行情况

至此整个 hadoop 就搭建好了

全分部模式

Namenode

1
2
3
hdfs --daemon start namenode
hdfs --daemon stop namenode
hdfs --daemon restart namenode

Datanode

1
2
3
hdfs --daemon start datanode
hdfs --daemon stop datanode
hdfs --daemon restart datanode

你可以使用上面的命令挨个启动 namenode 和 datanode,如果已配置好 workers 和 ssh 免密登录,你可以使用下面的命令调用脚本直接启动所有 hdfs 进程

1
start-dfs.sh

ResourceManager

1
2
3
yarn --daemon start resourcemanager
yarn --daemon stop resourcemanager
yarn --daemon restart resourcemanager

NodeManager

1
2
3
yarn --daemon start nodemanager
yarn --daemon stop nodemanager
yarn --daemon restart nodemanager

你可以使用上面的命令挨个启动 resourcemanager 和 nodemanager,如果已配置好 workers 和 ssh 免密登录,你可以使用下面的命令调用脚本直接启动所有 yarn 进程

1
start-yarn.sh

案例测试

词频统计

可以使用下面的命令进行一个 wordcount 的测试程序 (命令已进行版本兼容,不需要修改直接运行即可)

1
2
3
mkdir input
cp $HADOOP_HOME/*.txt input
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar wordcount input output

之后通过 ls 查看当前目录下的文件

单机模式测试结果

使用下面的命令可查看词频统计的结果

1
cat output/part-r-00000

单机模式词频统计结果

当有类似的结果如上图所示,表示你已经成功搭建好了 hadoop 单机模式,并测试成功

PI 值计算

我们可以使用一个简单的例子来测试一下 hadoop 是否能够正常运行

我们从 hadoop 安装文件夹,启动一个终端,使用下面的命令,计算 pi 值

1
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar pi 10 10

hadoop pi值计算

如图所示,我们计算量比较少导致不够精确,但是已经可以成功运算出 pi 值了