hadoop优势:
高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。
高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。
高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务处理速度。
高容错性:能够自动将失败的任务重新分配。
HDFS:
HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
组成:
NameNode(nn):存储文件的元数据,如文件名,文件目录结构,文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
优点:
1)高容错性
➢ 数据自动保存多个副本。它通过增加副本的形式,提高容错性。
➢ 某一个副本丢失以后,它可以自动恢复。
2)适合处理大数据
➢ 数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;
➢ 文件规模:能够处理百万规模以上的文件数量,数量相当之大。
3)可构建在廉价机器上,通过多副本机制,提高可靠性。
缺点:
1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
2)无法高效的对大量小文件进行存储。
➢ 存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
➢ 小文件存储的寻址时间会超过读取时间,它违反了HDFS的设计目标。
3)不支持并发写入、文件随机修改。
➢ 一个文件只能有一个写,不允许多个线程同时写;
➢ 仅支持数据append(追加),不支持文件的随机修改。
shell:
-moveFromLocal:从本地剪切粘贴到HDFS
-copyFromLocal:从本地文件系统中拷贝文件到HDFS路径去
-put:等同于copyFromLocal
-appendToFile:追加一个文件到已经存在的文件末尾
-copyToLocal:从HDFS拷贝到本地
-get:等同于copyToLocal,生产环境更习惯用get
-setrep:设置HDFS中文件的副本数量
MapReduce:
MapReduce 是一个分布式运算程序的编程框架,是用户开发“基于 Hadoop 的数据分析应用”的核心框架。
MapReduce 核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个 Hadoop 集群上。
MapReduce 将计算过程分为两个阶段:Map 和 Reduce
1)Map 阶段并行处理输入数据
2)Reduce 阶段对 Map 结果进行汇总
优点:
1)MapReduce 易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的 PC 机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特点使得 MapReduce 编程变得非常流行。
2)良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力。
3)高容错性
MapReduce 设计的初衷就是使程序能够部署在廉价的 PC 机器上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由 Hadoop 内部完成的。
4)适合 PB 级以上海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力。
缺点:
1)不擅长实时计算
MapReduce 无法像 MySQL 一样,在毫秒或者秒级内返回结果。
2)不擅长流式计算
流式计算的输入数据是动态的,而 MapReduce 的输入数据集是静态的,不能动态变化。这是因为 MapReduce 自身的设计特点决定了数据源必须是静态的。
3)不擅长 DAG(有向无环图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce 并不是不能做,而是使用后,每个 MapReduce 作业的输出结果都会写入到盘,会造成大量的磁盘 IO,导致性能非常的低下。
编程:
Mapper:
用户自定义mapper需要继承Mapper类,mapper的输入和输出都是KV对的形式存在。
map()方法写业务逻辑,每个KV对会调用一次map()方法
setup()方法开始执行一次
cleanup()方法最后执行一次
Reducer:
用户自定义reducer需要继承Reducer类,reducer的输入对应map的输出。
reducer()方法写业务逻辑,每个K会调用一次reducer()方法
setup()方法开始执行一次
cleanup()方法最后执行一次
Driver:
提交mapreduce程序到Yarn集群。
InputFormat:
FileInputFormat:
切片机制:
简单的按照文件内容的长度进行切片,切片时不考虑数据集整体,而是对每一个文件进行单独的切片。
切片大小计算公式:(minSize默认为1,maxSize默认为Long.MAX_VALUE)
Math.max(minSize, Math.min(maxSize, blockSize))
获取切片信息:
inputSplit.getPath().getName()
(FileSplit) context.getInputSplit()
TextInputFormat:
TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。
CombineFileInputFormat:
用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,在驱动类中设置job.setInputFormatClass(CombineTextInputFormat.class);
虚拟存储切片最大值设置4m
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);切片机制:
1.虚拟存储过程:将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
2.切片过程:判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片,如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
KeyValueTextInputFormat:
每一行均为一条记录,被分隔符分割为key,value,可以通过再驱动类中设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPARATOR, "\t");来设定分隔符,默认分隔符是 \t。
NLineInputFormat:
每个map按照行数还划分,切片树=输入文件的总行数/n(向上取整)
键是存储该行在整个文件中的起始字节偏移量,值是这行的内容
Yarn:
Yarn 是一个资源调度平台,负责为运算程序提供服务器运算资源,相当于一个分布式的操作系统平台,而 MapReduce 等运算程序则相当于运行于操作系统之上的应用程序。
组成:
ResourceManager(RM):负责管理整个集群资源(内存、CPU等)
NodeManager(NM):负责管理单个节点服务器资源
ApplicationMaster(AM):负责管理单个任务运行的,任务的监控与容错
Container:容器,相当一台独立的服务器,里面封装了任务运行所需要的资源,如内存、CPU、磁盘、网络等。