1. hadoop简介
Hadoop起源于Google的三大论文:
(1)GFS:Google的分布式文件系统Google File System
(2)MapReduce:Google的MapReduce开源分布式并行计算框架
(3)BigTable:一个大型的分布式数据库演变关系:
(1)GFS—->HDFS
(2)Google MapReduce—->Hadoop MapReduce
(3)BigTable—->HBaseHadoop名字不是一个缩写,是Hadoop之父Doug Cutting儿子毛绒玩具象命名的。
hadoop主流版本:
(1)Apache基金会hadoop
(2)Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称“CDH”)
(3)Hortonworks版本(Hortonworks Data Platform,简称“HDP”)

Hadoop的框架最核心的设计就是:HDFS和MapReduce。
(1) HDFS为海量的数据提供了存储。
(2) MapReduce为海量的数据提供了计算。
HDFS存储理念是以最少的钱买最烂的机器并实现最安全、难度高的分布式文件系统(高容错性低成本),HDFS认为机器故障是种常态,所以在设计时充分考虑到单个机器故障,单个磁盘故障,单个文件丢失等情况。
HDFS容错机制:
节点失败监测机制:DN每隔3秒向NN发送心跳信号,10分钟收不到,认为DN宕机。
通信故障监测机制:只要发送了数据,接收方就会返回确认码。
数据错误监测机制:在传输数据时,同时会发送总和校验码。

示意图如下,客户首先根据DFS找NN节点,NN节点根据客户的要求(文件分为128M的块,设置三个副本)建立DataNode 和块文件映射的元数据,然后NN节点根据距离的远近,把最近的DN地址告诉客户的HDFS系统,HDFS把数据以块的形式存书到DN1上,DN1收到的同时,还把文件发给DN2,DN2发给dn3。最后一个DN3节点都收到了,回馈给NN消息,已收到。一个块完成后,再来一遍传输下一个块

在这里插入图片描述
Hadoop框架包括以下四个模块:
(1) Hadoop Common: 这些是其他Hadoop模块所需的Java库和实用程序。这些库提供文件系统和操作系统级抽象,并包含启动Hadoop所需的Java文件和脚本。
(2) Hadoop YARN: 这是一个用于作业调度和集群资源管理的框架。
(3) Hadoop Distributed File System (HDFS): 分布式文件系统,提供对应用程序数据的高吞吐量访问。
(4) Hadoop MapReduce:这是基于YARN的用于并行处理大数据集的系统。
hadoop应用场景:
在线旅游
移动数据
电子商务
能源开采与节能
基础架构管理
图像处理
诈骗检测
IT安全
医疗保健
HDFS属于Master与Slave结构。一个集群中只有一个NameNode,可以有多个DataNode。
HDFS存储机制保存了多个副本,当写入1T文件时,我们需要3T的存储,3T的网络流量带宽;系统提供容错机制,副本丢失或宕机可自动恢复,保证系统高可用性。
HDFS默认会将文件分割成block。然后将block按键值对存储在HDFS上,并将键值对的映射存到内存中。如果小文件太多,会导致内存的负担很重。
HDFS采用的是一次写入多次读取的文件访问模型。一个文件经过创建、写入和关闭之后就不需要改变。这一假设简化了数据一致性问题,并且使高吞吐量的数据访问成为可能。
2、hadoop安装
准备五台虚拟机
NN(namenode) | DN(datanode) | |
虚拟机 | vm1,vm5 | vm2,vm3,vm4 |
内存 | 2G | 1G |
IP | 172.25.10.11/15 | 172.25.10.12/13/14 |
参考操作手册:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
先开启vm1,准备hadoop的压缩包和java的jdk压缩包
创建hadoop用户,切换为hadoop用户,解压jdk压缩包并做软连接方便使用

进入目录,修改环境变量env的配置文件

指定刚才创建的软连接,注意顶格写

创建目录,复制一些xml文件用作测试页面

调用hadoop指令,过滤以dfs开头的关键字输出到output(output目录自动创建)
[hadoop@vm1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar grep input output 'dfs[a-z.]+'查看output目录

3、伪分布式部署
官方文档:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html
让vm1既作NN也作DN
伪分布式:一台机器有多个节点放在一起,namenode(master)和datanode(存数据的)在一起,但是执行的分布式程序
进入hadoop/etc/hadoop目录,编辑文件

定义副本数为1

然后再编辑core-site.xml文件,指定HDFS的NN IP,由于我们使用的是伪分布式,主从在一起,所以可以使用localhost,端口号为9000

上面提到主从一起,所以worker也是localhost,创建ssh密钥

切换到root用户,给hadoop一个密码,再回到hadoop用户,将密钥给localhost


进入软连接目录,初始化HDFS,格式化namenode
[hadoop@vm1 hadoop]$ bin/hdfs namenode -format
初始化后查看存放在/tmp目录下的数据
调用sbin下的脚本,开启HDFS

类似于ps,java里也有查看进程的命令(jps),但是默认相对路径无法打开,所以修改家目录下的bash的环境变量文件

所以我们将java的脚本添加到.bash_profile文件中

接下来我们重新读取环境变量,用jps查看HDFS进程,可以看到NN和DN都开启了

网页访问本机9870端口,9870是hadoop默认的监听端口,9000是Namenode和Datanode的连接端口

创建HDFS下的虚拟目录/user和子目录/hadoop,该子目录的名字hadoop必须与操作用户hadoop一致

查看文件系统,目录创建

把input目录上传到分布文件系统,查看成功

在文件系统里查看

统计单词数方式输出到output,和本地input和output都没有关系(读取的是分布式文件系统的目录)

output目录已有


删除output目录,没有影响,因为已经上传到了HDFS

重新get一下,本地又有了

4、完全分布式部署
开启虚拟机vm2,vm3,vm4 做DN
完全分布式需要将DN和NN(vm1)分开
在vm1上编辑文件

修改副本数为2

编辑文件

由于完全分布式的NN和DN不在一起,所以需要指定IP

workers指定ND节点

在vm1上安装nfs

编辑nfs策略文件,共享hadoop目录,权限是读写,匿名用户uid和gid都是1000,对应hadoop用户,然后重启nfs、
showmount -e 显示NFS服务的输出清单

在vm2,vm3上安装nfs和hadoop

将vm1上的共享目录挂载到自己的hadoop目录下,切换到hadoop目录,查看目录发现挂载成功

vm3也执行上述操作vm1对vm2,vm3免密

vm1把之前的伪分布式的部署停掉,重新初始化完全分布式,因为nfs系统所有节点的/home/hadoop都是同步修改过的,所以不需要给vm2和vm3修改配置文件。

[hadoop@vm1 hadoop]$ bin/hdfs namenode -format
启动dfs使用jps查看,vm1是NN,还有一个SN是作为冷备的

vm2,vm3是DN节点


进入网页查看发现vm2,3已经添加进来

创建虚拟目录,上传input

统计单词数上传到output目录
[hadoop@vm1 hadoop]$ bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.2.1.jar wordcount input output上传成功,部署结束

如果我们要再添加一个节点到HDFS,怎么做?
在vm4上安装nfs,vm4创建hadoop用户,共享目录挂载到自己的/home/hadoop
在vm1上,切换hadoop用户,修改worker文件,添加vm4(所有节点的worker文件都跟着变动了,因为nfs)


vm4开启DN节点,jps可以看到成功变为DN节点


5、资源管理器YARN – ResourceManager部署
负责全局的资源管理和任务调度,把整个集群当成计算资源池,只关注分配,不管应用,且不负责容错。

任务调度:
1只关注资源的使用情况,根据需求合理分配资源
2Scheluer可以根据申请的需要,在特定的机器上申请特定的资源(ApplicationMaster负责申请资源时的数据本地化的考虑,ResourceManager将尽量满足其申请需求,在指定的机器上分配Container,从而减少数据移动)
编辑文件
[hadoop@vm1 hadoop]$ pwd
/home/hadoop/hadoop/etc/hadoop
[hadoop@vm1 hadoop]$ vim mapred-site.xml添加mapreduce模块,添加hadoop_mapred_home变量,等会需要设置让这个变量指定hadoop目录

编辑文件
[hadoop@vm1 hadoop]$ vim yarn-site.xml给DN添加nodemanage模块

编辑文件
[hadoop@vm1 hadoop]$ vim 指定hadoop_mapred_home变量的路径

进入hadoop软连接目录,开启yarn,使用jps查看发现多了一个进程资源管理器,vm1是RM资源管理者的节点

其他节点jps查看也多了一个进程,是资源管理的节点



vm1开启了8088端口

网页访问可以进行资源管理

















