Hadoop的核心组件
Hadoop集群包括两个集群:HDFS集群、YARN集群。两个集群逻辑上分离、通常物理上在一起。两个集群都是标准的主从架构集群。
安装包、源码包下载地址:https://archive.apache.org/dist/hadoop/common/
为什么需要编译Hadoop源码?
根据下载的Hadoop源码包当中BUILDING.txt
文件所描述的内容,编译Hadoop需要的环境如下:
由图可知,编译Hadoop源码所需的环境较为复杂,此处我们使用Docker容器化技术来构建一个满足编译Hadoop的环境。好处如下:
Linux操作系统:Centos7
Hadoop版本:3.1.4
Docker版本:1.4.1及以上
安装Docker的步骤可以参考我的另一篇博客:《初识Docker》
①不编译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
文件。
以上软件根据构建要求的版本进行下载,否则将导致编译过程出错。
软件的版本如下:
基于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"]
创建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"
使用如下命令创建镜像:
docker build -t centos7-hadoop-compiler .
docker run -it --name hadoop-compiler 容器的id /bin/bash
结果如下图所示:
我们可以看到挂载至容器内部的软件已经自动解压过了。
脚本的执行顺序:
bash config.sh
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
角色规划的准则
角色规划注意事项
服务器 | 运行角色 |
---|---|
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)
创建统一工作目录(所有机器)
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/
配置文件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
<configuration>
<property>
<name>fs.defaultFSname>
<value>hdfs://Node1的hostname:8020value>
property>
<property>
<name>hadoop.tmp.dirname>
<value>/export/data/hadoop-3.1.4value>
property>
<property>
<name>hadoop.http.staticuser.username>
<value>rootvalue>
property>
configuration>
配置文件hdfs-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim hdfs-site.xml
<property>
<name>dfs.namenode.secondary.http-addressname>
<value>Node2的hostname:9868value>
property>
配置文件mapred-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim mapred-site.xml
<property>
<name>mapreduce.framework.namename>
<value>yarnvalue>
property>
<property>
<name>yarn.app.mapreduce.am.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.map.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
<property>
<name>mapreduce.reduce.envname>
<value>HADOOP_MAPRED_HOME=${HADOOP_HOME}value>
property>
配置文件yarn-site.xml
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim yarn-site.xml
<property>
<name>yarn.resourcemanager.hostnamename>
<value>Node1的hostnamevalue>
property>
<property>
<name>yarn.nodemanager.aux-servicesname>
<value>mapreduce_shufflevalue>
property>
<property>
<name>yarn.scheduler.minimum-allocation-mbname>
<value>512value>
property>
<property>
<name>yarn.scheduler.maximum-allocation-mbname>
<value>2048value>
property>
<property>
<name>yarn.nodemanager.vmem-pmem-rationame>
<value>4value>
property>
配置文件workers
cd /export/server/hadoop-3.1.4/etc/hadoop/
vim workers
Node1的hostname
Node2的hostname
Node3的hostname
……
在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/
……
在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 #验证环境变量是否生效
首次启动HDFS时,必须对其进行格式化操作。
format本质上是初始化工作,进行HDFS清理和准备工作。
hdfs namenode -format
每台机器上每次手动启动关闭一个角色进程。
#HDFS集群
hdfs --daemon start namenode|datanode|secondarynamenode
hdfs --daemon stop namenode|datanode|secondarynamenode
#YARN集群
yarn --daemon start resourcemanager|nodemanager
yarn --daemon stop resourcemanager|nodemanager
在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。