0.大纲
1.Hadoop简介
Hadoop是Apache旗下的一套开源软件平台。利用服务器集群,对海量数据进行分布式处理。
核心组件:
1.Common(基础组件)JNDI(工具包、RPC框架)和RPC
2.HDFS(Hadoop Distributed File System)分布式文件系统
3.YARN(Yet Another Resource Negotiator)运算资源调度系统
4.MapReduce(Map和Reduce)分布式运算编程框架
除此之外,仍然需要掌握的Hadoop组件:
Hbase-一个可扩展的,面向列存储的分布式数据库
Hive-一个数据仓库,提供数据总结和查询
Spark-Hadoop数据的快速通用的计算引擎,支持ETL、机器学习、流处理和图计算
Zookeeper-一个高性能分布式应用程序的协调服务
2.Hadoop之HDFS
之前总结的HDFS详细内容
HDFS:分布式文件系统,主要用来解决海量数据存储问题。
2.1HDFS相关概念和特性
2.1.1HDFS设计思路
HDFS设计使用低廉的服务器来进行海量数据的存储,如何做到?
1.大文件被切割为小文件,利用分而治之的思想让多个服务器对同一个文件进行联合管理;
2.每个小文件做冗余备份,分散到不同服务器中,做到高可靠不丢失;
2.1.2HDFS架构
主节点NameNode:集群老大,掌管文件系统目录树、处理客户端的读写请求
SecondaryNameNode:NameNode的辅助节点,给Namenode分担压力,即namenode的元数据备份,辅助namenode进行元数据合并
从节点DataNode:负责集群数据块的存储,真正处理数据的读写操作
元数据存储文件在hadoopdata中,其中有以下格式的文件:
eidts 历史日志文件
edits_inprogress 正在编辑的日志文件
fsimage 镜像文件 存储有部分元数据
seen_txid 合并点文件 存储有下一次fsimage和eidts文件 合并的编号
合并 fsimage 编号 + edits (seen_txid 记录的编号)
元数据合并过程(checkpoint)
1)snn 会定期(1min)的向namenode发送请求 元数据合并
2)namenode达到了元数据合并的条件 通知snn进行元数据合并
3)snn真正的向namenode发送 元数据合并的请求
4)namenode准备snn进行元数据合并的数据
fsimage 已经存在
将正在编辑的日志文件进行回滚 edits_inprogress_0000000000000001665
edits_0000000000000001665
同时生成一个新的正在编辑的日志文件 接受客户端的操作日志
5)snn会将需要的元数据拉去到自己的本地
6)snn开始进行元数据合并 将元数据fsimage edits 加载到snn的内存中 根据edits的记录 修改fsimage文件
7)snn合并完成元数据 合并完成的fsimage文件写出到磁盘中 并进行重命名
8)snn会将元数据fsimage 发送给namenode namenode将就的fsimage文件删除(新的fsiamge文件重命名 覆盖旧的fsimage文件)
2.1.3概念和特性
HDFS是一个文件系统,通过统一的命名空间-目录树来定位文件。
重要特征:
1.HDFS在物理上是分块存储,一个block大小为128M,老版本64M
2.HDFS访问文件通过路径,如 hdfs://namenode:9000/hadoop/1.txt
3.目录结构和文件分块信息(元数据)由Namenode承担
每个路径下的文件对应的block块信息(block id ,块所在的DataNode)
4.文件block的存储有DataNode负责,默认存储3个副本
5.HDFS适应一次写入,多次读出,不支持文件的修改
2.2HDFS优缺点
优点:
1)可构建在廉价机器上
通过多副本提高可靠性,提供了容错和恢复机制
2)高容错性
数据自动保存多个副本,副本丢失后,自动恢复
3)适合批处理
移动计算而非数据,数据位置暴露给计算框架
4)适合大数据处理
GB、TB、甚至 PB 级数据,百万规模以上的文件数量,10K+节点规模
5)流式文件访问
一次性写入,多次读取,保证数据一致性
缺点:不适用于以下操作
1)低延迟数据访问
比如毫秒级
低延迟与高吞吐率
2)小文件存取
占用 NameNode 大量内存 150b* 1000W = 15E,1.5G
寻道时间超过读取时间
3)并发写入、文件随机修改
一个文件只能有一个写者
仅支持 append
4)HDFS不适合存储小文件,元数据占用内存较大
2.3HDFS-Shell操作
hadoop fs /hdfs dfs
查看目录 -ls /
创建目录 -mkdir -p
上传文件 -put/copyFromlocal
下载文件 -get/copyToLocal
合并下载多个文件 -getmerge
拷贝文件 -cp /aa/1.txt /bb/2.txt
移动文件 -mv /aa/1.txt /aa
追加一个文件到已存在文件末尾 -appendToFile /aa/1.txt /bb/2.txt
显示文件内容 -cat
显示一个文件末尾 -tail
统计文件系统可用空间信息 -df -h
统计文件夹的大小 -du -s
统计一个目录下文件节点数据 -count
设置文件的副本数量 -setrep 3 /aa/1.txt
查看集群工作状态 hdfs dfsadmin -report
2.4HDFS-JavaAPI操作
使用Javaapi对HDFS完成操作,需要导入 hadoop的jar包
**.FileSystem实例获取:
Configuration conf=new Configuration();
FileSystem fs=FileSystem.get(conf);
想要操作HDFS,首先需要获取fs对象,如果没有给conf设置文件系统,fs对象默认获取本地文件系统。因此需要给conf设置文件系统
conf.set("fs.defaultFs","hdfs://hadoop01:9000");
常用API代码演示
1.建立文件夹
public void mkdir()throws Exception{
System.out.println(fs.mkdir(new Path("/cc/aa/vv")));
fs.close();
}
2.上传文件
public void put()throws Exception{
//要上传的文件所在路径
//要上传到的hdfs路径
Path src=new Path("E:/datas/hello.txt");
Path dst=new Path("/hadoop");
fs.copyFromLocalFile(src,dst);
fs.close();
}
3.下载文件
public void download()throws Exception{
fs.copyTolocalFile(false,new Path("/hadoop/a.txt"),new Path("d:/data"),true);
}
4.删除文件或者文件夹
public void remove()throws Exception{
//删除文件或者文件夹时,如果文件夹不为空,必须添加true
fs.delete(new Path("/cc/bb"),true);
fs.close();
}
5.重命名文件或文件夹
public void Rename()throws Exception{
fs.rename(new Path("/aa/bb"),new Path("aa/ccc"))//可以精确到文件
}
6.查看目录信息,当前目录下的文件信息
public void listFiles()throws Exception{
RemoteIterator<localtedFileStatus> listfiles=
fs.listFiles(new Path("/aa/bb"),true);
while(listfiles.hasNext()){
LocaledFileStatus filess=listfiles.next();
sout(filess.getPath());
sout(filess.getPath().getName());
sout(filess.getBlockSize());
sout(filess.getPermission());
sout(filess.getReplication());
sout(filess.getLen());
}
//block块所在信息
BlockLocation[]blockLocations=
filess.getBlockLocations();
for(BlockLocation bl:blocklocations){
sout(bl.getLength()+"---"+bl.getOffset());
String[] hosts=bl.getHosts();
for(String s:hosts){
sout.print(s+"\t");
}
sout();
}
sout("---------------------");
}
7.查看文件及文件夹信息
public void liststatus()throws Exception{
FileStatus[]liststatus=fs.
listStatus(new Path("/aa"));
String flag="";
for(FileStatus ss:liststatus){
if(ss.isDirectory){
flag="Directory";
}else{
flag="file";
}
sout(flag+"\t"+ss.getPath().getName());
}
}
2.5HDFS核心设计
2.5.1Hadoop心跳机制
HDFS的架构为一主多从(one master many slave)
1.主为namenode和Resourcemanager,多从为datanode和nodemanager
2.namenode启动时会启动一个IPCserver服务,datanode启动时会主动连接namenode的IPCserver,每隔一定时间间隔链接一次,形象地称之为心跳。slave通过心跳汇报信息给master,master通过心跳下达命令
3.namenode借心跳得知datanode状态,resourcemanager借此得知nodemanager状态
2.5.2HDFS安全模式
safemode是namenode的一种状态(active/standby/safemode)。
进入safemode的原理:
1.namenode发现集群的block块丢失率达到一定比例,namenode便进入安全模式。该情况下,无法对数据进行任何操作,只能查看元数据信息
2.如何退出安全模式?
1)找出问题修复,比如datanode宕机后重新启动
2)手动强行退出,没有真正解决问题
**事实上,当hdfs集群正常冷启动时,也会进入一段时间的safemode,然而只需要它自动退出即可。
原理:namenode的内存元数据中,包含文件路径,block、副本等信息,fsimage中不包含block所在datanode的信息,namenode启动时内存中的元数据只能从fsimage中加载,因此无法获取block所在datanode信息会认为所有block块已经丢失,进入安全模式。当datanode陆续启动后,会向namenode报告block信息ÿ