HDFS入门
1.1hadoop分布式文件系统
分布式文件系统解决的问题就是大数据存储
站在客户端的使用者角度来看,不需要关心文件系统的内部构造,只关心能不能存储数据
站在文件系统内部看我们是分布式的系统,各个角色各司其职,共同完成文件存储和读取的任务
1.2
HDFS设计目标:
- 故障是常态,故障的检测和自动快速修复是HDFS的核心目标
- HDFS上的应用主要以流的形式读取数据,HDFS被允许设计成适合批量操作,相较于数据访问反应时间,更注重数据访问的吞吐量
- 支持大文件的存储
- write-one-read-many 一次写入多次读取
- 移动计算的代价比移动数据代价低
- 可移植性
总结HDFS特性:
- 主从架构 master-slaver 主从之间职责不一样,从要受到主的指挥
- 分块存储 ,默认大小hadoop2.x 是128M
- 名字空间NameSpace :Namenode 负责维护文件系统的名字空间,任何对系统名字空间或属性修改都会被记录下来
- Namenode元数据 目录结构及文件分块位置信息
- Datanode 具体数据存储
- 副本机制 保证上传数据的存储安全性 默认副本数是3 1+2=3
3 ,HDFS基本操作
shell命令行客户端
hadoop fs 操作文件系统的shell命令至于你操作的是哪一个文件系统取决于你的url
如果是hdfs://node-1:9000开头的 操作的就是HDFS
如果是file:/// 操作的就是执行该命令的所在的Linux系统
如果是tfs://node-3:666 操作的就是淘宝文件系统
如未指定,则使用默认配置中指定的方案
-ls 显示文件目录信息 -r递归 -h 人性化(将b转换为kb)
-mkdir 在HDFS上创建目录 -p表示会创建路径中的各级父目录
-put 将单个src或多个srcs从本地文件系统复制到目标文件系统
-get 将文件复制到本地文件系统 下载文件
-appendToFile 追加一个文件到已经存在的文件夹尾
-cat 显示文件内容到stdout
-tail 将文件最后1千字节内容显示到stdout
-chmod改变文件权限
-chown改变文件拥有者
-copyFromLocal 从本地文件系统中拷贝文件到HDFS路径中去
-copyToLocal 从HDFS拷贝到本地
-cp 从HDFS的一个路径拷贝到HDFS的另一个路径
-mv 移动在HDFS目录中
-getmerge合并下载多个文件
-rm 删除指定文件
-df 统计文件系统可用空间
-du显示目录中所有文件大小
-setrep 改变一个文件的副本系数(不建议使用浪费时间)
HDFS的工作机制
HDFS的内部工作机制对客户端保持透明,客户端请求访问HDFS都是通过向namenode申请来进行
namenode职责:
- 响应所有客户端请求
- 维护整个文件系统元数据(目录树,文件跟块对应信息)
- 管理众多Datanotes : dn的节点健康状况,dn的磁盘使用情况
HDFS上传文件流程:
RPC请求 hadoop fs -put 1.txt /aaa
- 请求上传文件1.txt 上传到 /aaa 备份3
- 自我监测元数据
- 你可以上传
- 上传请求 1.txt blk-1 备份3
- 根据请求找出3台可用的datenode地址(dn1 dn2 dn3)
- 返回3台可用的dn地址
- 请求建立传输数据的pipeline(dn2 dn3)管道流
- pipeline建立了 packet(64K)一个包一个包发送过去
- 接收packet包,保存到dn工作指定的目录下,并把包往后发
- 反方向在pipeline中,逐个校验数据包ack 逐级反馈直至客户端,数据安全
- 第一块block传输完毕,客户端按照上述流程再走一遍
- 当所有的block都上传完毕告知namenode把元数据记录下来
pipeline建立完毕只有有一块上传成功就认为是写成功,缺少的那块,由namenode,根据DataNode信息池找其他来进行复制,只要最终集群上副本数==你的上传设置即可满足需求
块的最小副本数 1
HDFS下载文件流程 读数据
shell client
hadoop fs -get/aaa/1.txt /root/
- 请求下载文件/aaa/1.txt /root
- namenode 根据请求并结合元数据返回部分(数据量太大)或全部block列表 ;namenode 返回给客户端的blick所在的集群列表是排好序的(离客户端最近的靠前,dn状态健康的靠前)
- 请求下载1.txt blk-1
- 当该文件的所有block都读取到客户端的本地按照block的顺序追加拼接成为文件最终的样子
为了保证namenode的元数据跟实际的DataNode上存储的信息一致dn会定时向namenode汇报自己本地持有哪些block信息,同时DataNode还会通过心跳机制汇报自己是否还活着
1,namenode概述
HDFS核心 Master 仅存HDFS元数据:文件系统中有文件的目录树,并跟踪整个集群中的文件
2,DataNode概述
赋值将实际数据存储在GDFS中也称为Slare
dn根nn之间的汇报:
- 集群刚启动的时候要汇报一次,首先dn报告自己启动成功活着,汇报自己持有的块信息
- 当集群正常运行后,每隔3s通过心跳报告自己活着,每隔6小时汇报自己持有的块信息
HDFS java操作:
客户端身份权限问题
在Windows开发hadoop尤其是涉及到根win平台进行数据交互比如王win写数据就一定下载hadoop源码并且在win平台编译以满足平台需求,
编译好以后配置环境变量
stream流形式操作
成熟的shell骨骼(框架)
开始区域:跟本次shell运行相关的软件环境问题
中间的区域:跟本次shell执行相关类的一些常量定义,目录类名时间,
当需要修改的时候只需要修改变量即可,下述的正常逻辑你引用即可不需要多处修改
核心区域:
本次shell职能所在也就是你这个shell到底是用来干什么的,写具体逻辑一定要结合流程控制尽可能多的把线程运行可能出现的情况都能想到
在shell中因为出错不好排查人为地通过shell命令打印各种消息相当于java中log 方便执行的时候看执行效果
四、初识MapReduce
1.1,理解MapReduce思想
分而治之
Map 负责分:把复杂的任务分解为若干个简单的任务来并行处理,可以进行拆分的前提是这些小人物可以并行计算彼此之间没有依赖关系
Reduce负责合:既对map阶段的结果进行汇总
1.2Hadoop MapReduce设计构思
是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在hadoop集群上
MapReduce处理的数据类型是<key,value>键值对
程序员仅需要关心其应用层具体计算问题仅需要编写少量的处理应用本身计算问题的程序代码
MapReduce编程规范
用户要实现的3个部分
自己的map类 继承Mapper 重写map()该方法是mapper阶段具体业务逻辑实现的地方
自己的reduce类 继承Reduce重写reduce()该方法是reducer阶段具体业务实现的地方
运行的主类main 包括此次mr程序所有信息的描述
把程序写完之后 打成jar包提交集群进行分布式计算
reduce编写
reduce阶段具体业务逻辑处理的地方
当map阶段所有的数据都来到reduce阶段的时候,首先把所有数据按照key的字典表顺序排序,把相同的一组kv对来去调用一次
我们的reduce方法
这一组共同的key作为reduce方法输入的key 这一组所有的values组成一个迭代器作为reduce方法输入的value