前言
搭建一个集群环境需要多台服务器,对个人而言他的门槛还是比较高的,因此不少人会采用在主机上安装虚拟机,再安装几个操作系统,然后将虚拟机中的操作系统运行起来。
但是运行虚拟机中的操作系统也不是一件容易的事情,对个人电脑的要求还是比较高的,这些门槛对于学习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两部分,则代表安装成功

二、获取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

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