04 分布式文件系统以及MapReduce入门程序

本文档详细介绍了分布式文件系统HDFS,包括HDFS的设计目标、架构、文件副本机制、元数据管理以及文件的读写操作。同时,还探讨了MapReduce的思想、框架结构、编程规范和运行模式。
摘要由CSDN通过智能技术生成

04 分布式文件系统以及MapReduce入门程序

分布式文件系统HDFS

1.分布式文件系统hdfs详细介绍

在hadoop当中,分布式文件系统(HDFS),对文件系统有一个抽象,HDFS属于当中的一个实现类,也就是说分布式文件系统类
似于一个接口,定义了标准,下面有很多的实现类,其中HDFS是一个子实现类而已,但是现在很多人都只知道一种就是HDFS的
实现,并没有了解过其他的实现类,其实分布式文件系统的实现有很多种。
hadoop的文件系统:
	文件系统:是一个顶层的抽象,具体的实现,需要取决于你自己的获取的实例,
	我们可以通过文件系统获取本地文件系统,操作linux磁盘上面的文件,也可以获取分布式文件系统,操作hdfs上面的文件
	ftp:// ftp文件系统  可以做文件的上传下载
	webHdfs:浏览器操作文件系统,可以允许我们通过浏览器上传,下载,修改,hdfs上面的文件
	hdfs:分布式文件系统,最重要的一个
	local:本地文件系统

2.HDFS分布式文件系统设计目标

1、硬件错误  由于集群很多时候由数量众多的廉价机组成,使得硬件错误成为常态 ---(副本机制)
2、数据流访问  所有的访问都是访问大量的数据,使用IO流一直操作,追求的是稳定,不是效率
3、大数据集   假设所有存储到hdfs的数据都是海量的数据,不擅长处理小文件,一个小文件占用一个元数据,元数据都存储在内存当中,占用namenode的大量内存
4、简单的相关模型  假定文件是一次写入,多次读取的操作,比较擅长存出一些历史数据
5、移动计算比移动数据便宜   一个应用请求的计算,离它操作的数据越近,就越高效
6、多种软硬件的可移植性

3.HDFS的来源

HDFS起源于Google的GFS论文(GFS,Mapreduce,BigTable为google的旧的三驾马车)
	发表于2003年10月
	HDFS是GFS的克隆版
Hadoop  Distributed  File  system
	易于扩展的分布式文件系统
	运行在大量普通廉价机器上,提供容错机制
	为大量用户提供性能不错的文件存取服务

4.hdfs的架构图

在这里插入图片描述
在这里插入图片描述

1、NameNode负责管理文件系统的名字空间(namespace)以及客户端对文件的访问
2、文件操作,namenode是负责文件元数据的操作,datanode负责处理文件内容的读写,跟文件内容相关的数据流不经过
Namenode,只询问它跟哪个dataNode联系,否则NameNode会成为系统的瓶颈
3、副本存放在哪些Datanode上由NameNode来控制,根据全局情况作出块放置决定,读取文件时NameNode尽量让用户先读取
最近的副本,降低读取网络开销和读取延时
4、NameNode全权管理数据的复制,它周期性的从集群中的每个DataNode接收心跳信息和状态报告,接收到心跳信号意味着
DataNode节点工作正常,块状态报告包含了一个该DataNode上所有的数据列表
namenode负责数据block块的复制,定期的检测block的副本数,如果不够3个,继续复制出来保证足够三个
NameNode与Datanode的总结概述:

在这里插入图片描述

namenode的元数据保存在两个地方,一个是内存,一个是磁盘,存的是元数据的快照,如果快照非常大,停机再启动代价非常大

5.hdfs的架构之文件的文件副本机制以及block块存储

所有的文件都是以block块的方式存放在HDFS文件系统当中,在hadoop1当中,文件的block块默认大小是64M,hadoop2当中
,文件的block块大小默认是128M,block块的大小可以通过hdfs-site.xml当中的配置文件进行指定
<property>
    <name>dfs.block.size</name>
    <value>块大小 以字节为单位</value>//只写数值就可以
</property>

抽象成数据块的好处:
1.一个文件有可能大于集群中任意一个磁盘
2.使用块抽象而不是文件可以简化存储子系统
3.块非常适合用于数据备份进而提供数据容错能力和可用性
block块的大小,可以根据实际工作当中的文件特性来调整,如果都是一些大文件,可以稍微调大block块的大小
128M的block块    300M 的文件 产生3个block块   3个block块的元数据信息会存储在namenode当中
256M的block块    300M 的文件 产生2个block块   2个block块的元数据信息会存储在namenode当中

块缓存:
块缓存:distributedCache   可以用来实现我们的文件的缓存等等

hdfs的文件权限验证
hdfs的文件权限机制与linux系统的文件权限机制类似
r:read   w:write  x:execute  权限x对于文件表示忽略,对于文件夹表示是否有权限访问其内容
如果linux系统用户zhangsan使用hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan
HDFS文件权限的目的,防止好人做错事,而不是阻止坏人做坏事。HDFS相信你告诉我你是谁,你就是谁

6.HDFS的元数据信息FSimage以及edits和secondaryNN的作用

在这里插入图片描述

6.1、FSImage与edits详解

hdfs当中的元数据信息管理
fsimage:存储的是一份比较完整的元数据信息
edits:最近一段时间的操作日志

控制edits文件的大小:时间长短,文件大小 通过secondarynamenode将我们的edtis文件合并到fsimage当中去

客户端对hdfs进行写文件时会首先被记录在edits文件中。
edits修改时元数据也会更新。
每次hdfs更新时edits先更新后客户端才会看到最新信息。
fsimage:是namenode中关于元数据的镜像,一般称为检查点。
一般开始时对namenode的操作都放在edits中,为什么不放在fsimage中呢?
因为fsimage是namenode的完整的镜像,内容很大,如果每次都加载到内存的话生成树状拓扑结构,这是非常耗内存和CPU。
fsimage内容包含了namenode管理下的所有datanode中文件及文件block及block所在的datanode的元数据信息。
随着edits内容增大,就需要在一定时间点和fsimage合并。
合并过程见SecondaryNameNode如何辅助管理FSImage与edits

6.2、FSimage文件当中的文件信息查看

官方查看文档
http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.14.0/hadoop-project-dist/hadoop-hdfs/HdfsImageViewer.html

使用命令 hdfs  oiv 
cd  /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/namenodeDatas/current
hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml

6.3、edits当中的文件信息查看

官方查看文档
http://archive.cloudera.com/cdh5/cdh/5/hadoop-2.6.0-cdh5.14.0/hadoop-project-dist/hadoop-hdfs/HdfsEditsViewer.html
查看命令 hdfs  oev
cd  /export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/dfs/nn/edits
hdfs oev -i  edits_0000000000000000865-0000000000000000866 -o myedit.xml -p XML

6.4、secondarynameNode如何辅助管理FSImage与Edits文件

①:secnonaryNN通知NameNode切换editlog
②:secondaryNN从NameNode中获得FSImage和editlog(通过http方式)
③:secondaryNN将FSImage载入内存,然后开始合并editlog,合并之后成为新的fsimage
④:secondaryNN将新的fsimage发回给NameNode
⑤:NameNode用新的fsimage替换旧的fsimage

在这里插入图片描述
在这里插入图片描述

完成合并的是secondarynamenode,会请求namenode停止使用edits,暂时将新写操作放入一个新的文件中(edits.new)。
secondarynamenode从namenode中通过http get获得edits,因为要和fsimage合并,所以也是通过http get 的方式
把fsimage加载到内存,然后逐一执行具体对文件系统的操作,与fsimage合并,生成新的fsimage,然后把fsimage发送给
namenode,通过http post的方式。namenode从secondarynamenode获得了fsimage后会把原有的fsimage替换为新的
fsimage,把edits.new变成edits。同时会更新fstime。
hadoop进入安全模式时需要管理员使用dfsadmin的save namespace来创建新的检查点。
secondarynamenode在合并edits和fsimage时需要消耗的内存和namenode差不多,所以一般把namenode和
secondarynamenode放在不同的机器上。
fs.checkpoint.period: 默认是一个小时(3600s)
fs.checkpoint.size:  edits达到一定大小时也会触发合并(默认64MB)

7、HDFS的文件写入过程

在这里插入图片描述

详细步骤解析:
1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,
返回是否可以上传;
2、 client请求第一个block该传输到哪些DataNode服务器上;
3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C;

注:Hadoop在设计时考虑到数据的安全与高效,数据文件默认在HDFS上存放三份,存储策略为本地一份,同机架内其它某一
节点上一份,不同机架的某一节点上一份。
4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,
然后B调用C,将整个pipeline建立完成,后逐级返回client;
5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到
一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),
最终由pipeline中第一个DataNode节点A将pipelineack发送给client;
7、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。

8、HDFS的文件读取过程

在这里插入图片描述

详细步骤解析
1、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置; 
2、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 
DataNode 地址;  这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个
规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后; 
3、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路
读取特性); 
4、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,
直到这个块上的数据读取完毕; 
5、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表; 
6、 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再
从下一个拥有该 block 副本的DataNode 继续读。 
7、 read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,
并不是返回请求块的数据;
8、 最终读取来所有的 block 会合并成一个完整的最终文件。

9、HDFS的API操作

9.1、创建maven工程并导入jar包

由于cdh版本的所有的软件涉及版权的问题,所以并没有将所有的jar包托管到maven仓库当中去,而是托管在了CDH自己的服务
器上面,所以我们默认去maven的仓库下载不到,需要自己手动的添加repository去CDH仓库进行下载,以下两个地址是官方
文档说明,请仔细查阅
https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh5_maven_repo.html
https://www.cloudera.com/documentation/enterprise/release-notes/topics/cdh_vd_cdh5_maven_repo_514x.html

cdh5.114.0相关jar包

<!-- 通过哪个网址下载我们的jar包 -->
<repositories>
    <repository>
        <id>cloudera</id>
        <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>2.6.0-mr1-cdh5.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>2.6.0-cdh5.14.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-hdfs</artifactId>
        <version>2.6.0-cdh5.14.0</version>
    </dependency>

    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-mapreduce-client-core</artifactId>
        <version>2.6.0-cdh5.14.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>RELEASE</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
                <!--    <verbal>true</verbal>-->
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值