docker-compose之Hadoop简单搭建

1. 概览

  • 宿主机:KVM(Ubuntu16.04)
  • docker版本:Docker version 20.10.7
  • docker-compse版本:docker-compose version 1.27.3

2. 简介

Hadoop 框架是用于计算机集群大数据处理的框架,所以它必须是一个可以部署在多台计算机上的软件。部署了 Hadoop 软件的主机之间通过套接字 (网络) 进行通讯。

Hadoop 主要包含 HDFS 和 MapReduce 两大组件,HDFS 负责分布储存数据,MapReduce 负责对数据进行映射、规约处理,并汇总处理结果。

Hadoop 框架最根本的原理就是利用大量的计算机同时运算来加快大量数据的处理速度。

2.1 HDFS

Hadoop Distributed File System,Hadoop 分布式文件系统,简称 HDFS。

HDFS 用于在集群中储存文件,它所使用的核心思想是 Google 的 GFS 思想,可以存储很大的文件。

在服务器集群中,文件存储往往被要求高效而稳定,HDFS同时实现了这两个优点。

HDFS 高效的存储是通过计算机集群独立处理请求实现的。因为用户 (一半是后端程序) 在发出数据存储请求时,往往响应服务器正在处理其他请求,这是导致服务效率缓慢的主要原因。但如果响应服务器直接分配一个数据服务器给用户,然后用户直接与数据服务器交互,效率会快很多。

数据存储的稳定性往往通过"多存几份"的方式实现,HDFS 也使用了这种方式。HDFS 的存储单位是块 (Block) ,一个文件可能会被分为多个块储存在物理存储器中。因此 HDFS 往往会按照设定者的要求把数据块复制 n 份并存储在不同的数据节点 (储存数据的服务器) 上,如果一个数据节点发生故障数据也不会丢失。

  • HDFS 的节点

HDFS 运行在许多不同的计算机上,有的计算机专门用于存储数据,有的计算机专门用于指挥其它计算机储存数据。这里所提到的"计算机"我们可以称之为集群中的节点。

  • 命名节点 (NameNode)

命名节点 (NameNode) 是用于指挥其它节点存储的节点。任何一个"文件系统"(File System, FS) 都需要具备根据文件路径映射到文件的功能,命名节点就是用于储存这些映射信息并提供映射服务的计算机,在整个 HDFS 系统中扮演"管理员"的角色,因此一个 HDFS 集群中只有一个命名节点。

  • 数据节点 (DataNode)

数据节点 (DataNode) 使用来储存数据块的节点。当一个文件被命名节点承认并分块之后将会被储存到被分配的数据节点中去。数据节点具有储存数据、读写数据的功能,其中存储的数据块比较类似于硬盘中的"扇区"概念,是 HDFS 存储的基本单位。

  • 副命名节点 (Secondary NameNode)

副命名节点 (Secondary NameNode) 别名"次命名节点",是命名节点的"秘书"。这个形容很贴切,因为它并不能代替命名节点的工作,无论命名节点是否有能力继续工作。它主要负责分摊命名节点的压力、备份命名节点的状态并执行一些管理工作,如果命名节点要求它这样做的话。如果命名节点坏掉了,它也可以提供备份数据以恢复命名节点。副命名节点可以有多个。

2.2 MapReduce

MapReduce 的含义就像它的名字一样浅显:Map 和 Reduce (映射和规约) 。

  • 大数据处理

大量数据的处理是一个典型的"道理简单,实施复杂"的事情。之所以"实施复杂",主要是大量的数据使用传统方法处理时会导致硬件资源 (主要是内存) 不足。

在这种情况下我们依然有办法完成这项工作——我们先把样本分成一段段能够令单台计算机处理的规模,然后一段段地进行统计,每执行完一次统计就对映射统计结果进行规约处理,即将统计结果合并到一个更庞大的数据结果中去,最终就可以完成大规模的数据规约。

在以上的案例中,第一阶段的整理工作就是"映射",把数据进行分类和整理,到这里为止,我们可以得到一个相比于源数据小很多的结果。第二阶段的工作往往由集群来完成,整理完数据之后,我们需要将这些数据进行总体的归纳,毕竟有可能多个节点的映射结果出现重叠分类。这个过程中映射的结果将会进一步缩略成可获取的统计结果。

3. 部署

3.1 环境准备

  • Docker
  • docker-compose
  • hadoop-2.7.7.tar.gz
  • jdk-8u221-linux-x64.tar.gz

 

3.2 制作Dockerfile

FROM centos:7
MAINTAINER lee
 
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:qwe123" | 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"]

ADD jdk-8u221-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/jdk1.8.0_221 /usr/local/jdk1.8
ENV JAVA_HOME /usr/local/jdk1.8
ENV PATH $JAVA_HOME/bin:$PATH
 
ADD hadoop-2.7.7.tar.gz /usr/local
RUN mv /usr/local/hadoop-2.7.7 /usr/local/hadoop
ENV HADOOP_HOME /usr/local/hadoop
ENV PATH $HADOOP_HOME/bin:$PATH
 
RUN yum install -y which sudo vim net-tools
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
#在Dockerfile目录下
docker build -t hadoop:v2.7.7 .

 

 

3.3 编排docker-compose.yml

version: '3'
services:
  hadoop1:
   restart: always
   image: hadoop:v2.7.7
   ports:
    - "50070:50070"
    - "8088:8088"
   volumes:
    - "./.ssh1/:/root/.ssh/"
    - "./home/:/home/hadoop/"
    - "./etc/hadoop/:/usr/local/hadoop/etc/hadoop/"
    - "./env/.bashrc:/root/.bashrc"
   networks:
    default:
     ipv4_address: 172.23.0.10

  hadoop2:
   restart: always
   image: hadoop:v2.7.7
   volumes:
    - "./.ssh2/:/root/.ssh/"
    - "./home/:/home/hadoop/"
    - "./etc/hadoop/:/usr/local/hadoop/etc/hadoop/"
    - "./env/.bashrc:/root/.bashrc"
   networks:
    default:
     ipv4_address: 172.23.0.11

  hadoop3:
   restart: always
   image: hadoop:v2.7.7
   volumes:
    - "./.ssh3/:/root/.ssh/"
    - "./home/:/home/hadoop/"
    - "./etc/hadoop/:/usr/local/hadoop/etc/hadoop/"
    - "./env/.bashrc:/root/.bashrc"
   networks:
    default:
     ipv4_address: 172.23.0.12


networks:
  default:
   ipam:
    config:
     - subnet: 172.23.0.0/16

 

#在docker-compose.yml目录下
docker-compose up -d

PS:需要把容器内的/usr/local/hadoop/etc/hadoop/配置复制出来再进行映射。

 

3.4 修改配置

  • 生成密钥(在hadoop1、hadoop2、hadoop3容器内执行)
ssh-keygen
#一路回车
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop1
#输入密码,如果按我的来得话就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop2
#输入密码,如果按我的来得话就是qwe123
ssh-copy-id -i /root/.ssh/id_rsa -p 22 root@hadoop3
#输入密码,如果按我的来得话就是qwe123
  • 测试连通性(在hadoop1、hadoop2、hadoop3容器内执行)
ping hadoop1 
ping hadoop2
ping hadoop3
ssh hadoop1
ssh hadoop2
ssh hadoop3

 

  • 配置hadoop1
mkdir -p /home/hadoop/tmp /home/hadoop/hdfs_name /home/hadoop/hdfs_data
cd $HADOOP_HOME/etc/hadoop/
#修改core-site.xml
[root@9fa256d83f65 hadoop]# cat core-site.xml
<configuration>
<property>
    <name>fs.defaultFS</name>
    <value>hdfs://hadoop1: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
[root@9fa256d83f65 hadoop]# cat 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>hadoop1:9001</value>
 </property>
 <property>
   <name>dfs.webhdfs.enabled</name>
   <value>true</value>
 </property>
</configuration>
# mapred-site.xml
[root@9fa256d83f65 hadoop]# cat mapred-site.xml
<configuration>
<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
 </property>
 <property>
   <name>mapreduce.jobhistory.address</name>
   <value>hadoop1:10020</value>
 </property>
 <property>
   <name>mapreduce.jobhistory.webapp.address</name>
   <value>hadoop1:19888</value>
 </property>
</configuration>
#修改yarn-site.xml
[root@9fa256d83f65 hadoop]# cat yarn-site.xml
<configuration>
<property>
   <name>yarn.nodemanager.aux-services</name>
   <value>mapreduce_shuffle</value>
 </property>
 <property>
   <name>yarn.nodemanager.auxservices.mapreduce.shuffle.class</name>
   <value>org.apache.hadoop.mapred.ShuffleHandler</value>
 </property>
 <property>
   <name>yarn.resourcemanager.address</name>
   <value>hadoop1:8032</value>
 </property>
 <property>
   <name>yarn.resourcemanager.scheduler.address</name>
   <value>hadoop1:8030</value>
 </property>
 <property>
   <name>yarn.resourcemanager.resource-tracker.address</name>
   <value>hadoop1:8031</value>
 </property>
 <property>
   <name>yarn.resourcemanager.admin.address</name>
   <value>hadoop1:8033</value>
 </property>
 <property>
   <name>yarn.resourcemanager.webapp.address</name>
   <value>hadoop1:8088</value>
 </property>
</configuration>
#修改JAVA_HOME变量为jdk绝对路径
[root@9fa256d83f65 hadoop]# grep -Ev "^$|^[#;]" hadoop-env.sh
export JAVA_HOME=/usr/local/jdk1.8
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-"/etc/hadoop"}
for f in $HADOOP_HOME/contrib/capacity-scheduler/*.jar; do
  if [ "$HADOOP_CLASSPATH" ]; then
    export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:$f
  else
    export HADOOP_CLASSPATH=$f
  fi
done
export HADOOP_OPTS="$HADOOP_OPTS -Djava.net.preferIPv4Stack=true"
export HADOOP_NAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_NAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dhadoop.security.logger=ERROR,RFAS $HADOOP_DATANODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dhadoop.security.logger=${HADOOP_SECURITY_LOGGER:-INFO,RFAS} -Dhdfs.audit.logger=${HDFS_AUDIT_LOGGER:-INFO,NullAppender} $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_NFS3_OPTS="$HADOOP_NFS3_OPTS"
export HADOOP_PORTMAP_OPTS="-Xmx512m $HADOOP_PORTMAP_OPTS"
export HADOOP_CLIENT_OPTS="-Xmx512m $HADOOP_CLIENT_OPTS"
export HADOOP_SECURE_DN_USER=${HADOOP_SECURE_DN_USER}
export HADOOP_SECURE_DN_LOG_DIR=${HADOOP_LOG_DIR}/${HADOOP_HDFS_USER}
export HADOOP_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_SECURE_DN_PID_DIR=${HADOOP_PID_DIR}
export HADOOP_IDENT_STRING=$USER

 

 

 

#复制配置到其他节点
scp -r $HADOOP_HOME/ hadoop2:/usr/local/
scp -r $HADOOP_HOME/ hadoop3:/usr/local/
 
scp -r /home/hadoop hadoop2:/
scp -r /home/hadoop hadoop3:/
  • 配置环境变量(在hadoop1、hadoop2、hadoop3容器内执行)
echo 'export PATH=$PATH:$HADOOP_HOME/sbin' >> ~/.bashrc
source ~/.bashrc

 

 

  • 启动Hadoop master(在hadoop1执行)
#格式化hdfs
hdfs namenode -format
#启动hadoop
start-all.sh
#验证进程
[root@9fa256d83f65 hadoop]# jps 
9475 SecondaryNameNode
9159 NameNode
9945 NodeManager
9659 ResourceManager
9294 DataNode
13679 Jps

 

  • 启动hadoop slave(在hadoop2、hadoop3执行)
start-all.sh #验证进程
[root@7a76568d08d5 /]# jps
1537 NodeManager
1145 DataNode
2140 Jps

 

3.5 验证Hadoop集群

#上传文件
hdfs dfs -mkdir /mwf
echo hello > a.txt
hdfs dfs -put a.txt /mwf

[root@9fa256d83f65 /]# hdfs dfs -ls /mwf
Found 1 items
-rw-r--r--   2 root supergroup          6 2021-12-03 09:48 /mwf/a.txt

 

 

 3.6 Web界面

http://192.168.2.220:8088/cluster

http://192.168.2.220:50070/dfshealth.html#tab-overview

 

 

 

 

版权声明:
作者:lee
链接:https://www.goufusheng.top/archives/724
来源:苟浮生的桃花扇
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录