什么是Hadoop?
Hadoop是apache旗下的一款开源的软件平台。
Hadoop提供的功能:利用服务器集群,根据用户的业务逻辑,对海量数据进行分布式处理。
多个服务器进行并行计算,把最后的结果汇总。
- 集群
多台服务器的方式,每台服务器可以【独自】完成工作。(可以自己完成工作,也可以分给别人一起做) - 分布式
多台服务器【共同】完成一个或多个工作。(必须多台机器一起完成)
Hadoop的主要组成:
- common:基础功能组件,提供基础功能服务(通信)
- HDFS:分布式文件系统
- YARN:资源调度系统
- MapReduce:分布式离线计算框架
yarn调度资源给mapreduce进行作业,通过从hdfs调用数据(hdfs提供底层的存储数据)进行计算,都是需要common进行通信。
什么是HDFS?
HDFS是hadoop的分布式文件系统,采用的是集群的方式来存储海量数据。
HDFS的核心思想
关键字:分而治之
- HDFS将大文件切分成多个块(block)来存储,默认是按照128M每个块进行数据的存储。
- 为保证数据块(block)的高可靠,不丢失。一般会对数据进行冗余备份,即使一台服务器宕机了,也不会导致数据的丢失。一般默认是备份3个副本到不同的服务器上。
HDFS的优缺点
- 支持超大文件的存储,但是只能把超大文件当作是一个整体,很难对其中的某一行进行操作。
- HDFS是一个超大的仓库(数据仓库),不管用户放什么文件,什么格式的文件,多大的文件都能存储下来。但是与mysql(数据库)相比,mysql存储数据非常严谨,必须符合规范才能存储。而HDFS存储的文件不能针对单条记录进行增删改查。
- 支持大规模并发读取,大规模并发写入比较差。
- HDFS不支持超多的小文件存储。
HDFS的架构
- 主节点namenode:集群的老大,管理文件系统的目录树,处理客户端的读写请求。(nn可以理解为是一本书的目录)
- secondarynamenode:严格来说并不是namenode的备份节点,主要给namenode分担内存压力。但是实际工作中不会用2nn,而是再搭建一个nn(即使存在多个nn,也只能有一个nn处于active活跃状态。)
- 从节点datanode:存储整个集群的所有数据块,处理真正的数据读写。(dn可以理解为是一本书的目录对应的内容)
HDFS的核心设计
1. 心跳机制
1)datanode每个固定时间(默认3秒)向namenode汇报自身的状况信息,这就称之为心跳。namenode也会发送指令给datanode。
2)HDFS默认时间超过10分钟30秒,就说明datanode挂掉了。
3)计算公式:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval
默认的 heartbeat.recheck-interval 大小为 5 分钟,dfs.heartbeat.interval 默认的大小为 3 秒。
4)根据key的值查看values:
hdfs getconf -confkey dfs.namenode.heartbeat.recheck-interval (300000毫秒)
hdfs getconf -confkey dfs.heartbeat.interval (3秒)
2. 安全模式
namenode的状态:active(活跃的) / standby(预备) / safemode(安全模式)
safemode其实可以认为是hdfs集群的一种自我保护状态,在该状态下不允许上传文件。为保证数据块的高可靠,不让副本丢失,当数据量丢失率超过0.1%(默认),则会进入到安全模式。
冷启动(先stop再start)集群的时候,为什么刚开始safemode是开启的,后来才关闭?
因为当namenode启动的时候,就会去读取元数据,元数据在内存中是完整的,但是在磁盘中是不完整的,namenode就以为数据块都丢失了,就进入到safemode。
当datanode启动之后就会进行心跳汇报,safemode就会退出。
3. 副本存放策略
关键字:负载均衡、带宽、高可靠
数据分块的存储和副本的存放,是保证高可靠的关键。
存放要求:
- 第一个副本存放在客户端连接的节点中。(要考虑负载均衡,选择的节点不能太满或太忙,要离客户端连接近,节省带宽)
- 第二个副本要存放在与第一个副本存放节点不同的机架上。(考虑高可靠)
- 第三个副本要存放与第一个副本同一个机架,随机放在不同节点上。(节省带宽)
4. 负载均衡
命令(如何才算均衡):
start-balancer.sh
sbin/start-balancer.sh -t 10% (设置越小,均衡越高,但是会频繁负载均衡)
机器容量最高的那个值 和 最低的那个值得差距 不能超过 10%
hdfs集群主要的功能是实现读写操作(带宽),自动进行均衡非常慢,一天能移动的数据量在 10G-10T 的级别,很难满足超大集群的需求。
原因:
hdfs集群默认不允许balance操作占用很大的网络带宽,这个带宽是可以调整的。
命令修改:
hdfs dfsadmin -setBalanacerBandwidth 10485760
该数值的单位是字节,上面的配置是10M/s,默认是1M/s
可以在hdfs-site.xml 配置文件中进行设置:
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>10485760</value>
</property>