Hadoop|Hadoop集群搭建


文章目录

  • 一、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(分布式计算框架):解决海量数据计算
Hadoop集群包括两个集群:HDFS集群、YARN集群。两个集群逻辑上分离、通常物理上在一起。两个集群都是标准的主从架构集群。
Hadoop|Hadoop集群搭建
文章图片

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

三、Hadoop源码编译 安装包、源码包下载地址:https://archive.apache.org/dist/hadoop/common/
为什么需要编译Hadoop源码?
  • 匹配不同操作系统本地库环境,Hadoop某些操作比如压缩、IO需要调用系统本地库(*.so | *.dll)
  • 修改源码、重构源码(加入Hadoop的相关依赖)
根据下载的Hadoop源码包当中BUILDING.txt文件所描述的内容,编译Hadoop需要的环境如下:
Hadoop|Hadoop集群搭建
文章图片

由图可知,编译Hadoop源码所需的环境较为复杂,此处我们使用Docker容器化技术来构建一个满足编译Hadoop的环境。好处如下:
  1. 容器内部的环境与主机的环境相互隔离,避免主机安装过多软件
  2. 容器中的环境可以反复使用,同时相应的Dockerfile文件也可以迁移到其他具有Docker的主机上进行快速搭建环境。
四、使用Docker编译Hadoop 【Hadoop|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文件。
  • 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
目录结构如图所示:
Hadoop|Hadoop集群搭建
文章图片

基于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 .

结果如图所示:
Hadoop|Hadoop集群搭建
文章图片

使用如下命令以交互式的方式进入容器:
docker run -it --name hadoop-compiler 容器的id /bin/bash

结果如下图所示:
Hadoop|Hadoop集群搭建
文章图片

我们可以看到挂载至容器内部的软件已经自动解压过了。
4.5编译Hadoop 脚本的执行顺序:
  1. bash config.sh
  2. bash compile.sh
注意:如果环境变量配置出现异常,可以手动编辑/etc/profile文件,将config.sh中的环境变量配置其中,并通过source /etc/profile命令刷新。
会执行比较长的时间。。。。。。。。。。。。。。。。。大约一小时。
Hadoop|Hadoop集群搭建
文章图片

编译后的文件在:/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|Hadoop集群搭建
文章图片

五、Hadoop集群安装 5.1集群角色规划 角色规划的准则
  • 根据软件工作特性和服务器硬件资源情况合理分配
  • 比如依赖内存工作的NameNode是不是部署在大内存机器上?
角色规划注意事项
  • 资源上有抢夺冲突的,尽量不要部署在一起
  • 工作上需要互相配合的。尽量部署在一起
服务器 运行角色
node1 namenode datanode resourcemanager nodemanager
node2 secondarynamenode datanode nodemanager
node3 datanode 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安装包目录结构 Hadoop|Hadoop集群搭建
文章图片

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。

    推荐阅读