一、简史
1、Hadoop主要为了解决两个问题
- 海量数据存储 HDFS
- 海量数据运算 MapReduce
2、hadoop的起源
起源于一个开源的项目nutch,
Hadoop源于谷歌的三篇论文:
- GFS(google fileSystem),
- BigTable(key,value对的非关系型数据库)
- MapReduce(分布式计算框架)
狭义的Hadoop:
- HDFS+MapReduce
广义的Hadoop:
- 指代一个大数据软件的生态圈,包括各种周边的其他框架(Hive,HBase,Spark....)
3、三大主流公司
hadoop的发行版本:主要从0.x到1.x到2.x这三个主流的版本
- apache开源版本:commiter
- 优点:版本更新迭代比较快,所有的软件都有对应的迭代
- 缺点:版本的升级,兼容,维护等都比较麻烦
- 实际生产环境当中,尽量不要使用apache的版本
- 免费开源版本hortonworks:软件的安装,升级等都做了
- 服务收费版本cloudera:软件有收费版,也有免费版
- MapR:大数据软件厂商
4、hadoop的架构模型
1.x的版本架构模型介绍
文件系统核心模块:
- NameNode:集群当中的主节点,主要用于管理集群当中的各种数据(主要维护元数据信息,元数据信息就是表述数据的数据)
- secondaryNameNode:主要能用于hadoop当中元数据信息的辅助管理
- DataNode:集群当中的从节点,主要用于存储集群当中的各种数据
数据计算核心模块:
- JobTracker:接收用户的计算请求任务,并分配任务给从节点
- TaskTracker:负责执行主节点JobTracker分配的任务
1.x当中,主节点 namenode jobtracker都存在单节点故障问题
2.x的版本架构模型介绍
第一种:NameNode与ResourceManager单节点架构模型
第二种:NameNode单节点与ResourceManager高可用架构模型
第三种:NameNode高可用与ResourceManager单节点架构模型
第四种:NameNode与ResourceManager高可用架构模型
文件系统核心模块:
- NameNode:集群当中的主节点,主要用于管理集群当中的各种数据,一般都是使用两个,实现HA高可用
- DataNode:从节点,用于数据的存储
- secondaryNameNode:主要负责瞄着active什么时候死了,赶紧上位 两个namenode组成主备的架构
- 如果namenode高可用:就没有secondaryNamenode了,取而代之的是journalNode:主要用于同步元数据信息,保证两个namenode的元数据信息是一致的
- nameNode active状态:主要负责用户的写请求
- namenode高可用的自动切换,主要是通过两个守护进程zkfc来实现的
数据计算核心模块:
- ResourceManager:Yarn平台的主节点,主要用于接收各种任务,通过两个,构建成高可用
- NodeManager:Yarn平台的从节点,主要用于处理ResourceManager分配的任务
二 、拓展
1、FastLeaderElection是zookeeper默认提供的选举算法
选举流程
目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下:
- 1. 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属于Looking。
- 2. 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票数没有大于半数,所以两个服务器的状态依然是LOOKING。
- 3. 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投票数正好大于半数,所以服务器3成为leader,服务器1,2成为follower。
- 4. 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜出,所以服务器4只能成为follower。
- 5. 服务器5启动,后面的逻辑同服务器4成为follower。
2、zookeeper四种类型的znode
1、PERSISTENT-持久化目录节点
客户端与zookeeper断开连接后,该节点依旧存在
2、PERSISTENT_SEQUENTIAL-持久化顺序编号目录节点
客户端与zookeeper断开连接后,该节点依旧存在,只是Zookeeper给该节点名称进行顺序编号
3、EPHEMERAL-临时目录节点
客户端与zookeeper断开连接后,该节点被删除
4、EPHEMERAL_SEQUENTIAL-临时顺序编号目录节点
客户端与zookeeper断开连接后,该节点被删除,只是Zookeeper给该节点名称进行顺序编号
3、Zookeeper对节点的watch监听通知是永久的吗?
不是。官方声明:一个Watch事件是一个一次性的触发器,当被设置了Watch的数据发生了改变的时候,则服务器将这个改变发送给设置了Watch的客户端,以便通知它们。
为什么不是永久的,举个例子,如果服务端变动频繁,而监听的客户端很多情况下,每次变动都要通知到所有的客户端,这太消耗性能了。
4、集群如果有3台机器,挂掉一台集群还能工作吗?挂掉两台呢
过半存活即可用。
5、集群支持动态添加机器吗
其实就是水平扩容了,Zookeeper在这方面不太好。
两种方式:
全部重启:关闭所有Zookeeper服务,修改配置之后启动。不影响之前客户端的会话。
逐个重启:在重启的过程中,需要保证一台机器重启完成后,再进行下一台机器的重启。这样就整个集群中每个时刻只有一台机器不能正常工作,而集群中有过半的机器是正常工作的,那么整个集群对外就是可用的。所以这个时候不会出现错误,也不会出现停止服务,整个扩容过程对用户是无感知的。
三、环境搭建
apache软件下载地址:
http://archive.apache.org/dist/
cdh所有软件下载地址:
http://archive.cloudera.com/cdh5/cdh/5/
分布式环境搭建(适用于工作当中正式环境搭建)
使用完全分布式,实现namenode高可用,ResourceManager的高可用
| 192.168.1.100 | 192.168.1.110 | 192.168.1.120 |
zookeeper | zk | zk | zk |
HDFS | JournalNode | JournalNode | JournalNode |
NameNode | NameNode |
| |
ZKFC | ZKFC |
| |
DataNode | DataNode | DataNode | |
YARN |
| ResourceManager | ResourceManager |
NodeManager | NodeManager | NodeManager | |
MapReduce |
|
| JobHistoryServer |
hadoop安装包结构
hadoop-2.7.5/bin:一些shell脚本,供我们使用
hadoop-2.7.5/sbin:一些shell脚本,供我们使用
hadoop-2.7.5/etc/hadoop:所有的配置文件的路径
hadoop-2.7.5/lib/native:本地的C程序库
检测hadoop的本地程序库
bin/hadoop checknative
hadoop: true 本地库,支持我们使用C程序来访问hadoop
zlib: true 压缩库
snappy: false 压缩库 谷歌出品的一种压缩算法,谷歌出品,必属精品
lz4: true 压缩库
bzip2: false 压缩库
hadoop 六个核心配置文件的作用:
core-site.xml:核心配置文件,主要定义了我们文件访问的格式 hdfs://
hadoop-env.sh:主要配置我们的java路径
hdfs-site.xml:主要定义配置我们的hdfs的相关配置
mapred-site.xml 主要定义我们的mapreduce相关的一些配置
slaves:控制我们的从节点在哪里 datanode nodemanager在哪些机器上
yarn-site.xml:配置我们的resourcemanager资源调度
安装包解压
修改配置文件
启动集群