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。
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做各自的处理。例如下图统计每个单词出现的次数:
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
$ 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页面。
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
sudo docker run --privileged -t -i --name hadoop-slave1 --hostname hadoop-slave1 -d wxt/hadoop-base:1.0 /usr/sbin/init
$ 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"