Docker安装全分布式Hadoop集群

前言

搭建一个集群环境需要多台服务器,对个人而言他的门槛还是比较高的,因此不少人会采用在主机上安装虚拟机,再安装几个操作系统,然后将虚拟机中的操作系统运行起来。

但是运行虚拟机中的操作系统也不是一件容易的事情,对个人电脑的要求还是比较高的,这些门槛对于学习Hadoop的小伙伴来说都会降低他的学习的积极性。

为了解决上面的两个问题,我采取用Docker来部署Hadoop,Docker不仅生产环境威力巨大,对于我们在电脑中搭建学习实验环境是非常有便利的。

使用Docker安装Hadoop集群的方式包括以下几点:

  • 安装Docker
  • 获取Centos镜像
  • 配置SSH免密登录
  • 安装Java和Hadoop
  • 配置Hadoop

一、安装Docker

查看内核版本

uname -a

Linux VM-12-9-centos 3.10.0-1160.71.1.el7.x86_64 #1 SMP Tue Jun 28 15:37:28 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

内核版本最好是3.10及以上。

更新yum包

yum update

安装依赖软件包

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

查看仓库中的Docker版本

yum list docker-ce --showduplicates | sort -r

安装Docker

yum install docker-ce-18.06.3.ce

设置开机启动

systemctl start docker
systemctl enable docker

查看是否安装成功

docker version

有client和service两部分,则代表安装成功

Docker安装全分布式Hadoop集群
image-20221214174340160

二、获取centos镜像

docker pull centos

编辑Dockerfile

cd /mnt
mkdir docker
cd docker
vi Dockerfile

内容

FROM centos
MAINTAINER dys
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum install -y openssh-server sudo
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN yum  install -y openssh-clients

RUN echo "root:1234" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd""-D"]

构建centos镜像

docker build -t="centos7-ssh" .

执行完成之后,可以在镜像列表中看到

docker images
Docker安装全分布式Hadoop集群
image-20221214175804748

基于centos7-ssh启动三个容器

docker run -d --name=centos7.ssh centos7-ssh
docker run -d --name=centos7.ssh2 centos7-ssh
docker run -d --name=centos7.ssh3 centos7-ssh

这样就有三个容器,可以在上面做安装和配置操作。

三、构建Hadoop镜像

创建目录

cd /mnt/docker
mkdir hadoop
cd hadoop

下载jdk与hadoop

#下载Hadoop
wget https://mirrors.bfsu.edu.cn/apache/hadoop/common/hadoop-3.3.4/hadoop-3.3.4.tar.gz
#下载jdk
wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u141-b15/336fa29ff2bb4ef291e347e091f7f4a7/jdk-8u141-linux-x64.tar.gz"

编辑Dockerfile

内容

FROM centos7-ssh
ADD jdk-8u141-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_141 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH

ADD hadoop-3.3.4.tar.gz /usr/local
RUN mv /usr/local/hadoop-3.3.4 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH

RUN yum install -y which sudo

构建hadoop镜像

docker build -t="hadoop" .

运行容器

docker run --name hadoop0 --hostname hadoop0 -d -P -p 50070:50070 -p 8088:8088 hadoop
docker run --name hadoop1 --hostname hadoop1 -d -P hadoop
docker run --name hadoop2 --hostname hadoop2 -d -P hadoop

配置Hadoop集群

新开3个窗口,分别连接到上面创建的三个Hadoop镜像:hadoop0、hadoop1、hadoop2,便于操作。

执行以下命令:

docker exec -it hadoop0 /bin/bash  # 连接hadoop0
docker exec -it hadoop1 /bin/bash  # 连接hadoop1
docker exec -it hadoop2 /bin/bash  # 连接hadoop2

进去之后,在各个容器中修改/etc/hosts里面的内容,添加;

172.17.0.5      hadoop0
172.17.0.6      hadoop1
172.17.0.7      hadoop2

这里注意:IP地址是创建镜像时分配,因此你们在创建的时候与我们可能不一样。

四、免密登录

在每台服务器中都执行以下命令

ssh-keygen
# 一路回车
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop0
# 输入前面的密码:1234
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
# 输入前面的密码:1234
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
# 输入前面的密码:1234

测试

ssh hadoop
ssh hadoop1
ssh hadoop2

# 记得exit

五、配置集群

以下节点操作均在hadoop0上执行即可:

docker exec -it hadoop0 bash   #进入hadoop1
mkdir /home/hadoop           # 创建目录
mkdir /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
cd /usr/local/hadoop/etc/hadoop/

core-site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://hadoop0:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/home/hadoop/tmp</value>
    </property>
    <property>
        <name>io.file.buffer.size</name>
        <value>131702</value>
    </property>
</configuration>

hdfs-site.xml

<configuration>

      <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/home/hadoop/hdfs_name</value>
    </property>
    <property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/home/hadoop/hdfs_data</value>
    </property>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>hadoop0:9001</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

</configuration>

mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.address</name>
        <value>hadoop0:10020</value>
    </property>
    <property>
        <name>mapreduce.jobhistory.webapp.address</name>
        <value>hadoop0:19888</value>
    </property>
    <property>
                <name>yarn.app.mapreduce.am.env</name>
                <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
         <name>mapreduce.map.env</name>
         <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
        <property>
          <name>mapreduce.reduce.env</name>
          <value>HADOOP_MAPRED_HOME=${HADOOP_HOME}</value>
        </property>
</configuration>

yarn-site.xml

<configuration>

<!-- Site specific YARN configuration properties -->
    
 
        <property>
                <name>yarn.resourcemanager.hostname</name>
                <value>hadoop0</value>
        </property>
        <property>
                <name>yarn.nodemanager.aux-services</name>
                <value>mapreduce_shuffle</value>
        </property>
        <property>
                <name>yarn.log-aggregation-enable</name>
                <value>true</value>
        </property>
        <property>
                <name>yarn.log-aggregation.retain-seconds</name>
                <value>604800</value>
        </property>
</configuration>

workers

vi workers

hadoop1
hadoop2

配置环境变量

以下操作也是在hadoop0中执行

dfs.sh

cd /usr/local/hadoop/sbin
vi start-dfs.sh#第二行添加如下4句
vi stop-dfs.sh#第二行添加如下4句
HDFS_DATANODE_USER=root
HADOOP_SECURE_DN_USER=hdfs
HDFS_NAMENODE_USER=root
HDFS_SECONDARYNAMENODE_USER=root

yarn.sh

cd /usr/local/hadoop/sbin
vi start-yarn.sh#第二行添加如下3句
vi stop-yarn.sh#第二行添加如下3句
YARN_RESOURCEMANAGER_USER=root
HADOOP_SECURE_DN_USER=yarn
YARN_NODEMANAGER_USER=root

env.sh

cd /usr/local/hadoop/etc/hadoop
vi hadoop-env.sh#加入下面这句话
export JAVA_HOME=/usr/local/jdk1.8

添加变量

export JAVA_HOME=/usr/local/jdk1.8
export HADOOP_HOME=/usr/local/hadoop
export PATH=$PATH:/bin:/usr/bin:$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$PATH:$HADOOP_HOME/sbin
source ~/.bashrc #执行

也可以写到/etc/profile永久生效

拷贝

将主节点hadoop0配置拷贝到从节点

scp -r /usr/local/hadoop/ hadoop:/usr/local/
scp -r /usr/local/hadoop/ hadoop2:/usr/local/

启动测试

在Hadoop0下执行

1、格式化hdfs

hdfs namenode -format

2、启动

start-all.sh

3、查看启动项

jps
9234 ResourceManager
9571 Jps
8697 NameNode
8973 SecondaryNameNode

最后

我们使用了Docker技术,使用了一台服务器就实现了分布式集群,极大的降低了学习成本,是不是非常赞呢?

最后,我想说,写文章真的可以提高自己的技术,很多时候有些知识点忘记可以去翻翻自己写的文章,很快就会知道是怎么回事。

路漫漫其修远兮,吾将上下而求索如果你看到了这里希望你可以点个【】与【再看】,让我知道你们就是那个陪我一起努力的人


原文始发于微信公众号(小志Codings):Docker安装全分布式Hadoop集群

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/236546.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!