文章目录
- 一、Hadoop集群简介
- 二、Hadoop部署方式
- 三、Hadoop源码编译
- 四、使用Docker编译Hadoop
-
- 4.1软件下载
- 4.2创建Dockerfile文件
- 4.3创建脚本
- 4.4构建镜像、容器
- 4.5编译Hadoop
- 五、Hadoop集群安装
-
- 5.1集群角色规划
- 5.2 服务器基础环境准备
- 5.3上传安装包、解压安装包
- 5.4安装包目录结构
- 5.5编辑Hadoop配置文件
- 5.6分发同步安装包
- 5.7配置Hadoop环境变量
- 5.8NameNode format(格式化操作)
- 六、Hadoop集群启动
-
- 6.1手动逐个进程启停
- 6.2shell脚本一键启停
一、Hadoop集群简介 Hadoop的核心组件
- Hadoop HDFS(分布式文件存储系统):解决海量数据存储
- Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
- Hadoop MapReduce(分布式计算框架):解决海量数据计算

文章图片
- 逻辑上分离:两个集群互相之间没有依赖、互不影响。
- 物理上在一起:某些角色进程往往部署在同一台物理服务器上。
- MapReduce是计算框架、代码层面的组件,没有集群之说。
文章图片

文章图片
三、Hadoop源码编译 安装包、源码包下载地址:https://archive.apache.org/dist/hadoop/common/
为什么需要编译Hadoop源码?
- 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so | *.dll)
- 修改源码、重构源码(加入Hadoop的相关依赖)
BUILDING.txt
文件所描述的内容,编译Hadoop需要的环境如下:
文章图片
由图可知,编译Hadoop源码所需的环境较为复杂,此处我们使用Docker容器化技术来构建一个满足编译Hadoop的环境。好处如下:
- 容器内部的环境与主机的环境相互隔离,避免主机安装过多软件
- 容器中的环境可以反复使用,同时相应的Dockerfile文件也可以迁移到其他具有Docker的主机上进行快速搭建环境。
Hadoop版本:3.1.4
Docker版本:1.4.1及以上
安装Docker的步骤可以参考我的另一篇博客:《初识Docker》
4.1软件下载 ①不编译native code和documentation
Create binary distribution without native code and without documentation:
mvn package -Pdist -DskipTests -Dtar -Dmaven.javadoc.skip=true
该情况下,仅需安装JDK 1.8,Maven 3.3 or later,ProtocolBuffer 2.5.0即可。
②编译native code和documentation
Create binary distribution with native code and with documentation:
mvn package -Pdist,native,docs -DskipTests -Dtar
除JDK 1.8,Maven 3.3 or later,ProtocolBuffer 2.5.0,还需要安装CMake 3.1 or newer,snappy。
详细内容可以参照源码包当中的
BUILDING.txt
文件。- JDK下载地址:https://www.oracle.com/java/technologies/downloads/#java8
- Maven下载地址:https://maven.apache.org/download.cgi
- CMake下载地址:https://cmake.org/download/
- ProtocolBuffer下载地址:https://developers.google.cn/protocol-buffers/docs/downloads
- Snappy下载地址:https://src.fedoraproject.org/repo/pkgs/snappy/
4.2创建Dockerfile文件 软件的版本如下:
- JDK1.8
- CMake-3.23.2
- snappy-1.1.3
- Maven-3.5.4

文章图片
基于Centos7镜像,创建一个新的包含Hadoop编译所需环境的镜像。Dockerfile文件中的代码如下:
# 镜像来源(上面生成的本地镜像)
FROM centos:7#定义变量
#定义工作目录
ARG work_dir=/export/software
#定义手动的软件所在的目录
ARG software_dir=./software#目录挂载(将本地操作系统内的软件同步至容器中)
VOLUME ./software:$work_dir# 定义进入容器的默认目录
WORKDIR $work_dir# 配置 yum 源为 阿里源
# 安装编译 hadoop 所需的工具,清理安装包和缓存
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo# 复制 tar 包到镜像内
# 压缩包的名字根据个人下载的情况而定
ADD $software_dir/jdk-8u65-linux-x64.tar.gz $work_dir
ADD $software_dir/apache-maven-3.5.4-bin.tar.gz $work_dir
ADD $software_dir/cmake-3.23.2.tar.gz $work_dir
ADD $software_dir/protobuf-2.5.0.tar.gz $work_dir
ADD $software_dir/snappy-1.1.3.tar.gz $work_dir
ADD $software_dir/hadoop-3.1.4-src.tar.gz $work_dir# 复制编辑脚本文件到镜像中
COPY ./start.sh $work_dir
COPY ./config.sh $work_dir
COPY ./compile.sh $work_dir
# # 设置脚本文件的可运行权限
RUN chmod +x $work_dir/config.sh
RUN chmod +x $work_dir/compile.sh# 整个脚本,让他睡十年
# docker 容器想要在后台常驻,需要有一个前台常驻进程
RUN chmod +x$work_dir/start.sh
CMD ["/usr/bin/bash","$work_dir/start.sh"]
# 每次进入容器更新其中的环境变量
ENTRYPOINT ["source","/etc/profile"]
4.3创建脚本 创建
start.sh
,该脚本的功能是让容器中一直存在一个线程,不至于容器启动后就自动终止。# 一直睡眠,保证容器不会挂掉
/usr/bin/sleep 315360000
创建
config.sh
,该脚本文件的功能是在容器中下载相关依赖,同时编译安装上述的软件(已经挂载至容器),配置环境变量。#!/bin/bash# 安装编译依赖
yum install -ygcc gcc-c++ make && \
autoconf automake libtool curl lzo-devel zlib-devel openssl* ncurses-devel && \
snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop libXtst# 定义工作目录
work_dir="/export/software"# 手动安装cmake
#yum卸载已安装cmake 版本低
yum erase cmake
#编译安装
cd $work_dir/cmake-3.23.2
./configure
make && make install# 手动安装snappy
#卸载已经安装的
cd /usr/local/lib
rm -rf libsnappy*
#编译安装
cd $work_dir/snappy-1.1.3
./configure
make && make install# 手动安装ProtocolBuffer
#编译安装
cd $work_dir/protobuf-2.5.0
./configure
make && make install#配置工作目录
echo "work_dir=/export/software" >> /etc/profile#配置JAVA环境
echo "export JAVA_HOME=$work_dir/jdk1.8.0_65
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
" >> /etc/profile#配置MAVEN环境
echo "export MAVEN_HOME=$work_dir/apache-maven-3.5.4
export MAVEN_OPTS='-Xms2G -Xmx4096m'
export PATH=:$MAVEN_HOME/bin:$PATH
" >> /etc/profile#配置CMAKE环境
echo "export CMAKE_HOME=$work_dir/cmake-3.23.2" >> /etc/profile#更新环境变量
source /etc/profile#查看安装结果
cmake -version
ls -lh /usr/local/lib |grep snappy
protoc --version
java -version
mvn -v
创建
compile.sh
,该脚本文件的功能是在搭建好环境之后,一键编译。#版本号可以手动传参
version=${1:-3.1.4}
#定义工作目录
work_dir="/export/software"# 进入源代码目录
cd $work_dir/hadoop-$version-src# 开始编译
echo -e "\n\ncompile hadoop $version..."
mvn clean package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/lib# 输出结果
if [[ $? -eq 0]];
then
echo -e "\n\ncompile hadoop $version success!\n\n"
else
echo -e "\n\ncompile hadoop $version fail!\n\n"
4.4构建镜像、容器 使用如下命令创建镜像:
docker build -t centos7-hadoop-compiler .
结果如图所示:

文章图片
使用如下命令以交互式的方式进入容器:
docker run -it --name hadoop-compiler 容器的id /bin/bash
结果如下图所示:

文章图片
我们可以看到挂载至容器内部的软件已经自动解压过了。
4.5编译Hadoop 脚本的执行顺序:
bash config.sh
bash compile.sh
会执行比较长的时间。。。。。。。。。。。。。。。。。大约一小时。

文章图片
编译后的文件在:/export/software/hadoop-3.1.4-src/hadoop-dist
编译成功后,拷贝编译好的包到宿主机,要先退出当前镜像,或者新开一个shell进程。
exit
docker cp 容器id:/export/software/hadoop-3.1.4-src/hadoop-dist/hadoop-3.1.4.tar.gz /export
最后在宿主机中查看文件

文章图片
五、Hadoop集群安装 5.1集群角色规划 角色规划的准则
- 根据软件工作特性和服务器硬件资源情况合理分配
- 比如依赖内存工作的NameNode是不是部署在大内存机器上?
- 资源上有抢夺冲突的,尽量不要部署在一起
- 工作上需要互相配合的。尽量部署在一起
服务器 | 运行角色 |
---|---|
node1 | namenode datanode resourcemanager nodemanager |
node2 | secondarynamenode datanode nodemanager |
node3 | datanode nodemanager |
cat /etc/hostname
#node1.localadmin
hostname
node1.localadmin
Hosts映射(所有机器)
vim /etc/hosts
# 主机ip地址 node1 hostname名称
192.168.277.151 node1 node1.localadmin
192.168.277.152 node2 node2.localadmin
192.168.277.153 node3 node3.localadmin
……
防火墙关闭(所有机器)
systemctl stop firewalld.service#关闭防火墙
systemctl disable firewalld.service #禁止防火墙开启自启
ssh免密登录(至少需要node1打通其他所有节点)
ssh-keygen #4个回车 生成公钥、私钥
ssh-copy-id node1、ssh-copy-id node2、ssh-copy-id node3 #
集群时间同步(所有机器)
yum -y install ntpdate
ntpdate ntp4.aliyun.com
JDK1.8安装(所有机器)
java -version
#java version "1.8.0_65"
#Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
#Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
5.3上传安装包、解压安装包 创建统一工作目录(所有机器)
mkdir -p /export/server/#软件安装路径
mkdir -p /export/data/#数据存储路径
mkdir -p /export/software/#安装包存放路径
上传、解压安装包(Node1)
hadoop-3.1.4.tar
tar -zxvf hadoop-3.1.4.tar -C /export/server/
5.4安装包目录结构

文章图片
5.5编辑Hadoop配置文件 配置文件hadoop-env.sh
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim hadoop-env.sh# hadoop-env.sh
#配置JAVA_HOME
export JAVA_HOME=/export/server/jdk1.8.0_65
#设置用户以执行对应角色shell命令
export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root
配置文件lcore-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim core-site.xml
fs.defaultFS
hdfs://Node1的hostname:8020
hadoop.tmp.dir
/export/data/hadoop-3.1.4
hadoop.http.staticuser.user
root
配置文件hdfs-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim hdfs-site.xml
dfs.namenode.secondary.http-address
Node2的hostname:9868
配置文件mapred-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim mapred-site.xml
mapreduce.framework.name
yarn
yarn.app.mapreduce.am.env
HADOOP_MAPRED_HOME=${HADOOP_HOME}
mapreduce.map.env
HADOOP_MAPRED_HOME=${HADOOP_HOME}
mapreduce.reduce.env
HADOOP_MAPRED_HOME=${HADOOP_HOME}
配置文件yarn-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim yarn-site.xml
yarn.resourcemanager.hostname
Node1的hostname
yarn.nodemanager.aux-services
mapreduce_shuffle
yarn.scheduler.minimum-allocation-mb
512
yarn.scheduler.maximum-allocation-mb
2048
yarn.nodemanager.vmem-pmem-ratio
4
配置文件workers
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim workersNode1的hostname
Node2的hostname
Node3的hostname
……
5.6分发同步安装包 在node1机器上将Hadoop安装包scp同步到其他机器。
cd /export/server/
scp -r hadoop-3.1.4 root@node2:/export/server/
scp -r hadoop-3.1.4 root@node3:/export/server/
……
5.7配置Hadoop环境变量 在node1上配置Hadoop环境变量
vim /etc/profile
export HADOOP_HOME=/export/server/hadoop-3.1.4
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
将修改后的环境变量同步到其他机器
scp /etc/profile root@node2:/etc/
scp /etc/profile root@node3:/etc/
……
重新加载环境变量,验证是否有效
source /etc/profile
hadoop #验证环境变量是否生效
5.8NameNode format(格式化操作) 首次启动HDFS时,必须对其进行格式化操作。
format本质上是初始化工作,进行HDFS清理和准备工作。
hdfs namenode -format
六、Hadoop集群启动 6.1手动逐个进程启停 每台机器上每次手动启动关闭一个角色进程。
#HDFS集群
hdfs --daemon start namenode|datanode|secondarynamenode
hdfs --daemon stopnamenode|datanode|secondarynamenode#YARN集群
yarn --daemon start resourcemanager|nodemanager
yarn --daemon stopresourcemanager|nodemanager
6.2shell脚本一键启停 在node1上,使用软件自带的shell脚本一键启动。
前提:配置好机器之间的SSH免密登录和workers文件。
#HDFS集群
start-dfs.sh
stop-dfs.sh #YARN集群
start-yarn.sh
stop-yarn.sh#Hadoop集群
start-all.sh
stop-all.sh
启动完毕之后可以使用jps命令查看进程是否启动成功。
Hadoop Web UI页面-HDFS集群
地址:http://namenode_host:9870
?
注意:其中namenode_host是namenode运行所在机器的主机名或者ip,如果使用主机名访问,别忘了在Windows配置hosts。
Hadoop Web UI页面-YARN集群
地址:http://resourcemanager_host:8088
? 其中resourcemanager_host是resourcemanager运行所在机器的主机名或者ip,如果使用主机名访问,别忘了在Windows配置hosts。
推荐阅读
- hadoop|搭建Hadoop完全分布式集群(三台虚拟机)
- Linux|Centos8安装 Hadoop3 详细操作(含图文)
- 大数据|BigData File Viewer工具介绍
- 大数据开发|大数据是什么(0基础大数据怎么进行入门学习?基础知识总纲)
- hadoop|hadoop日常运维问题汇总
- HDFS|HDFS跨集群的数据迁移
- 数据仓库|详述Hive企业级开发优化
- 数据仓库|Hive、SparkSQL是如何决定写文件的数量的()
- 大数据|大数据生态圈简介