Hadoop集群搭建

一、Hadoop集群简介

Hadoop的核心组件

  • Hadoop HDFS(分布式文件存储系统):解决海量数据存储
  • Hadoop YARN(集群资源管理和任务调度框架):解决资源任务调度
  • Hadoop MapReduce(分布式计算框架):解决海量数据计算

Hadoop集群包括两个集群:HDFS集群、YARN集群。两个集群逻辑上分离、通常物理上在一起。两个集群都是标准的主从架构集群。
在这里插入图片描述

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

二、Hadoop部署方式

在这里插入图片描述

三、Hadoop源码编译

安装包、源码包下载地址:https://archive.apache.org/dist/hadoop/common/
为什么需要编译Hadoop源码?

  • 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so | *.dll)
  • 修改源码、重构源码(加入Hadoop的相关依赖)

根据下载的Hadoop源码包当中BUILDING.txt文件所描述的内容,编译Hadoop需要的环境如下:
在这里插入图片描述
由图可知,编译Hadoop源码所需的环境较为复杂,此处我们使用Docker容器化技术来构建一个满足编译Hadoop的环境。好处如下:

  1. 容器内部的环境与主机的环境相互隔离,避免主机安装过多软件
  2. 容器中的环境可以反复使用,同时相应的Dockerfile文件也可以迁移到其他具有Docker的主机上进行快速搭建环境。

四、使用Docker编译Hadoop

Linux操作系统:Centos7
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文件。

以上软件根据构建要求的版本进行下载,否则将导致编译过程出错。

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 -y  gcc 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

脚本的执行顺序:

  1. bash config.sh
  2. bash compile.sh

注意:如果环境变量配置出现异常,可以手动编辑/etc/profile文件,将config.sh中的环境变量配置其中,并通过source /etc/profile命令刷新。
会执行比较长的时间。。。。。。。。。。。。。。。。。大约一小时。
在这里插入图片描述
编译后的文件在:/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是不是部署在大内存机器上?

角色规划注意事项

  • 资源上有抢夺冲突的,尽量不要部署在一起
  • 工作上需要互相配合的。尽量部署在一起
服务器运行角色
node1namenode datanode resourcemanager nodemanager
node2secondarynamenode datanode nodemanager
node3datanode nodemanager

5.2 服务器基础环境准备

主机名(所有机器)

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
<!-- lcore-site.xml-->
<configuration>
    <!-- 默认文件系统的名称。通过URI中schema区分不同文件系统。-->
    <!-- file:///本地文件系统 hdfs:// hadoop分布式文件系统 gfs://。-->
    <!-- hdfs文件系统访问地址:http://nn_host:8020。-->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://Node1的hostname:8020</value>
    </property>
    <!-- hadoop本地数据存储目录 format时自动生成 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/export/data/hadoop-3.1.4</value>
    </property>
    <!-- 在Web UI访问HDFS使用的用户名。-->
    <property>
        <name>hadoop.http.staticuser.user</name>
        <value>root</value>
    </property>
</configuration>

配置文件hdfs-site.xml

cd /export/server/hadoop-3.1.4/etc/hadoop/
vim hdfs-site.xml
<!-- hdfs-site.xml-->
<!-- 设定SNN运行主机和端口。-->
<property>
    <name>dfs.namenode.secondary.http-address</name>
        <value>Node2的hostname:9868</value>
</property>

配置文件mapred-site.xml

cd /export/server/hadoop-3.1.4/etc/hadoop/
vim mapred-site.xml
<!--mapred-site.xml-->
<!-- mr程序默认运行方式。yarn集群模式 local本地模式-->
<property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
</property>
<!-- MR App Master环境变量。-->
<property>
    <name>yarn.app.mapreduce.am.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR MapTask环境变量。-->
<property>
        <name>mapreduce.map.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>
<!-- MR ReduceTask环境变量。-->
<property>
    <name>mapreduce.reduce.env</name>
    <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
</property>

配置文件yarn-site.xml

cd /export/server/hadoop-3.1.4/etc/hadoop/
vim yarn-site.xml
<!--yarn-site.xml-->
<!-- yarn集群主角色RM运行机器。-->
<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>Node1的hostname</value>
</property>
<!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MR程序。-->
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>
<!-- 每个容器请求的最小内存资源(以MB为单位)。-->
<property>
    <name>yarn.scheduler.minimum-allocation-mb</name>
    <value>512</value>
</property>
<!-- 每个容器请求的最大内存资源(以MB为单位)。-->
<property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>2048</value>
</property>
<!-- 容器虚拟内存与物理内存之间的比率。-->
<property>
    <name>yarn.nodemanager.vmem-pmem-ratio</name>
    <value>4</value>
</property>

配置文件workers

cd /export/server/hadoop-3.1.4/etc/hadoop/
vim workers

Node1的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 stop  namenode|datanode|secondarynamenode

#YARN集群
yarn --daemon start resourcemanager|nodemanager
yarn --daemon stop  resourcemanager|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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值