1、hadoop是什么
Hadoop是一个由Apache基金会所开发的分布式系统基础架构,主要解决海量数据存储与计算的问题,其中主要包括HDFS、MapReduce和Yarn框架。
2、HDFS
HDFS四大机制:心跳机制,安全机制,机架策略(副本存放策略),负载均衡。
HDFS两大核心:文件上传和文件下载
2.0.1、心跳机制
介绍:hdfs是主从架构,所有为了实时的得知dataNode是否存活,必须建立心跳机制,在整个hdfs运行过程中,dataNode会定时的向nameNode发送心跳报告已告知nameNode自己的状态。
心跳内容:
报告自己的存活状态,每次汇报之后都会更新维护的计数信息
向nameNode汇报自己的存储的block列表信息
心跳报告周期:
nameNode判断一个dataNode宕机的基准:
连续10次接收不到dataNode的心跳信息,和2次的检查时间。
2.0.2、安全机制
介绍:hdfs在启动的时候,首先会进入的安全模式中,当达到规定的要求时,会退出安全模式。在安全模式中,不能执行任何修改元数据信息的操作。
hdfs的元数据的介绍(三个部分):
抽象目录树
数据与块的对应关系(文件被切分成多少个块)
block块存放的位置信息
hdfs元数据的存储位置:
内存:内存中存储了一份完整的元数据信息(抽象目录树、数据与块的对应关系、block块存放的位置信息)
硬盘:抽象目录树、数据与块的对应关系
2.0.3、机架策略(副本存放策略)
方法:将每个文件的数据进行分块存储,每一个数据块又保存有多个副本,这些数据块副本分
布在不同的机器节点上
2.0.4、负载均衡
hdfs集群中的每一个datanode上的存储的数据和自己的硬件占比是相当的;
这个时候我们可以认为这个hdfs集群是负载均衡的。
2.0.5、Hdfs两大核心
文件上传:hdfs写数据
文件下载:hdfs读数据
2.1、关于HDFS
Hive的数据存储在HDFS。主要分为NameNode,DataNode,SecondaryNameNode三个模块。
简单来说,HDFS数据的文件元信息,包括位置、大小、分块信息等,都是保存在NameNode的内存中的(真正的数据是存储在DataNode)。每个对象约占用150个字节,因此一千万个文件及分块就会占用约3G的内存空间(每个小文件都会占用NameNode模块的存储资源),一旦接近这个量级,NameNode的性能就会开始下降了。此外,HDFS读写小文件时也会更加耗时,因为每次都需要从NameNode获取元信息,并与对应的DataNode建立连接,读取数据。对于MapReduce程序来说,小文件还会增加Mapper的个数,每个脚本只处理很少的数据,浪费了大量的调度时间。当然这个问题可以通过使用小文件合并和JVM重用来解决。
HDFS中的最小存储单元是数据块(Block)。在HDFS中,文件被分割成一个个固定大小的数据块,通常默认情况下为128MB。
小文件通常存储在HDFS中一个单独的数据块中。当一个小文件写入HDFS时,它的大小可能小于默认的数据块大小(通常是128MB)。在这种情况下,HDFS将为该小文件分配一个完整的数据块,并将剩余的空间浪费掉。这种情况下会出现所谓的“小文件问题”,因为这种方式会占用大量的存储空间,导致存储资源的低效利用。
2.2、关于HDFS的读流程
2.3、关于HDFS的写流程
1、首先客户端会向namenode进行请求,然后namenode会检查该文件是否已经存在,如果不存在,就会允许客户端上传文件;
2、客户端再次向namenode请求第一个block上传到哪几个datanode节点上,假设namenode返回了三个datanode节点;
3、那么客户端就会向datanode1请求上传数据,然后datanode1会继续调用datanode2,datanode2会继续调用datanode3,那么这个通信管道就建立起来了,紧接着dn3,dn2,dn1逐级应答客户端;
4、然后客户端就会向datanode1上传第一个block,以packet为单位(默认64k),datanode1收到后就会传给datanode2,dn2传给dn3
5、当第一个block传输完成之后,客户端再次请求namenode上传第二个block。【写的时候,是串行的写入数据块】
2.4、关于HDFS中的小文件
小文件的产生原因:
1、动态分区插入数据的时候,会产生大量的小文件(动态分区产生小文件原因:在一段sql中指定两个字段当动态分区,一个字段的基数为7,另一个为4,这就是28个分区,数据插入动态分区阶段只有map任务,假如有4000个map,这种情况下map任务在往hive分区中写的时候,每个map几乎都要产生28个文件,这样就会产生4000*28个文件,带来大量的小文件);
2、数据源本身就包含有大量的小文件;
3、Reduce数量的增加,即意味结果文件的增加,从而产生小文件的问题。
2.4.1、小文件的影响
1、从HIVE角度来看的话呢,小文件越多,map的个数也会越多,每一个map都会开启一个JVM虚拟机,每个虚拟机都要创建任务,执行任务,这些流程都会造成大量的资源浪费,严重影响性能;
2、在HDFS中,每个小文件约占150byte,如果小文件过多则会占用大量的内存。这样namenode内存容量严重制约了集群的发展。
2.4.2、小文件的解决方案
1、从小文件的产生途径解决:
1)使用sequencefile作为表存储形式,不要使用textfile,在一定程度上可以减少小文件;
2)减少reduce的个数(减少生成分区数量);
3)少用动态分区,使用distribute by分区。
2、对已经存在的小文件做出的解决方案:
1)使用Hadoop archive把小文件进行归档
Hadoop的归档文件格式也是解决小文件问题的方式之一。而且Hive提供了原生支持:
set hive.archive.enabled=true;
set hive.archive.har.parentdir.settable=true;
set har.partfile.size=1099511627776;
alter table srcpart archive partition(ds='2008-04-08', hr='12');
alter table srcpart unarchive partition(ds='2008-04-08', hr='12');
如果使用的不是分区表,则可创建成外部表,并使用har://协议来指定路径。
2)HDFS Federation
Hadoop V2引入了HDFS Federation的概念
实则是将NameNode做了拆分,从而增强了它的扩展性,小文件的问题也能够得到缓解。
3)重建表,建表时减少reduce的数量
4)通过参数调节,设置map/reduce的数量,对于通常的应用,使用Hive结果合并就能达到很好的效果。
设置map输入合并小文件的相关参数:
//每个Map最大输入大小(这个值决定了合并后文件的数量)
set mapred.max.split.size=256000000;
//一个节点上split的至少的大小(这个值决定了多个DataNode上的文件是否需要合并)
set mapred.min.split.size.per.node=100000000;
//一个交换机下split的至少的大小(这个值决定了多个交换机上的文件是否需要合并)
set mapred.min.split.size.per.rack=100000000;
//执行Map前进行小文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
设置map输出和reduce输出进行合并的相关参数:
//设置map端输出进行合并,默认为true
set hive.merge.mapfiles = true;
//设置reduce端输出进行合并,默认为false
set hive.merge.mapredfiles = true;
//设置合并文件的大小
set hive.merge.size.per.task = 256*1000*100;
//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge。
set hive.merge.smallfiles.avgsize=16000000;
2.5、数据存储和压缩
2.5.1、数据存储
Hive底层数据是以HDFS文件的形式存储在Hadoop中的,选择一个合适的文件存储格式及压缩方式,也是 Hive 优化的一个重点。不同的文件存储格式及压缩格式,同时代表着不同的数据存储组织方式,对于性能优化表现会有很大不同。
2.5.1.1、行存储与列存储
数据处理大致可分为两大类,联机事务处理 OLTP(on-line transaction processing),联机分析处理 OLAP(On-Line Analytical Processing)。OLTP 是传统关系型数据库,主要应用来执行一些基本的、日常的事务处理,比如数据库记录的增、删、改、查等等;而OLAP则是分布式数据库,主要应用它对实时性要求不高,但处理数据量大,通常应用于复杂计算的报表系统上。
数据处理类型 | OLTP | OLAP |
---|---|---|
主要的面向对象 | 业务开发人员 | 分析决策人员 |
功能实现 | 日常事务处理 | 面向决策分析 |
数据模型</ |