Hadoop详解及基于Dockerfile搭建Hadoop集群

Hadoop简介
Hadoop是Apache开源组织的一个分布式计算开源框架,提供了一个分布式文件系统子项目(HDFS)和支持MapReduce分布式计算的软件架构。
Hadoop主要功能是为我们提供了一个可靠的共享存储和分析系统。HDFS(Hadoop Distributed FileSysterm)实现数据的分布式存储,MapReduce(计算由map和reduce两部分组成)实现数据的分析和处理。

分布式系统是由一组通过网络进行通信、为了完成共同的任务而协调工作的计算机节点组成的系统。
分布式系统应具有如下特性:
1.分布性
分布式系统中的多台计算机之间在空间位置上可以随意分布,系统中的多台计算机之间没有主、从之分。
2.共享性
系统间的资源是相互共享的。
3.同一性
系统中的若干台计算机可以互相协作来完成一个共同的任务

Hadoop框架
Hadoop主要包括如下四个模块:

模块 详解
Hadoop Common 为其他hadoop模块提供基础设置
Hadoop HDFS 一个可靠的高吞吐的分布式文件系统,实现数据的分布式存储
Hadoop MapReduce 一个分布式的离线并行计算框架, 实现数据的分析和处理
Hadoop YARN 一个新的MapReduce框架,任务调度与资源管理

HDFS文件存储机制
HDFS的设计思想来源于谷歌的GFS(Google File System),Google发布的MapReduce论文中提出了基本的框架,在HDFS中得到了充分的体现。HDFS中的文件默认保存三份,所以一份丢失不会造成数据丢失,可以根据另外两份恢复回来。HDFS存储数据的基本单元是块(Block),大小为64M,Hadoop2.x版本后默认块的大小是128M。
Hadoop详解及基于Dockerfile搭建Hadoop集群_第1张图片HDFS 有两种Node,一种是NameNode,负责记录具体数据的元数据信息,另一种是DataNode,DataNode是文件系统的工作节点,他们根据客户端或者是NameNode的调度存储和检索数据,并且定期向NameNode发送他们所存储的块(block)的列表,而NameNode则会负责保持文件的副本数量。文件会按照固定的大小切成若干块后分布式存储在若干台DataNode上,每一个文件块可以有多个副本,并存放在不同的DataNode上。客户端请求访问HDFS都是通过向NameNode申请来进行。

NameNode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建,这里的NameNode有两个,另一个主要作用是分担主NameNode的一部分工作负载。每一个文件的副本 存储在不同的节点上,可以通过配置,让HDFS感知机架,这样副本会存储在不通的机架上,即使整个机架坏掉,数据也是可以恢复的。不同副本之间的数据复制由HDFS负责。在NameNode和DataNode之间维持着心跳NameNode能够感知DataNode的状态,DataNode变得不可用,会启用副本复制。

MapReduce计算框架
MapReduce设计理念是移动计算而不是移动数据,就是把分析计算的程序,分别拷贝一份到不同的机器上,而不是移动数据。
在运行一个MapReduce计算任务时候任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值(key/value)作为输入(input)和输出(output)。而程序员要做的就是定义好这两个阶段的函数:map函数和reduce函数

常见的计算框架有:MapReduce离线计算框架 适合离线计算。storm流式计算框架,适合实时计算。sprak内存计算框架
适合快速得到结果的计算。

MapReduce 是一种分而治之的思想,谷歌在论文中提出的这种思想成为了后来分布式任务处理的标准。Map是映射,Reduce则是归约,对于输入的数据来说,先需要分片,然后通过Map对数据进行处理,处理的结果是k/v。这个k/v是针对每个map接收到的分片进行的操作,每一个map操作输出至少一个key/value对,根据map的key对map的输出先进行合并,每一个key对应一个reduce,各个reduce做各自的处理。例如下图统计每个单词出现的次数:
Hadoop详解及基于Dockerfile搭建Hadoop集群_第2张图片input输入是一个大文件,split将文件分解为多个片段,map的输入和输出必须是键值。shuff可以把map的输出按照某种key值重新切分和组合成n分,把key值符合某种范围的输出送到reduce那里处理,可以简化reduce过程,在这里shuff就是对map的输出进行合并和排序,key相同的合并到一个数据块中,然后再把key相同的数据块作为集合传给reduce。reduce作用是对map阶段的输出结果进行汇总,可以根据map输出数据量大小决定reduce个数(默认是1,可以在mapred-site.xml中配置)。

搭建Hadoop集群
1.相关环境

软件 版本
CentOS CentOS Linux release 7.5
Docker Docker version 1.13.1
Hadoop hadoop-3.0.0.tar.gz

2.Hadoop集群规划

IP 节点
10.168.14.49 hadoop-master
10.168.14.50 hadoop-slave1
10.168.14.51 hadoop-slave2

3.Docker环境安装
首先我们在三台虚拟机上分别安装Docker环境。

# 1.安装docker
$ sudo yum -y install docker

# 2.查看docker是否安装成功
$ docker --version
Docker version 1.13.1, build 07f3374/1.13.1

# 3.配置Docker镜像加速器
$ sudo vi /etc/docker/daemon.json
{
     "registry-mirrors": ["https://3bg6cl5j.mirror.aliyuncs.com"]}

# 重启Docker
sudo systemctl daemon-reload
sudo systemctl restart docker

若提示找不到docker包执行命令:sudo yum -y update

4.编写Dockerfile
我们通过Dockerfile的方式构建自己的Hadoop镜像
1.构建Centos-ssh镜像

FROM centos:7
MAINTAINER will
ENV REFRESHED_AT 2019-03-14

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:st123456" | chpasswd
RUN echo "root   ALL=(ALL)       ALL" >> /etc/sudoers
RUN ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
RUN cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
 
RUN mkdir /var/run/sshd
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

执行命令构建centos-ssh镜像

sudo docker build -t wxt/centos7-ssh:1.0 . -f Dockerfile

2.构建Hadoop-base镜像

FROM wxt/centos7-ssh:1.0
MAINTAINER will

ENV REFRESHED_AT 2019-03-14

ADD jdk-8u201-linux-x64.tar.gz /usr/local/nlp/

ENV JAVA_HOME /usr/local/nlp/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $PATH:$JAVA_HOME/bin
 
ADD hadoop-3.0.0.tar.gz /usr/local/nlp/
ENV HADOOP_HOME /usr/local/nlp/hadoop-3.0.0
ENV PATH $HADOOP_HOME/bin:$PATH
 
RUN yum install -y which sudo

执行命令构建hadoop-base镜像

sudo docker build -t wxt/hadoop-base:1.0 . -f Dockerfile

需要注意的是jdk-8u201-linux-x64.tar.gz与hadoop-3.0.0.tar.gz,必须与Dockerfile在同一目录。
使用ADD/COPY命令 源文件必须和Dockfile位于同一目录下(使用绝对路径是没用的,会提示找不到你的源文件)

5.上传镜像到阿里云镜像中心

# 1. 构建镜像
$ sudo docker build -t wxt/hadoop-base:1.0 . -f Dockerfile

# 2. 查看镜像
$ sudo docker images
REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
wxt/hadoop-base                                   1.0                 f9a67bf860d1        27 minutes ago      1.61 GB
wxt/centos7-ssh                                   1.0                 3159589a9267        30 minutes ago      364 MB
docker.io/centos                                  7                   1e1148e4cc2c        3 months ago        202 MB

# 3. 登陆阿里云镜像中心(Registry)
$ sudo docker login --username=wang374441 registry.cn-hangzhou.aliyuncs.com

# 4. 新建镜像Tag
$ sudo docker tag 3b91c629efcd registry.cn-hangzhou.aliyuncs.com/wxt-img/centos7-ssh:1.0
$ sudo docker tag 3b91c629efcd registry.cn-hangzhou.aliyuncs.com/wxt-img/hadoop-base:1.0

# 5. 上传镜像到阿里云镜像中心
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/wxt-img/centos7-ssh:1.0
$ sudo docker push registry.cn-hangzhou.aliyuncs.com/wxt-img/hadoop-base:1.0

登陆阿里云镜像中心时出现如下错误,则需要在容器镜像服务管控平台设置Registry密码
Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthorized: authentication required

5.运行Hadoop-master
我们在虚拟机10.168.14.49上运行Hadoop-master,执行如下命令:

# 1. 运行hadoop-master镜像
$ sudo docker run --privileged  --name hadoop-master --hostname hadoop-master -d -P -p 8101:50070 -p 8102:8088 wxt/hadoop-base:1.0 /usr/sbin/init

# 2. 查询hadoop-master容器运行情况
$ sudo docker ps

# 3. 进入hadoop-master容器
$ sudo docker exec -it hadoop-master bash

1.进入容器中hadoop目录/usr/local/nlp/hadoop-3.0.0/etc/hadoop修改如下配置文件:

配置文件
hadoop-env.sh
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml

(1). vi hadoop-env.sh

export JAVA_HOME=/usr/local/nlp/jdk1.8.0_201

(2). vi core-site.xml

<configuration>
	<property>
			<name>fs.defaultFS</name>
			<value>hdfs://hadoop-master/</value>
	</property>
	<property> 
		<name>hadoop.tmp.dir</name> 
		<value>/usr/local/hadoop/tmp</value> 
	</property> 
	<property> 
		<name>fs.trash.interval</name> 
		<value>1440</value> 
	</property>
</configuration>

(3). vi hdfs-site.xml

<configuration> 
	<property> 
		<name>dfs.replication</name> 
		<value>1</value> 
	</property> 
	<property> 
		<name>dfs.permissions</name> 
		<value>false</value> 
	</property> 
	<property>
  		<name>dfs.http.address</name>
  		<value>0.0.0.0:50070</value>
	</property> 
</configuration>

(4). vi yarn-site.xml

<configuration> 
	<property> 
		<name>yarn.nodemanager.aux-services</name>
		<value>mapreduce_shuffle</value>
	</property> 
	<property> 
		<name>yarn.log-aggregation-enable</name> 
		<value>true</value> 
	</property> 
</configuration>

(5). vi mapred-site.xml

<configuration>
    <property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

2.进入容器目录/usr/local/nlp/hadoop-3.0.0/sbin,修改start-dfs.sh,stop-dfs.sh;start-yarn.sh, stop-yarn.sh。

(1). vi start-dfs.sh ,stop-dfs.sh,在开头新增如下配置:

#!/usr/bin/env bash
HDFS_DATANODE_USER=root  
HDFS_DATANODE_SECURE_USER=hdfs  
HDFS_NAMENODE_USER=root  
HDFS_SECONDARYNAMENODE_USER=root 

(2). vi start-yarn.sh ,stop-yarn.sh,在开头新增如下配置:

#!/usr/bin/env bash
YARN_RESOURCEMANAGER_USER=root
HDFS_DATANODE_SECURE_USER=yarn
YARN_NODEMANAGER_USER=root

3.格式化hdfs

$ bin/hdfs namenode -format
  1. 启动Hadoop
# 1. 启动hadoop
$ sbin/start-all.sh

# 2. 查看运行情况
$ jsp
# 3.出现如下则说明运行成功
5204 ResourceManager
4708 DataNode
5509 NodeManager
4952 SecondaryNameNode
5818 Jps
4575 NameNode

6.浏览器访问Hadoop
由于启动时,我们进行了端口映射:8101:50070 8102:8088,我们访问如下地址:http://10.168.14.49:8101 ;http://10.168.14.49:8102就可以看我我们的hadoopweb页面。
Hadoop详解及基于Dockerfile搭建Hadoop集群_第3张图片Hadoop详解及基于Dockerfile搭建Hadoop集群_第4张图片
7.配置Hadoop-slave
1.我们进入虚拟机10.168.14.50,从阿里云镜像中心pull我们的镜像centos-ssh及hadoop-base

# 1. 登录阿里云镜像中心
$ sudo docker login --username=wang374441 registry.cn-hangzhou.aliyuncs.com
Password: 
Login Succeeded
# 2. 从阿里云镜像中心pull镜像文件
sudo docker pull registry.cn-hangzhou.aliyuncs.com/wxt-img/centos7-ssh:1.0
sudo docker pull registry.cn-hangzhou.aliyuncs.com/wxt-img/hadoop-base:1.0
  1. 运行Hadoop-slave
sudo docker run --privileged -t -i --name hadoop-slave1 --hostname hadoop-slave1 -d wxt/hadoop-base:1.0 /usr/sbin/init
  1. 进入hadoop-slave1容器修改hadoop配置
    相关配置与hadoop-master保持一致。
  2. 修改hadoop-master 与 hadoop-slave1 的hosts文件新增如下配置
$ vi /etc/hosts

10.168.14.49 hadoop-master
10.168.14.51 hadoop-slave1
10.168.14.50 hadoop-slave2

5.启动 hadoop-slave1

$ sbin/start-all.sh

6.进入hadoop-master容器,在hadoop安装目录/etc/hadoop下新增文件:slaves,新增如下配置:

$ vi slaves

hadoop-slave1
hadoop-slave2

虚拟机10.168.14.51配置与10.168.14.50一致,至此我们的hadoop集群搭建完成。

如需修改hadoop默认的ssh端口,可以修改安装目录下/etc/hadoop/hadoop-env.sh文件,新增如下配置:
export HADOOP_SSH_OPTS="-p 42014"

你可能感兴趣的:(Hadoop,Hadoop,Docker)