Hadoop
HDFS
-
组成
-
Block
-
默认128M
-
若切分数据小于block大小 不必占用block所有空间(eg. 数据大小60M 不会将128M都占用 只会用60M)
-
便于数据切分 管理 复制
-
放置策略
- 若上传文件的服务器本身就是datanode 优先存储在本机上
- 若不是 随机找一台磁盘不满 cpu不忙的节点 放置b1
- 在其他机架放置b2(防止停电导致全部失效)
- 在同一机架放置b3(机架内通讯较快)
-
-
NameNode
-
存储HDFS元数据
-
元数据
- 文件和block关系
- block数量
- block和datanode关系
-
元数据存储位置
-
内存(实时数据)
- 想在内存中进行的操作首先会在edits文件中做记录
-
文件(持久化数据)
-
fsimage(元数据镜像文件)
-
edits(操作日志文件)
- 操作成功写入edits文件后,会告诉内存成功,此时内存再进行具体操作
-
fstime(最近一次合并时间)
-
-
-
-
-
SecondNameNode
- 辅助namenode进行工作 具有一定的备份功能 但无法完全备份
- 当edits文件达到一定条件后 复制edits和fsimage文件到 SN 上 进行合并
- NameNode上同时会创建一个edits.new文件 最新的指令写在其中
- 合并完成后 发送回namenmode 替换旧的fsimage文件 并将edits.new文件修改为edits文件
-
DataNode
-
初始化时 主动向NameNode发送数据节点上的block信息
-
主动发送心跳 与namenode联系 若指定时间未发送 namenode认为该datanode已lost 会复制其上的block到其他datanode
-
接收namenode的指令
-
存储内容
- block内容
- block id 到 文件的映射关系
-
-
-
原理
-
存储
- 1.客户端向namenode发送请求,namenode根据文件是否存在 成功则创建一条记录 失败返回异常
- 2.写文件时,客户端将数据切分成packets,向namenode申请block,namennode返回block的信息,datanode列表
- 3.packets以管道的形式 写入第一个datanode,然后再传递给下一个datanode,直到所有的datanode都被写入
- 4.最后一个datanode写入完成后,发送ack包,在管道里传递至客户端 客户端会从ack队列中移除对应的数据
- 5.若传输时 某个datanode出现故障,当前管道停止,故障datanode移除管道,剩余block继续传输,发生故障时传输的数据会在稍后继续传输
- 6.全部完成后 通知namenode关闭文件
-
读取
- 客户端向namennode请求block所在的datanode列表
- 若datanode在本机,直接在本机上寻找,否则寻找最近的datanode,获取数据
- 若datanode发生故障,到备份datanode寻找,在到备份datanode寻找之前,将错误信息发给namenode
- 读取完当前block后,继续读取下一个block,重复以上步骤,若block读取完文件仍然没有读取完,向namennode请求下一批的block列表
- 读取完成后,告知namenode关闭连接
- 这种读取方式的优点是 客户端直接与datanode进行通信,在高并发环境下十分有利
-
安全模式
- namenode启动时,文件fsimage和edits会被持久化到内存中
- 此时内存中创建了元数据的映射,此时是文件系统对客户端来说是只读的
- 每个datanode主动向namenode发送报告,当数据块达到最小副本数时,代表此数据块安全,当一定比例的数据达到安全时,退出安全模式
-
Map/Reduce
-
运行过程
-
创建APPMaster
- 1.向ResourceManager申请此mapreduce的jobid
- 2.job客户端将job资源复制到hdfs(jar文件,配置和分片信息)
-
实例
-
wordcount
-
不使用自定义对象
-
使用自定义对象
- 自定义一个baen文件 实现writeable接口 实现write方法和readFields方法
-
shuffle操作
-
Partitioner 分区
-
将map结果按照规则分发给不同reduce处理
-
默认分区规则 只有一个reduce
-
自定义Partitioner类
- 编写getPartition方法 参数为map输出
- 主类中添加 job.setPartitionerClass(FlowPartitioner.class); job.setNumReduceTasks(4);
-
-
-
sort排序
- map执行完成 进入reduce之前 按照mkey进行排序
- bean类实现WritableComparable接口 实现compareTo方法 主类中不用写setReducer 添加 job.setOutputKeyClass(ProfitInfo.class);
job.setOutputValueClass(NullWritable.class);
-
Combiner 合并
-
在map输出前 先做一次合并
- job.setCombinerClass(WCReducer.class);
-