Hadoop之HDFS、MapReduce

本文详细介绍了Hadoop的核心组件HDFS和MapReduce。HDFS是一个分布式文件系统,通过分块存储和多副本策略确保数据的高可靠性和容错性。MapReduce是一种分布式计算框架,用于大规模数据处理。文章涵盖了HDFS的设计思路、架构、操作以及核心设计,如心跳机制和安全模式。同时,MapReduce的运行机制、编程模型、Combiner和序列化等方面也得到了探讨。
摘要由CSDN通过智能技术生成

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信息ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值