Mac 在docker容器内配置hadoop集群

概要

本人看网课大家都使用win+vmware虚拟机配置,用mac的少得可怜甚至于还没开始就结束了…,前两天刚摸索完docker于是直接尝试docker容器化hadoop集群 一开始以为难度跟docker里装redis集群一样简单hhhh,结果一步一个bug!配了两天终于搞定了 现做个学习记录。

整体配置流程分为两部分 docker容器调节+配置文件修改

1.首先确定好linux环境 本人使用centos 这里就有几个小坑!,docker里最新的centos8 yum源本身就有问题 需要替换成阿里源镜像 换好后本人在配置到时间同步时 安装到chrony无法启动 直接寄。后续看到有人说使用centos7.3没这个问题但是这应该是在虚拟机里安装的,docker里要么是7,要么是7.9再就是8 版本。于是本人使用centos7 尝试但依旧无法启动chrony,最终尝试7.9 仍无法启动 但是系统自带ntpd时间同步 于是直接使用它调整系统时间 其实就是往后推8小时 UST 换成CST时区。
确定好centos版本后还需要下载java和hadoop依赖包
下载地址:java 8hadoop
这里选择jdk8 和 hadoop3.4.0 本人已开始选的jdk22 结果到最后配置好启动时发现yarn无法启动 查看log报错java无法初始化 没办法重新下载安装一遍。。。
接下来开始正式配置:
第一步--------------------------------------------------------------------------------------------------
拉取镜像:

docker pull centos:7.9.2009

运行镜像生成容器:

docker run -itd --name hadoop01 -p 2201:22 -p 8088:8088 -p 9000:9000 -p 50070:50070 --privileged=true centos:7.9.2009 /usr/sbin/init

运行后查看 docker ps
请添加图片描述
成功!

需要注意这里 实际上配置的就是第一台hadoop01 端口号必不可少因为后续hdfs yarn启动需要配置对应的端口号访问 如果这里不加端口映射主机无法访问。

-p:表示端口映射,这很重要,可以方便本机在外部访问web网页 需要设置容器和本机的相关端口映射。
-i:表示运行的容器。
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-d: 在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
–name :为创建的容器命名。
–privileged:为true时赋予容器内root用户真正的root权限,否则root为普通用户,默认为flase。
/usr/sbin/init: 使容器启动后可以使用systemctl方法。

第二步---------------------------开始安装jdk 和 hadoop------------------------------------------
首先创建一个文件目录mkdir /home/download 把下载的压缩包从主机传入该目录
/xxx/xxx/取决于你宿主机存放压缩包的目录。

docker cp /xxx/xxx/jdk-8u411-linux-aarch64.tar.gz hadoop01:/home/download/
docker cp /xxx/xxx/hadoop-3.4.0.tar.gz hadoop01:/home/download/

传好后开始解压 指定解压路径为/usr/local

cd /home/download/
tar -zxvf jdk-8u411-linux-aarch64.tar.gz -C /usr/local/

解压完成后进入解压路径 把路径名称修改为jdk 后续hadoop的解压路径也修改为hadoop 方便配置环境变量。

cd /usr/local/
mv jdk1.8.0_411/ jdk

接着修改bashrc环境变量文件 在里面配置环境变量这样每次启动环境变量就能自动配置好。

vim /etc/bashrc 进入修改
#在末尾添加以下内容
#jdk environment
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
source /etc/bashrc 修改完成后运行此命令生效

完成上述这些步骤就可以保存一下 把Hadoop01容器导出为镜像 方便配置另外两台hadoop02 hadoop03

#导出镜像
docker commit -m "first hadoop machine" -a "claem" hadoop01 新镜像名:tag名
#查看镜像列表
docker images
#创建相同容器
docker run -itd --name hadoop02 -p 2202:22 -p 50090:50090 --privileged=true 新镜像名:tag名 /usr/sbin/init
docker run -itd --name hadoop03 -p 2203:22 --privileged=true 新镜像名:tag名 /usr/sbin/init

创建好容器并进入容器后在容器内终端使用hostname xxx可以修改容器root对应的名称,我们在三台机器上分别对应运行。

hostname hadoop01
hostname hadoop02
hostname hadoop03

第三步------------------------配置hadoop前置运行条件----------------------------------------
首先要确保三台hadoop服务器在同一网络内,这就需要我们把三台服务器所在的容器连接到同一网络,在docker内创建容器时如果不使用-net的话默认加入bridge桥接网络 所以我们需要在docker里单独创建一个桥接网络让三台容器加入即可

#查看docker 存在的网段
docker network ls
#创建名为bigdata的新网段
docker network create hadoop-cluster-1
# 三台容器连入bigdata网段
docker network connect hadoop-cluster-1 hadoop01
docker network connect hadoop-cluster-1 hadoop02
docker network connect hadoop-cluster-1 hadoop03
#断开三台容器与bridge的连接
docker network disconnect bridge hadoop01
docker network disconnect bridge hadoop02
docker network disconnect bridge hadoop03

这样三台容器间就可以相互ping通 但是宿主机还不能和容器间ping通
这里可以参考我上一片文章Mac宿主机无法ping通docker容器这里就不做过多讲述啦。

接下来对每台机器配置SSH免密登陆

yum -y install passwd openssh-server openssh-clients
systemctl status sshd
systemctl start sshd
systemctl enable sshd #让sshd服务开机启动
ss -lnt #检查22端口号是否开通

注意 这里如果ss -lnt报错 bash: ss: command not found 说明没有下载ss对应的命令包,使用下方命令安装即可。ps:centos8自带了但是7没有带。。。

sudo yum install iproute # iproute包包含了ss命令及其他网络工具

接下来在三台容器里分别配置密码 嫌麻烦统一配置000000

passwd root

三台机器都安装好后 每台机器上都修改hosts文件 这样三台hadoop服务器的ip每台容器都存放一遍 后面可以直接识别。

vim /etc/hosts
#在文件后添加
172.19.0.2      hadoop01
172.19.0.3      hadoop02
172.19.0.4      hadoop03

设置免密登陆

ssh-keygen -t rsa #连续回车直到完成
[root@hadoop01 ~] cd .ssh/
[root@hadoop01 ~] ls

每台容器上都拷贝一下三台hadoop服务器的密匙

ssh-copy-id hadoop01
ssh-copy-id hadoop02
ssh-copy-id hadoop03

最后到了最坑的地方 三台机器的时间同步,这里我直接选择修改容器内部时间,改的和宿主机一样就可以了,三台hadoop服务器同步修改。

# 进入容器
docker exec -it <container_id> bash
# 执行
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

第四步-------------------------配置hadoop----------------------------------------------------------
解压hadoop3.4.0压缩包 还是老地方。

 tar -zxvf hadoop-3.4.0.tar.gz -C /usr/local

解压好后记得修改解压目录hadoop3.4.0 —> hadoop 然后配置环境变量

cd /etc/profile.d/   进入该目录
touch my_env.sh      创建hadoop环境变量配置文件
vim my_env.sh        进入修改
#在其末尾添加
#HADOOP_HOME
export HADOOP_HOME=/usr/local/hadoop-3.3.4
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
#让修改后的文件生效
source /etc/profile
#测试是否成功 查看版本
hadoop version

请添加图片描述
成功后给另外两台容器上分发hadoop文件和刚刚创建的环境变量文件

cd /usr/local/
scp -r hadoop/ hadoop02:$PWD
scp -r hadoop/ hadoop03:$PWD
scp /etc/profile hadoop02:/etc/
scp /etc/profile hadoop03:/etc/

source /etc/profile #在hadoop02上执行
source /etc/profile #在hadoop03上执行

my_env.sh需要创建一个脚本文件来分发
首先找到全局环境变量 使用echo $PATH查找到 /usr/local/bin

cd /usr/local/bin
vim xsync

#编写如下脚本
#!/bin/bash

if [ $# -lt 1 ]
then
    echo Not Enough Arguement!
    exit;
fi
for host in hadoop01 hadoop02 hadoop03
do
    echo ====================  $host  ====================

    for file in $@
    do
        if [ -e $file ]
            then
                pdir=$(cd -P $(dirname $file); pwd)

                fname=$(basename $file)
                ssh $host "mkdir -p $pdir"
                rsync -av $pdir/$fname $host:$pdir
            else
                echo $file does not exists!
        fi
    done
done

#修改脚本xysnc 赋予执行权限
chmod +x xsync
#测试脚本
xsync /usr/local/bin
#将脚本复制/bin目录,以便全局调用
cp xsync /bin/
#同步环境变量配置 进入./bin目录下执行
xsync /etc/profile.d/my_env.sh
 
#最后hadoop01 hadoop02 hadoop03 都执行 
source /etc/profile

到这里可以说完成65%了,接下来在三台服务器上我们需要做的就是修改hadoop的配置文件,例如指定 namenode在哪台服务器上 secondnamenode在哪台服务器,resourcemanager/nodemanager又在哪台服务器,修改配置文件来确定这些细节方面 最后能运行起来就成功!

修改hadoop配置文件

要实现完全分布式的配置,需要配置以下文件:
hadoop-env.sh
yarn-env.sh
core-site.xml
hdfs-site.xml
mapred-site.xml
yarn-site.xml

在Hadoop安装完成后,会在$HADOOP_HOME/share路径下,有若干个*-default.xml文件,这些文件中记录了默认的配置信息。同时,在代码中,我们也可以设置Hadoop的配置信息。 这些位置配置的Hadoop,优先级为: 代码设置 > *-site.xml > *-default.xml
本次部署的集群规划如下:

NodeApplications
hadoop01NameNode&DataNode&ResourceManager&NodeManager
hadoop02SecondaryNameNode&DataNode&NodeManager
hadoop03DataNode&NodeManager

1.core-site.xml

# cd $HADOOP_HOME/etc/hadoop/
# vim core-site.xml
<configuration>
    <!-- hdfs的地址名称:schame,ip,port-->
    <!-- 在Hadoop1.x的版本中,默认使用的端口是9000。在Hadoop2.x的版本中,默认使用端口是8020 -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop01:8020</value>
    </property>
    <!-- hdfs的基础路径,被其他属性所依赖的一个基础路径 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/usr/local/hadoop/tmp</value>
    </property>
</configuration>

属性解释:

1.fs.defaultFS:
HDFS对外提供服务的主机及端口号;
端口也可以省略不写。
2.hadoop.tmp.dir:
指定的HDFS文件存储的目录;

2.hdfs-site.xml

# cd $HADOOP_HOME/etc/hadoop/
# vim hdfs-site.xml
<configuration>
    <!-- namenode守护进程管理的元数据文件fsimage存储的位置-->
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/name</value>
    </property>
    <!-- 确定DFS数据节点应该将其块存储在本地文件系统的何处-->
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file://${hadoop.tmp.dir}/dfs/data</value>
    </property>
    <!-- 块的副本数-->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <!-- 块的大小(128M),下面的单位是字节-->
    <property>
        <name>dfs.blocksize</name>
        <value>134217728</value>
    </property>
    <!-- secondarynamenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop02:50090</value>
    </property>
  	<!-- namenode守护进程的http地址:主机名和端口号。参考守护进程布局-->
	<property>
  	  <name>dfs.namenode.http-address</name>
  	  <value>hadoop01:50070</value>
	</property>  
</configuration>

1.dfs.namenode.name.dir:
fsimage存储的位置
2.dfs.datanode.data.dir:
块的存储位置
3.dfs.replication:
HDFS为了保证属性不丢失,会保存块的副本
4.dfs.blocksize:
块大小,在hadoop1.x版本中为64M,在hadoop2.x的版本汇总默认128M
5.dfs.namenode.secondary.http-address:
指定secondarynamenode的节点服务器位置
6.dfs.namenode.http-address:
webui查看时的地址端口

3.mapred-site.xml

# cp mapred-site.xml.template  mapred-site.xml docker里没有该文件就不执行该命令
# vim mapred-site.xml
<configuration>
    <!-- 指定mapreduce使用yarn资源管理器-->
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <!-- 配置作业历史服务器的地址-->
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop01:10020</value>
    </property>
    <!-- 配置作业历史服务器的http地址-->
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop01:19888</value>
    </property>
</configuration>

4.yarn-site.xml

# vim yarn-site.xml
<configuration>
    <!-- 指定yarn的shuffle技术-->
    <property>
        <name>yarn.nodemanager.aux-services</name>
       <value>mapreduce_shuffle</value>
    </property>
    <!-- 指定resourcemanager的主机名-->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>hadoop01</value>
    </property> 
    <!--下面的可选-->
    <!--指定shuffle对应的类 -->
	<property> 
	<name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name>
     <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
	</property>

	<!--配置resourcemanager的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.address</name>
	<value>hadoop01:8032</value>
	</property>

	<!--配置resourcemanager的scheduler的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.scheduler.address</name>
	<value>hadoop01:8030</value>
	</property>

	<!--配置resoucemanager的资源调度的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.resource-tracker.address</name>
	<value>hadoop01:8031</value>
	</property>

	<!--配置resourcemanager的管理员的内部通讯地址-->
	<property>
	<name>yarn.resourcemanager.admin.address</name>
	<value>hadoop01:8033</value>
	</property>

	<!--配置resourcemanager的web ui 的监控页面-->
	<property>
	<name>yarn.resourcemanager.webapp.address</name>
	<value>hadoop01:8088</value>
	</property>
</configuration>

5.hadoop-env.sh

# 配置hadoop运行的jdk环境路径
vim hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=/usr/local/jdk

6.yarn-env.sh

# 配置yarn运行的jdk环境路径
vim yarn-site.sh
# some Java parameters
export JAVA_HOME=/usr/local/jdk

7.workers

# hadoop3.0之前的版本叫 slaves
vim workers
hadoop01
hadoop02
hadoop03

分发配置文件 让三台hadoop服务器配置文件都更新成修改的

cd $HADOOP_HOME/etc/
scp -r hadoop/ hadoop02:$PWD
scp -r hadoop/ hadoop03:$PWD

格式化 在hadoop01服务器上运行 该服务器是主服务器 (master)
PS:如果之前格式化过集群,需要删除上次配置的hadoop.tmp.dir属性对应位置的tmp文件夹,hadoop.tmp.dir属性值见core-site.xml文件

hdfs namenode -format

格式化信息解读:

  1. 生成一个集群唯一标识符:clusterid
  2. 生成一个块池唯一标识符:blockPoolId
  3. 生成namenode进程管理内容(fsimage)的存储路径:
    默认配置文件属性hadoop.tmp.dir指定的路径下生成dfs/name目录
  4. 生成镜像文件fsimage,记录分布式文件系统根路径的元数据
  5. 其他信息都可以查看一下,比如块的副本数,集群的fsOwner等。

启动集群

  1. 启动脚本
    – start-dfs.sh :用于启动hdfs集群的脚本
    – start-yarn.sh :用于启动yarn守护进程
    – start-all.sh :用于启动hdfs和yarn

  2. 关闭脚本
    – stop-dfs.sh :用于关闭hdfs集群的脚本
    – stop-yarn.sh :用于关闭yarn守护进程
    – stop-all.sh :用于关闭hdfs和yarn

  3. 单个守护进程脚本
    – hadoop-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
    – hadoop-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
    例:
    hadoop-daemon.sh [start|stop] [namenode|datanode|secondarynamenode]

    – yarn-daemons.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
    – yarn-daemon.sh :用于单独启动或关闭hdfs的某一个守护进程的脚本
    例:
    yarn-daemon.sh [start|stop] [resourcemanager|nodemanager]

注意! 如果哪台机器的相关守护进程没有开启,那么,就查看哪台机器上的守护进程对应的日志log文件,注意,启动脚本运行时提醒的日志后缀是*.out,而我们查看的是*.log文件。此文件的位置:${HADOOP_HOME}/logs/里

查看web端 hdfs 和 yarn
HDFS: http://hadoop01的容器ip:50070
请添加图片描述
YARN: http://hadoop01的容器ip:8088
请添加图片描述
成功!!!

  • 38
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值