Hadoop:思想之源来自Google的三篇文章 GFS Map-Reduce Bigtable。
包括:分布式存储系统(HDFS)、分布式计算系统(MapReduce)。
HDFS:
一、优点: 1、高容错性 2、适合批处理 3、适合大数据 4、可构建在廉价机器上
二、缺点: 1、不适合低延时数据访问 2、存储大量的小文件低效 3、不支持多用户随机写入(占用NameNode内存,寻道时间大于读取时间)
NameNode:
主要工作是接受客户端的读写请求、保存metadata。
metadata包括: fsimage(存储在磁盘)、edits(metadata的操作记录文件)。
fsimage:owership-文件名、权限、拥有者路径,permissions,block的位置信息由DataNode启动时向NameNode上报到内存。
NN保存metadata信息,启动时加载到内存里。
文件被切割成固定大小的数据块(block),每一个block默认为128M。一个文件按大小被切割成多个block存储在不同的DataNode上,默认情况下每一个block有三个副本。
SNN不是NN的备份,但是可以做备份。主要工作是帮助NN合并editsLog文件,减少NN的启动时间。合并由设置时间间隔(fs.checkpoint.period默认3600秒)、edits文件大小(默认64MB)触发。
DataNode:存储数据(Block),启动DN线程的时候会向NN汇报Block信息。通过向NN发送心跳保持与其联系(3秒一次),如果NN10分钟没有收到DN的心跳,
则认为其已经挂掉了,并copy该DN上的Block到其他DN上。
副本存放策略:
第一个副本放在上传文件的DN上,如果是集群外提交,就随机选一台磁盘、CUP资源相对充裕的节点。
第二个副本放在与第一个副本不同的机架的节点上。
第三个副本放在与第二个副本相同的机架的不同节点上。
更多副本随机放置。
命令:
hdfs dfs -ls / 查看HDFS根目录文件
hdfs dfsadmin -refreshNodes 刷新集群节点
集群启动会有安全模式,NN启动时会将fsimage加载到内存,并执行edits中的各项操作。一旦在内存中成功建立文件系统的元数据映射,创建了一个新的fsimage文件和一个空的edits文件。
此刻NN运行在安全模式,文件系统为只读,其他操作都会失败。此时NN收集各个DN的报告,当数据块达到最小副本数以上时,会被认为时‘安全’的,一定比例的数据被确认安全后,过若干时间 安全模式结束。如果出现问题无法离开安全模式的时候可以命令强制离开。
MapReduce:
分布式计算,移动计算而不移动数据。
计算流程:Input -> Split -> Map -> Shuffler -> Reduce -> Output
读入数据片段经过我们自己编写的计算程序(map)写入内存(环形缓冲区),然后计算每条数据的partition获取分区号(分区号最终决定了该条数据到哪个reduce task中),接着进行排序后溢写到磁盘(默认内存100MB达到80%就会溢写)再将多个文件进行merge,map端的shuffler结束。reduce端的shuffler开始,先从map task下抓取属于自己分区的数据,从多个map task下抓取数据后排序、分组再进行merge,接着经过自己写的计算程序(reduce),最终输出。
编写Combiner可以大大优化MapReduce的性能,Combiner合并之前还会进行排序、分组。将多条数据合并成一条,可以减少reduce端抓取的数据量。
Yarn:
Hadoop2.0新引入的资源调度框架,可支持MapReduce、Spark、Storm等分布式计算框架的资源调度。
ResourceManager:接收客户端提交的任务,管理、分配NM资源
NodeManager:其中包含ApplicationMaster(负责任务的调度、监控、向RM请求资源(containers)等等)、Container(任务执行的资源容器)