快速部署Hadoop单主集群

简介

  • Hadoop: 1个使用Java编写的Apache开放源代码框架,它允许使用简单的编程模型跨大型计算机的大型数据集进行分布式处理。
  • 基于Hadoop框架工作的应用程序可以在跨计算机群集提供分布式存储和计算的环境中工作。
  • Hadoop旨在从单一服务器扩展到数千台机器,每台机器都提供本地计算和存储。

环境

网址

  • Hadoop《传送门》
  • JDKHadoop的兼容性:《传送门》
  • 官方教程:《传送门》
  • NTP服务:《传送门》

版本

  • OSCentOS 7.7Ubuntu 16.04
  • JDK1.8
  • Hadoop3.2.1

架构

  • Hadoop框架包括以下5个模块:
    • Hadoop Common:支持其他Hadoop模块的通用Java库和实用程序,并包含启动HadoopJava文件和脚本。
    • Hadoop Distributed File SystemHDFS,提供对应用程序数据的高吞吐量访问的分布式文件系统。
    • Hadoop YARN:用于作业调度和集群资源管理的框架。
    • Hadoop MapReduce:基于YARN的大型数据集并行处理系统。
    • Hadoop OzoneHadoop的对象存储。
  • Hadoop的框架最核心的设计:
    • HDFS:为海量的数据提供了存储。
    • MapReduce:为海量的数据提供了计算能力。

应用场景

  • 大数据量存储:分布式存储(云存储)。
  • 海量计算:并行计算。
  • ETL:数据抽取到OracleMysqlDB2MongDB及主流数据库。
  • 数据分析:可以基于HadoopHBase构建实时数据分析系统。

目标

  • Hadoop 3.X目前仅支持JDK 8,从Hadoop 3.3开始将支持JDK 11
  • 本文介绍了如何部署和配置Hadoop单主集群,范围从几个节点到具有数千个节点的超大型集群。

节点

IP 角色 服务
172.18.20.3 Master NodeManagerDataNodeResourceManagerNameNodeSecondaryNameNode
172.18.20.4 Worker NodeManagerDataNode
172.18.20.5 Worker NodeManagerDataNode

部署

基础

CentOS

  • 关闭SELinux
1
2
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  • 关闭防火墙:
1
2
systemctl stop firewalld.service
systemctl disable firewalld.service

Common

  • 修改主机名:
1
echo "cluster-hadoop-01" > /etc/hostname
  • 内部解析:
1
2
3
4
echo '127.0.0.1 localhost' > /etc/hosts
echo '172.18.20.3 cluster-hadoop-01' >> /etc/hosts
echo '172.18.20.4 cluster-hadoop-02' >> /etc/hosts
echo '172.18.20.5 cluster-hadoop-03' >> /etc/hosts
  • 提示符:
1
echo 'export PS1="\u@\[\e[1;93m\]\h\[\e[m\]:\w\\$\[\e[m\] "' >> /root/.bashrc
  • 添加用户:
1
2
groupadd -r -f hadoop && useradd -r -g hadoop -G sudo -m hadoop -s /bin/bash
echo "hadoop:hadoop" | chpasswd
  • 免密通信:
1
2
3
ssh-keygen -t rsa -P "" -C "Hadoop" -f '/root/.ssh/id_rsa' >/dev/null 2>&1
echo "" >> /root/.ssh/authorized_keys
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
1
2
3
rm -rf /home/hadoop/.ssh/
cp -ar /root/.ssh /home/hadoop/
chown -R hadoop:hadoop /home/hadoop

NTP

  • 为保证集群内时间同步,我们需要安装NTP服务。

CentOS

1
yum install -y chrony
  • 更新配置文件:
1
vim /etc/chrony.conf

Ubuntu

1
apt install -y chrony
  • 更新配置文件:
1
vim /etc/chrony/chrony.conf

Common

  • 文件内容:
1
2
3
4
5
6
7
8
# Master: cluster-hadoop-01
server 0.cn.pool.ntp.org iburst
server 1.cn.pool.ntp.org iburst
server 2.cn.pool.ntp.org iburst
server 3.cn.pool.ntp.org iburst

# Worker: cluster-hadoop-02、cluster-hadoop-03
server cluster-hadoop-01 iburst
  • 更改时区:
1
2
echo "Asia/Shanghai" > /etc/timezone
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  • 重启服务:
1
2
3
4
5
6
# Ubuntu
service chrony restart

# CentOS
systemctl enable chronyd.service
systemctl start chronyd.service

JDK

  • 依照JDKHadoop的兼容性,从Oracle下载最新版本的JDK二进制文件。
  • 参考《Linux上安装JDK》,完成JDK的安装。

Hadoop

  • 依照JDKHadoop的兼容性,从Apache下载最新版本的Hadoop二进制文件。
  • 解压到指定目录:
1
tar -zxvf hadoop-3.2.1.tar.gz -C /opt/
  • 创建软连接:
1
ln -sf /opt/hadoop-3.2.1 /opt/hadoop
  • 环境变量:
1
2
3
4
5
echo '' >> /etc/profile
echo '# Hadoop Home' >> /etc/profile
echo 'export HADOOP_HOME="/opt/hadoop"' >> /etc/profile
echo 'export PATH="${PATH}:${HADOOP_HOME}/bin"' >> /etc/profile
source /etc/profile
  • 获取版本信息:
1
hadoop version
  • 更改目录权限:
1
2
chown -R hadoop:root /opt/hadoop
chown -R hadoop:root /opt/hadoop-3.2.1

单主集群模式

  • 单主集群模式:1Master节点和2Worker节点,暂不考虑Master的高可用。

Master

  • 创建工作目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# PID目录
mkdir -p /var/run/hadoop
chown hadoop:hadoop /var/run/hadoop
chmod -R 774 /var/run/hadoop
echo 'd /var/run/hadoop 0774 hadoop hadoop' > /usr/lib/tmpfiles.d/hadoop.conf

# 日志目录
mkdir -p /var/log/hadoop
chown hadoop:hadoop /var/log/hadoop
chmod -R 774 /var/log/hadoop
echo 'd /var/log/hadoop 0774 hadoop hadoop' >> /usr/lib/tmpfiles.d/hadoop.conf

# 数据目录
mkdir -p /data/hadoop
chown hadoop:hadoop /data/hadoop
chmod -R 774 /data/hadoop
echo 'd /data/hadoop 0774 hadoop hadoop' >> /usr/lib/tmpfiles.d/hadoop.conf
  • 切换到hadoop用户:
1
su - hadoop
  • 编辑core-site.xml
1
vim /opt/hadoop/etc/hadoop/core-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster-hadoop-01:9000</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>131072</value>
<description>在序列中使用的缓冲区大小</description>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/hadoop/tmp</value>
<description>其它临时目录的根目录</description>
</property>
</configuration>
  • 编辑hdfs-site.xml
1
vim /opt/hadoop/etc/hadoop/hdfs-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>dfs.replication</name>
<value>2</value>
<description>副本数,HDFS存储时的备份数量</description>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/data/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/data/hadoop/hdfs/data</value>
</property>
</configuration>
  • 编辑mapred-site.xml
1
vim /opt/hadoop/etc/hadoop/mapred-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>执行框架设置为Hadoop YARN</description>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>${HADOOP_MAPRED_HOME}/share/hadoop/mapreduce/*:${HADOOP_MAPRED_HOME}/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
  • 编辑yarn-site.xml
1
vim /opt/hadoop/etc/hadoop/yarn-site.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>

<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>cluster-hadoop-01</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address</name>
<value>172.18.20.3:8088</value>
</property>
</configuration>
  • 编辑workers
1
vim /opt/hadoop/etc/hadoop/workers
1
2
3
cluster-hadoop-01
cluster-hadoop-02
cluster-hadoop-03
  • 配置hadoop-env.sh
1
2
3
4
5
6
7
8
echo 'export JAVA_HOME="/opt/jdk"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export HDFS_NAMENODE_USER="hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export HDFS_DATANODE_USER="hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export HDFS_SECONDARYNAMENODE_USER="hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export YARN_RESOURCEMANAGER_USER="hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export YARN_NODEMANAGER_USER="hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export HADOOP_PID_DIR="/var/run/hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
echo 'export HADOOP_LOG_DIR="/var/log/hadoop"' >> /opt/hadoop/etc/hadoop/hadoop-env.sh
  • 格式化文件系统:
1
hdfs namenode -format
  • 拷贝Hadoop到其他节点:
1
2
rsync -azPS --delete /opt/hadoop-3.2.1 cluster-hadoop-02:/opt/
rsync -azPS --delete /opt/hadoop-3.2.1 cluster-hadoop-03:/opt/

Worker

  • 创建工作目录:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# PID目录
mkdir -p /var/run/hadoop
chown hadoop:hadoop /var/run/hadoop
chmod -R 774 /var/run/hadoop
echo 'd /var/run/hadoop 0774 hadoop hadoop' > /usr/lib/tmpfiles.d/hadoop.conf

# 日志目录
mkdir -p /var/log/hadoop
chown hadoop:hadoop /var/log/hadoop
chmod -R 774 /var/log/hadoop
echo 'd /var/log/hadoop 0774 hadoop hadoop' >> /usr/lib/tmpfiles.d/hadoop.conf

# 数据目录
mkdir -p /data/hadoop
chown hadoop:hadoop /data/hadoop
chmod -R 774 /data/hadoop
echo 'd /data/hadoop 0774 hadoop hadoop' >> /usr/lib/tmpfiles.d/hadoop.conf

Master

  • 启动HDFS
1
/opt/hadoop/sbin/start-dfs.sh
  • Master节点查询进程状态:
1
2
# NameNode、DataNode、SecondaryNameNode
jps
  • Worker节点查询进程状态:
1
2
# DataNode
jps
  • 启动YARN
1
/opt/hadoop/sbin/start-yarn.sh
  • Master节点查询进程状态:
1
2
# NameNode、DataNode、SecondaryNameNode、ResourceManager、NodeManager
jps
  • Worker节点查询进程状态:
1
2
# DataNode、NodeManager
jps

实战

Web

HDFS

  • 访问地址:https://<External IP>:9870
  • 获取HDFS的概要:
  • 获取DataNode(数据节点)的信息:
  • 查看HDFS文件系统:
  • 此时由于未上传文件,所以文件系统为空:

YARN

  • 访问地址:https://<External IP>:8088
  • 管理界面:

集群维护

Master

  • 启动所有服务:
1
/opt/hadoop/sbin/start-all.sh
  • 停止所有的服务:
1
/opt/hadoop/sbin/stop-all.sh

功能测试

  • 切换到hadoop用户:
1
su - hadoop
  • 设置执行MapReduce作业所需的HDFS目录:
1
hdfs dfs -mkdir -p /user/hadoop
  • 上传本地文件到HDFS文件系统中:
1
2
hdfs dfs -mkdir input
hdfs dfs -put /opt/hadoop/etc/hadoop/*.xml input
  • 查看HDFS文件系统:
  • 执行作业:
1
hadoop jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'
  • 检查分布式文件系统中的输出文件:
1
hdfs dfs -cat output/*

请作者喝瓶肥宅快乐水