目录
- 一、hadoop简介
- 二、hadoop的安装与部署
- 1、hadoop的安装
- 2、hadoop的伪分布式部署
- 3、hadoop的完全分布式部署
- 三、资源管理器YARN – ResourceManager部署
一、hadoop简介
- Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上,即性价比极高;而且它提供高吞吐量(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序。HDFS放宽了(relax)POSIX的要求,允许以流的形式访问(streaming access)文件系统中的数据。
- Hadoop的框架最核心的设计就是:HDFS 和 MapReduce。HDFS为海量的数据提供了存储,而MapReduce则为海量的数据提供了计算。Hadoop 最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce 引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心 。
- 对外部客户机而言,HDFS就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构采用 master/slave (主从)架构,是基于一组特定的节点构建的,这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务。DataNode(DN),它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 1.x版本的一个缺点(单点失败)。在Hadoop 2.x版本可以存在两个NameNode,解决了单节点故障问题 。存储在 HDFS 中的文件被分成块,然后将这些块复制到多个DataNode中。块的大小(1.x版本默认为 64MB,2.x版本默认为128MB)和复制的块数量在创建文件时由客户机决定。由于块是128M的大小,那么如果小文件太多,会导致内存的负担很重。HDFS 内部的所有通信都基于标准的 TCP/IP 协议 。
如上图所示,客户首先根据DFS找NN节点,NN节点根据客户的要求(文件分为128M的块,设置三个副本)建立DataNode 和块文件映射的元数据,然后NN节点根据距离的远近,把最近的DN地址告诉客户的HDFS系统。HDFS把数据以块的形式存书到DN1上,DN1收到的同时,还把文件发给DN2,DN2发给DN3。最后一个DN3节点都收到了,回馈给NN消息,已收到。一个块完成后,再来一遍传输下一个块。
- HDFS容错机制:
节点失败监测机制:DN每隔3秒向NN发送心跳信号,10分钟收不到,认为DN宕机。
通信故障监测机制:只要发送了数据,接收方就会返回确认码。
数据错误监测机制:在传输数据时,同时会发送总和校验码。 - 对于副本的存储。假如第一个副本在第一个机架上存储,第二个副本不能和第一个副本在同一个机架上,也不能在同一个DN。假如第二个副本放在第二个机架,第三个副本要和第二个副本在同一个机架上,但不在同一个DN上。后面的副本就不做限制了。
二、hadoop的安装与部署
1、hadoop的安装
- 实验环境:首先准备三台虚拟机;
server9(172.25.36.9)NN;
server7(172.25.36.7)、server8(172.25.36.8)、server10(172.25.36.10)DN;
分别分配2G内存。
安装过程可以参考操作手册:点击
准备hadoop软件压缩包及提供支持的jdk压缩包
创建hadoop用户,将压缩文件移动至hadoop用户家目录下,切换为hadoop用户;
解压jdk压缩包并做软连接方便使用,解压hadoop压缩包并做软连接方便使用
进入hadoop/etc/hadoop目录,修改环境变量hadoop-env.sh文件,配置hadoop环境,指定hadoop及java位置
创建input目录,复制一些xml文件用作后面的输入测试
执行测试命令,使用hadoop-mapreduce-example示例文件
测试命令,抓取input目录中以dfs开头的每个匹配项,并保存到output目录下
查看output内容
2、hadoop的伪分布式部署
使用一台虚拟机server9即做NN也做DN。伪分布式:一台机器有多个节点放在一起,namenode(master)和datanode(存数据)在一起,但是执行的分布式程序。
进入hadoop/etc/hadoop目录,编辑hdfs-site.xml文件
先指定副本数量为1
编辑core-site.xml文件
指定 hdfs 名称节点(NN)的ip,由于这里是伪分布式,主从都在一起,所以可以写localhost,端口为9000
因为主从都是自己,所以worker文件里面也写的localhost;
生成ssh密钥
切换root用户给hadoop用户设置密码,设置hadoop密码为westos
切换为hadoop用户,把密钥给localhost(设置localhost免密登陆)
测试免密登陆
进入软连接目录,初始化hdfs
成功初始化后,/tmp就有数据了,数据都是存放在/tmp的;
执行hdfs启动脚本
类似于ps ax,java里面有jps命令可以查看开启进程,但是默认相对路径无法打开,所以修改家目录下的bash的环境变量文件,
把home/java/bin添加进去
重新读取环境变量文件,现在使用jps可以看到DN和NN都启动了
相应的端口也开放了(hadoop默认的监听端口)
访问172.25.36.9:9870,9000是Namenode和Datanode的连接端口
查看节点信息
创建分布式用户目录/user/hadoop(该子目录的名字hadoop必须与操作用户hadoop一致)
查看文件系统,已有虚拟目录/user/hadoop
从本地上传input目录到分布文件系统
查看导入目录
已有虚拟目录/user/hadoop/input
测试命令,以单词数的方式输出为output目录
查看dfs有output目录了
现在删除本地的output文件,使用dfs查看output还是在的,因为已经上传到文件系统里了
下载output目录,本地就有了
3、hadoop的完全分布式部署
完全分布式,需要把NN(server9)和DN分开;
首先执行脚本,停止hdfs
workers文件中指定server7和server8是数据节点
server9修改etc/hadoop/core-site.xml 文件,由于是完全分布式,必须指定ip
server9修改etc/hadoop/hdfs-site.xml文件,副本数改为2
server9安装nfs
配置nfs策略,共享/home/hadoop目录,权限为读写,匿名用户uid和gid都是1000,对应hadoop用户;
重启nfs,showmount -e:显示NFS服务器上所有的共享目录
server7创建用户hadoop,安装nfs
server8创建用户hadoop,安装nfs
server7/8挂载172.25.36.9:/home/hadoop/ 到自己的hadpood用户家目录下;
切换hadoop用户,查看成功共享
由于进行了完全分布式部署,需要重新初始化hdfs
server7/8挂载nfs后,主机可以免密登陆,测试免密
开启hdfs,jps查看server7是NN节点,还有一个secondarynamenode是作为冷备的
jps查看server7/8是DN节点
网页查看两个DN节点已经成功加入
创建虚拟目录/user/hadoop,上传input目录
单词数抓取,输出output目录
网页查看成功上传,部署完成
当我们想再添加一个DN节点(server10)到HDFS时,也很简单,首先server10安装nfs
server10创建hadoop用户
将共享目录挂载到自己的/home/hadoop,切换hadoop用户,查看成功共享
修改worker文件,添加server10(所有节点的worker文件都跟着变动了,因为nfs)
server10开启DN节点,jps可以看到成功变为DN节点
网页查看,成功添加DN节点
可以看到,每个数据块大小是128M
三、资源管理器YARN – ResourceManager部署
负责全局的资源管理和任务调度,把整个集群当成计算资源池,只关注分配,不管应用,且不负责容错。
资源管理:
- 以前资源是每个节点分成一个个的Map slot和Reduce slot,现在是一个个Container,每个Container可以根据需要运行ApplicationMaster、Map、Reduce或者任意的程序;
- 以前的资源分配是静态的,目前是动态的,资源利用率更高;
- Container是资源申请的单位,一个资源申请格式:<resource-name, priority, resource-requirement, number-of-containers>,resource-name:主机名、机架名或*(代表任意机器), resource-requirement:目前只支持CPU和内存;
- 用户提交作业到ResourceManager,然后在某个NodeManager上分配一个Container来运行ApplicationMaster,ApplicationMaster再根据自身程序需要向ResourceManager申请资源;
- YARN有一套Container的生命周期管理机制,而ApplicationMaster和其Container之间的管理是应用程序自己定义的。
任务调度:
- 只关注资源的使用情况,根据需求合理分配资源;
- Scheluer可以根据申请的需要,在特定的机器上申请特定的资源(ApplicationMaster负责申请资源时的数据本地化的考虑,ResourceManager将尽量满足其申请需求,在指定的机器上分配Container,从而减少数据移动)。
server9编辑etc/hadoop/mapred-site.xml文件
添加mapreduce模块,这里使用了一个hadoop_mapred_home变量,之后要看看是否指定了该变量
编辑yarn-site.xml文件,server9给DN添加nodemanage模块
编辑hadoop-env.xml变量定义文件
指定hadoop_mapred_home变量的路径
server9回到软连接目录,开启yarn,jps查看,server1是RM资源管理者
jps查看,server7/8/10多了NM节点管理角色
web端口,显示调度器的信息;
server9开启了8088端口
网页访问172.25.36.9:8088查看yarn资源管理页面