什么是hadoop
 Hadoop是一个分布式系统基础架构,主要解决海量数据的存储和海量数据的分析计算问题
 Hadoop运行模式
 本地模式和为分布式模式都是单机运行
 完全分布模式即是多台服务器组成分布式环境
 Hadoop集群中的组件
 Name Node-负责存储文件的元数据,例如文件位置,文件目录结构
 Data Node-负责存储文件块数据
 Secondary Name Node-负责对Name Node的数据进行备份
 Node Manger-执行任务
 Resource Manager负责资源调度
 HDFS定义
 是一个分布式文件系统,适合一次写入多次写出的场景,对于文件只能追加不能修改,适合用于数据分析
 HDFS优缺点
 优点:
 高容错性-能够自动保存多个副本,在一个副本丢失时可以进行恢复
 适合进行大规模数据的处理
 可以在廉价机器上构建,有可靠性
 缺点:
 不适合低延迟数据访问
 无法高效的存储大量小文件
 不支持文件并发写入
 仅支持数据追加,不支持数据修改
 HDFS中的组件
 Name Node负责管理名称空间,管理数据映射信息,处理客户端的请求
 Data Node负责存储数据,执行数据读写操作
 Client负责与前两个组件进行交互,获取文件信息并读取或者写入数据,同时提供一些命令操作HDFS
 Secondary Name Node负责备份Name Node,在紧急情况下,可以接替Name Node的工作
 *H DFS采用块存储,2.0中一个块大小是128MB
 HDFS写数据流程
 1)客户端通过分布式文件系统模块(Distributed FileSystem)向NameNode请求上传文件,NameNode检查目标文件是否存在,父目录是否存在;
 2)NameNode返回是否可以上传文件;
 3)客户端请求第一个Block上传到哪几个DataNode服务器上;
 4)NameNode返回3个DataNode节点,分别为dn1,dn2,dn3;
 5)客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,dn2调用dn3,将这个通信管道建立完;
 6)dn1,dn2,dn3逐级应答客户端;
 7)客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以Packet为单位,dn1收到一个Packet传给dn2,dn2传给dn3,dn1每传一个packet会放入一个应答队列等待应答;
 8)当一个Block传输完成后,客户端再次请求NameNode上传第二个Block的服务器(重复执行3-7步)。
 HDFS数据备份
 Name Node内存中的元数据序列化后会形成Fsimage文件,用于在磁盘中备份元数据
 每当有元数据更新或者添加元数据的时候,修改元数据同时追加到edit文件中,记录客户端更新元数据的每一步操作
 一旦Name Node断电,系统会合并Fsimage文件和Edits文件,合成新的元数据,其中Secondary Name Node专门用于合并两个文件,接替Name Node的工作
 小文件对HDFS的危害
 小文件过多会占用Name Node的内存,因为每一个元数据都会占用一份内存,会造成内存空间不足
 如果有大量小文件,会造成寻道时间大于读取文件的时间,这与其设计原理相悖,并且会严重影响运行速度
 如果访问小文件,必须跳转Data Node,严重降低读取性能
 Mapreduce原理
 它是一个分布式运算框架,其中Map函数用于数据预处理,输入和输出都是键值对形式,处理好的数据会送入Reduce阶段,对每一组简直进行处理,形成最后的输出
 Mapreduce优缺点
 优点:易于编程,有良好的扩展性
 具备高容错性适合处理海量数据
 缺点:不擅长实时计算和流使式计算,只能处理静态数据
 不擅长有向图计算(spark擅长),因为需要将数据写入磁盘,会造成大量磁盘IO
 Hadoop数据压缩的方式
 deflate,Gzip,Bzip,前两种不支持切片
 mapreduce性能瓶颈
 1.计算机性能
 2.IO操作优化
 数据倾斜,任务设置不合理,Map时间过长,小文件过多,大文件过多等
 MapReduce优化方法
 在数据输入阶段,合并小文件,减少数据装载次数
 在Map阶段减少溢写和合并次数,缩短整体时间,减少IO
 合理设置Map和reduce任务数量,避免造成资源竞争或者处理超时
 数据倾斜
 一种是某一区域的数据量远远大于区域
 一种是部分记录的大小的大小远远大于平均值
 导致大部分的任务运行速度快,小部分的任务运行速度很慢,或者出现内存异常
 如何缓解数据倾斜?
 1抽样和范围分区
 2自定义分区
 3使用combine减少数据倾斜,聚合并精简数据,例如将相同key的数据进行合并
 4尽量采用Map Join避免使用Reduce join这样可以省略shuffle阶段,提高磁盘IO效率
 5通过随机前缀重新设计键值,针对聚合类的数据倾斜,可以在map阶段添加随机后缀,是的分区的时候能够分到不同节点,然后再重新进行一次全局聚合
 HDFS小文件优化方法
 HDFS上每个文件都需要建立一个索引,文件过多就会产生大量的索引文件,不仅占用内存空间,也会导致索引速度大幅度降低
 优化方法:
 在数据采集阶段将小文件合并成大文件再上传
 在业务处理钱,在HDFS上使用Map Reduce进行文件合并
 可以使用CombineTextInputFormat提高效率
 参考博客https://blog.csdn.net/weixin_44123362/article/details/130230531
