hadoop复习

本文由用户“爱上冰镇奶茶”分享发布 更新时间:2021-05-05 13:46:57 举报文档

以下为《hadoop复习》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

大数据的特点:

巨大的数据量

多结构化数据

增长速度快

价值密度高

使用hadoop的好处

方便:Hadoop运行在由一般商用机器构成的大型集群上,或者云计算服务上。

健壮:Hadoop致力于在一般商用硬件上运行,其架构假设硬件会频繁失效,Hadoop可以从容的处理大多数此类故障。

可扩展:Hadoop通过增加集群节点,可以线性地扩展以处理更大的数据集。

简单:Hadoop允许用户快速编写高效的并行代码。

1. hadoop基本组成及其作用

common

支持其他Hadoop模块的公共实用程序。

hdfs

提供对应用程序数据的高吞吐量访问的分布式文件系统。

yarn

作业调度和集群资源管理框架。

mapreduce

一种基于yarn的大型数据集并行处理系统。

2.hadoop集群启动后,基本的进程包括:namenode、datanode、secondarynamenode、resourcemanager、nodemanager

NameNode用于存储文件系统的元数据(Metadata),元数据包括:

文件信息(name、updates、replication factor(副本因子)等)

文件块的信息和位置

文件的访问权限

集群中文件的数量

集群中DataNode的数量

NameNode的功能:

存储HDFS的元数据(Metadata)

维护文件系统命名空间

执行文件系统的命名空间操作,比如打开、关闭、重命名文件或目录等

把HDFS的状态存储到镜像文件(fsimage)中

把文件系统的变化追加存储在日志文件(edits)中

启动时将fsimage和edits文件合并

将数据块副本保存在不同的机架上以提高容错性

DataNode是文件系统的工作节点。他们根据需要存储并检索数据块(受客户端或NameNode调度),并定期向NameNode发送它们所存储块的列表。

DataNode的功能:

根据客户端或者是NameNode的调度存储和检索数据

通过NameNode的指令对块进行创建、删除、复制

在DataNode的复制过程中提供同步发送/接收的操作(复制流水线)

resourcemanager:yarn范畴,管理nodemanager,负责指派每个nodemanager要分配资源的情况。

nodemanager:yarn范畴,负责具体的资源分配(cpu、内存),体现了“数据不动,计算动”的特点

secondarynamenode:hdfs范畴,可以对namenode上的元数据做checkpoint,提高namenode的运行效率,注意:snn不能直接代替namenode,不是namenode的热备!

3. Block概念

把文件上传到HDFS中,第一步是数据的划分,这个是真实物理上的划分,数据文件上传到HDFS后,要把文件划分成若干块,每块的大小可以有hadoop-default.xml里配置选项进行划分。这里默认每块128MB,一个文件被分成多个128MB大小的小文件,最后一个可能小于128MB。注意:128MB只是默认,是可以更改的,hdfs-site.xml中可修改如下选项。

dfs.block.size

***

The default block size for new files.

数据的划分有冗余,为了保证数据的安全,上传的文件是被复制成3份,当一份数据宕掉,其余的可以即刻补上。当然这只是默认。

dfs.replication

3

Default block replication.The actual number of replications can be specified

when the file is created.The default is used if replication is not specified in create time.

Block切分策略

HDFS数据块(block),主要从三个方面来掌握这部分的知识。

(1)文件被切分成固定大小的数据块的策略

默认数据块大小为128MB,可以通过配置文件来进行配置;

若文件大小不到128MB,则单独存成一个block。

(2)数据块如此之大的原因,如果数据块太小,那么系统需要花费很多时间来进行数据块的寻找上,寻道时间过长,影响了系统的吞吐率。所以大的数据块切分策略可以保证数据传输时间超过寻道时间,保证系统高吞吐率。

(3)一个文件存储方式

按大小被切分成若干个block,存储到不同节点上;

默认情况下每个block有三个副本,这个副本数量也是可以调整的。

Hadoop的各种启动命令,会用并理解各个命令的用途:

Start-all.sh

Start-dfs.sh

Start-yarn.sh

hadoop-daemons.sh

hadoop-daemon.sh

Hadoop的各个配置文件,并理解每个文件的主要配置项:

hadoop-env.sh:/

core-site.xml:配置hdfs对外提供服务的接口、配置存放Hadoop运行时需要的文件的路径

hdfs-site.xml:副本数量和块的大小

mapred-site.xml:配置mapreduce资源管理服务的框架

yarn-site.xml:配置resourcemanager进程的节点、配置mapreduce的服务

4.HDFS写流程

HDFS是一个分布式文件系统,在HDFS上写文件的过程与我们平时使用的单机文件系统非常不同,从宏观上来看,在HDFS文件系统上创建并写一个文件,流程如图所示。

/

图 HDFS写数据流程示意图

图中HDFS写数据具体过程描述如下:

首先HDFS Client创建DistributedFileSystem对象通过RPC调用NameNode去创建一个没有blocks关联的新文件。创建前,NameNode会检验当前要写入的文件是否存在,客户端是是否有权限创建等,校验通过, namenode就会记录下新文件,否则就会抛出IO异常。

检验通过后,在自己的元数据中为新文件分配文件名,同时为此文件分配数据块的备份数(此备份数可以在搭建时的参数文件中设定,也可以后来改变,系统默认3份),并为不同的备份副本分配不同的DataNode,并生成列表,将列表返回客户端。

Client调用DistributedFileSystem对象的create方法,创建一个(FSDataOutputStream)文件输出流对象,协调NameNode和DataNode,开始写数据到DFSOutputStream对象内部的Buffer中,然后数据被分割成一个个小的packet(数据在向DataNode传递时以Packet最小单位),然后排成队列data quene。DataStreamer会去处理接受data quene,它先询问NameNode这个新的Block最适合存储的在哪几个DataNode里,把他们排成一个Pipeline。

DataStreamer把packet按队列输出到管道的第一个DataNode中,同时把NameNode生成的列表也带给第一个DataNode,当第1个packet传递完成时(注意是packet而不是整个数据传递完成),第一个DataNode传递信息给第二个DataNode开始把传递完成的packet以管道的形式再传递给第二个DataNode,同时把除掉第一个DataNode节点信息的列表把传给第二个DataNode,依此类推,直到传递到最后一个DataNode,它会返回Ack到前一个DataNode,最终由Pipeline中第一个DataNode节点将Pipeline ack发送给Client。

完成向文件写入数据,Client在文件输出流(FSDataOutputStream)对象上调用close方法,关闭流,调用DistributedFileSystem对象的complete方法,通知NameNode文件写入成功。

5.hdfs读流程

/

图中HDFS读数据具体过程描述如下:

首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例

DistributedFileSystem通过rpc获得文件的第一批个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.

前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接(参考第一小节)。

数据从datanode源源不断的流向客户端。

如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。

如果所有的块都读完,这时就会关闭掉所有的流。

如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像。

该设计的方向就是客户端直接连接datanode,namenode责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。

6.hadoop目录结构

bin:hadoop提供的操作hdfs、yarn、mapreduce的命令

Hadoop

etc:存放的是hadoop的配置文件

libexec:配置hadoop的参数的

logs:通过其中的日志可以了解系统各进程的运行状况,以及出错信息;

sbin:对hadoop集群启动或停止进行管理的一些命令

share:当前版本hadoop的文档,以及相关的jar包

7.HDFS基本命令操作

hadoop fs [ls|put|get|rm|mv|cp|copyFromLocal |moveFromLocal |cat |mkdir ]

hdfs的可靠性:

(1)HDFS架构有一个名称节点和多个数据节点

(2)名称节点通过心跳机制检测数据节点是否宕机,数据节点通过发送块报告,告知名称节点所保存的数据。

(3)Hadoop在写入数据到HDFS上时,会为每一个固定长度(默认是512字节)的数据执行一次“校验和”,“校验和”的值与数据一起保存起来。

(4)第二名称节点时刻监控名称节点的运行状态,作为名称节点的检查点存在。

/

/

8.HDFS的javaAPI操作

(1)编写Java程序实现在HDFS的根目录下创建目录/dir;

public class hdfs_demo {

public static void main(String[] args) throws Exception{

Configuration conf=new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

FileSystem fs=FileSystem.get(conf);

fs.mkdirs(new Path("/dir"));

}

(2)编写代码实现从hdfs获取文件到本地

public static void main(String[] args) throws Exception{

Configuration conf=new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

FileSystem fs=FileSystem.get(conf);

FSDataInputStream fis=fs.open(new Path("/hadoop.test"));

FileOutputStream fos=new FileOutputStream("d:/hadoop.test");

IOUtils.copyBytes(fis,fos,1024);

}

(3) 编写java程序实现copyFromLocal的功能。

将本地/root/hadoop.test文件上传到HDFS的/dir目录下。

public class hdfs_demo {

public static void main(String[] args) throws Exception{

Configuration conf=new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

FileSystem fs=FileSystem.get(conf);

fs.copyFromLocalFile(new Path("/hadoop.test"), new Path("/dir"));

}

(4)编写Java程序在本地终端打印HDFS中hadoop.test文件内容。

public static void main(String[] args) throws Exception{

Configuration conf=new Configuration();

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

FileSystem fs=FileSystem.get(conf);

FSDataInputStream fis=fs.open(new Path("/hadoop.test"));

IOUtils.copyBytes(fis,System.out,1024);

}

(5) 删除文件(夹)

private static void delete_fromHDFS() throws IOException {

//创建一个Configuration对象,此对象作用是读取所有的*-default.xml

Configuration conf=new Configuration();

//配置fs.defaultFS

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

//创建一个文件系统对象(对于hdfs来说返回的是一个DistributeFileSystem)

FileSystem fs=FileSystem.get(conf);

//delete方法第二个参数:是否级联

fs.delete(new Path("/testfromwindows.txt"), true);

}

(6)查看指定路径下的文件信息

/**

* 获取指定路径下的文件信息

* @throws IOException

* @throws FileNotFoundException

*/

private static void filestatus() throws IOException, FileNotFoundException {

//创建一个Configuration对象,此对象作用是读取所有的*-default.xml

Configuration conf=new Configuration();

//配置fs.defaultFS

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

//创建一个文件系统对象(对于hdfs来说返回的是一个DistributeFileSystem)

FileSystem fs=FileSystem.get(conf);

//返回指定路径下(“/”)的文件的状态信息

FileStatus[] fsArr=fs.listStatus(new Path("/"));

for(FileStatus fst:fsArr) {

String filename=fst.getPath().getName();

long length=fst.getLen();

short r=fst.getReplication();

long bs=fst.getBlockSize();

System.out.println(filename+" "+length+" "+r+" "+bs);

}

}

(7)级联获取指定路径下的文件信息,包括文件的块的信息

/**

* 级联获取指定路径下的文件信息,包括文件的块的信息

* @throws IOException

* @throws FileNotFoundException

*/

private static void loop() throws IOException, FileNotFoundException {

//创建一个Configuration对象,此对象作用是读取所有的*-default.xml

Configuration conf=new Configuration();

//配置fs.defaultFS

conf.set("fs.defaultFS", "hdfs://192.168.56.3:8020");

//创建一个文件系统对象(对于hdfs来说返回的是一个DistributeFileSystem)

FileSystem fs=FileSystem.get(conf);

//级联获取所有文件的LocatedFileStatus

RemoteIterator listFiles = fs.listFiles(new Path("/"), true); 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 Path("maxorder/input"));

Path outPath=new Path("maxorder/output");

FileOutputFormat.setOutputPath(job, outPath);

boolean flag = job.waitForCompletion(true);

if (flag) {

System.out.println("执行成功");

}else {

System.out.println("执行失败");

}

}

}

11. 附加内容

关于Combiner:

Combiner是一个继承了Reducer的类

它的作用是当map生成的数据过大时,可以精简压缩传给reduce的数据

多数情况下Combiner和reduce处理的是同一种逻辑

通过Combiner的合并计算,减少了传入reduce的数据量,从而提高了执行效率

整个MapReduce作业的资源分配是由yarn来管理的

[文章尾部最后500字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。

  1. 托福听力学科分类(完全修正版)
  2. ch1 统计的含义、统计学的研究对象、统计学的产生与发展
  3. HDFS知识点
  4. 英语期末考试题电子版
  5. 6月大学英语四级考试真题
  6. PAMAM反应路线
  7. 最新论文模版()
  8. 外文翻译---高层结构与钢结构
  9. 英语大一上学期测试
  10. 多恩布什宏观经济学课后习题答案1
  11. Moduel9 Unit1 Unit1 Reading 教学设计
  12. 10月8日-10月15日长难句
  13. ann
  14. 四级词汇摘抄
  15. 英语124单词()1--30
  16. The clinicopathological signifcance
  17. Unit3Lifeinthefuture
  18. 全新版大学英语(第二版)综合教程1课后习题答案
  19. 课件Making the news
  20. 动态图代码内容

以上为《hadoop复习》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览