以下为《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字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《hadoop复习》的无排版文字预览,完整内容请下载
hadoop复习由用户“爱上冰镇奶茶”分享发布,转载请注明出处