简介
0.准备工作
由于 Hadoop 是基于 Java 进行开发的,因此我们需要安装与其 version 相匹配的 JRE 和 JDK。目前, Apache Hadoop 3.x 的版本已经完全支持 Java 8。由于 Ubuntu 的 OpenJDK 8 同时包含了 JRE 和 JDK,因此我们只需要下面的命令就可以将它们同时安装:
# 升级 apt
sudo apt update
# 安装与 Hadoop 3.2.2 相匹配的 openjdk-8
sudo apt install openjdk-8-jdk -y
安装完毕后,使用如下命令确认安装是否成功:
# 确认 java 版本是否正确
java -version; javac -version
由于Hadoop集群是通过ssh进行通讯的,为保证其顺利运行,我们需要安装 OpenSSH 的客户端和服务端。
# 安装 Openssh
sudo apt install openssh-server openssh-client -y
1.创建Non-root用户Hadoop
【注意:必须正确配置hadoop用户的ssh】
我们需要创建一个新的系统用户 hadoop ,并使用该用户安装并配置 hadoop。这样做的原因是将 hadoop 相关组件和进程与 root 用户隔离,从而保证系统运行更加安全,维护更加高效。
使用 adduser 创建新系统用户:
# 创建 hadoop 用户
sudo adduser hadoop
切换至 hadoop 用户,并设置密码:
# 切换至 hadoop 用户并设置密码
su - hadoop
【注意:下述操作都将切换至 hadoop 身份进行】
为保证 Hadoop 的顺利运行,我们需要为 hadoop 用户建立无需密码的 ssh 连接。
首先,我们需要通过 ssh-keygen 生成公钥和密钥 (密钥创建的过程全部输入回车即可):
# 我们将在 ~/.ssh/ 目录下存放创建好的密钥
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
其次,我们使用 cat 命令将刚刚生成的无密码密钥的公钥写入 authorized_key 文件中:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
最后,更改 authorized_key 以确保安全性:
chmod 0600 ~/.ssh/authorized_keys
至此,hadoop 用户的 ssh 就配置完毕了。我们可以使用如下命令来验证 ssh 的配置是否成功:
ssh localhost
现在,hadoop 用户可以不需要任何密码即通过 ssh 连接到 localhost 了。
2.下载Hadoop安装包并安装 (国内需使用清华大学镜像站)
【注意:由于国内装机速度非常缓慢,因此需要使用国内的镜像源下载安装包】
我们可以通过 Apache 官网或者清华大学镜像站下载到 Hadoop 的安装包。由于我们在国内,因此从清华大学镜像站下载将是最优选择。
在 hadoop 家目录使用 wget 命令下载 hadoop 安装包:
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.2/hadoop-3.2.2.tar.gz
当压缩文件下载完毕后,使用如下命令解压:
tar xzf hadoop-3.2.2.tar.gz
至此,hadoop 的全部相关文件就被成功解压至 hadoop-3.2.2/ 目录下。
3.配置单节点(伪分布式)Hadoop 集群
3.1 单节点伪分布式集群的配置
【注意:各个配置文件需配置正确,且单节点的配置和真正分布式的配置差异极大,如果考虑使用真分布式,则需要配合Zookeeper另行配置】
【注意:当配置文件较为复杂时,需要使用Zookeeper进行各个节点上配置文件的管理工作】
在这一部分我们来配置单节点的 Hadoop 集群。这种部署方式又被称为 “伪分布式” Hadoop 部署方式,主要用于熟悉 Hadoop 的基本命令和特性,或进行数据处理的实验。在正式的生产环境中不推荐使用这种方式进行部署。
在部署 Hadoop 集群时,如下几个文件是非常重要的,我们之后会对其一一进行配置:
- .bashrc
- hadoop-env.sh
- core-site.xml
- hdfs-site.xml
- mapred-site-xml
- yarn-site.xml
配置环境变量:
使用 vim 打开位于家目录的 .bashrc 文件:
sudo vim .~/bashrc
将光标移动至文件最末端,键入 i 键加入如下内容至文件,并输入 Esc + wq 保存并退出。
# Hadoop Related Options
export HADOOP_HOME=/home/hdoop/hadoop-3.2.1
export HADOOP_INSTALL=$HADOOP_HOME
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib/nativ"
在将上述内容写入 ~/.bashrc 后,使用如下命令更新操作系统的运行环境:
source ~/.bashrc
配置 hadoop-env.sh
hadoop-env.sh 是一个至关重要的文件,它用于配置 YARN,HDFS,MapReduce,以及和 Hadoop 相关的各种设置。
在单节点的模式下,我们只需要配置与 Hadoop 相匹配的 Java 版本即可。由于我们使用的是 Hadoop 3.2.2 ,因此我们需要 JAVA8 与之相匹配。
使用如下命令打开 hadoop-env.sh
sudo vim $HADOOP_HOME/etc/hadoop/hadoop-env.sh
将我们机器上的 OpenJDK 的完整路径写入 相应位置:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
Tips: 如果安装其他版本的 Hadoop 或者需要定位 Java 路径的正确位置,可以使用如下命令:
# 定位 Java 的位置,可以从输出看到 Java 编译器的位置
which javac
# 使用下面的命令定位 OpenJDK 的目录位置。
# 路径内容至 /bin/javac 之前的部分应该被配置到 $JAVA_HOME 变量中
readlink -f /usr/bin/javac
配置 core-site.xml
core-site.xml 定义了 HDFS 和 Hadoop 的核心特性。
为了设置单节点的 Hadoop 集群,我们需要指定 NameNode 的 URL,以及指定用于存放 MapReduce 临时信息的缓存路径。
使用如下命令打开 core-site.xml:
sudo vim $HADOOP_HOME/etc/hadoop/core-site.xml
将下面的内容添加至文件中。关于其他配置项的各种信息,可以查看 Apache Hadoop 文档进行更精细的配置。注意,fs.default.name 中我们的设置项为 0.0.0.0 ,这代表位于互联网上的任何机器都可以访问我们的 Hadoop 集群。如果进行更安全的配置需要指定哪些主机有权利访问。
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/tmpdata</value>
</property>
<property>
<name>fs.default.name</name>
<value>hdfs://0.0.0.0:9000</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.groups</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.hadoop.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.server.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.server.groups</name>
<value>*</value>
</property>
</configuration>
配置 hdfs-site.xml
hdfs-site.xml 的配置项用于管理每个节点元数据的存储位置,fsimage 文件以及集群日志。在单节点的模式下,我们可以将冗余存储的数量由 3 改为 1 ,以节省存储空间。
使用如下命令打开 hdfs-site.xml:
sudo vim $HADOOP_HOME/etc/hadoop/hdfs-site.xml
将如下配置粘贴至文件中。如有需要,可以自行调整 NameNode 和 DataNode 的目录位置。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
--><!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/dfsdata/namenode</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/hadoop/dfsdata/datanode</value>
</property>
<property>
<name>dfs.replication</name>
<value>1</value>
</property></configuration>
配置 mapred-site.xml
该文件主要与 MapReduce 的相关工作有关。
sudo vim $HADOOP_HOME/etc/hadoop/mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
--><!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property></configuration>
配置 yarn-site.xml
该文件主要用于定义与 YARN 有关的配置项。 它包括了定义 NodeManager, Resource Manager, Containers, 以及 Application Master。
sudo vim $HADOOP_HOME/etc/hadoop/yarn-site.xml
<?xml version="1.0"?>
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
--><!-- Site specific YARN configuration properties -->
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>127.0.0.1</value>
</property>
<property>
<name>yarn.acl.enable</name>
<value>0</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PERPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>
4.格式化 Hdfs NameNode
在首次运行 Hadoop 服务之前,需要通过如下命令格式化 NodeNode 节点:
hdfs namenode -format
输入命令后,看到如下输出表示 NameNode 的格式化工作成功。
5.启动 Hadoop 集群
进入 hadoop-3.2.2/sbin 目录并执行如下命令启动 NameNode 和 DataNode:
cd /home/hadoop/hadoop-3.2.2/sbin
./start-dfs.sh
在上述服务成功运行后,启动 yarn 的相关组件:
./start-yarn.sh
当全部服务启动后,使用 jps 命令查看各个服务的运行状态。如果全部服务都正常运行(如下图所示),则证明单节点 Hadoop 的启动成功。
jps
6.验证集群是否启动成功 (通过浏览器+代码确认)
现在,我们可以通过浏览器访问相应服务的端口来查看服务的启动情况了:
从浏览器访问如下 url 即可查看各个服务的运行情况。
Hadoop Namenode UI:
DataNode 运行情况:
Yarn 资源管理服务: