- 如果让你对大数据平台进行技术选型,你是选择原生Hadoop还是CDH/HDP?这样选择的依据是什么?
- 动手配置一个Hadoop客户端节点,都有哪些注意事项?
- Hadoop客户端节点是怎么识别Hadoop集群的?
- 如何实现大海捞针,从HDFS中揪出不经常使用并且占用空间的大文件?
- 如何获取指定的HDFS目录下所有文件的Block块信息?
- 我们自己串联多块硬盘实现海量数据存储和使用HDFS有什么区别?
- HDFS集群之间是否可以实现数据迁移?">HDFS集群之间是否可以实现数据迁移?
- HDFS中的回收站和windows中的回收站有什么区别?
- Hadoop中必须要有SecondaryNameNode进程吗?
- HDFS中NameNode内存将要耗尽,有什么解决方案?
- 一台128G内存的NameNode节点理论上可以存储多少文件的元数据?
- HDFS中的安全模式是为了干什么?有什么意义?
- HDFS的存储能力理论上来说是有极限的,如何扩容?
- 开发脚本实现定时向HDFS中上传内容和下载内容
- 如何开发一个只有map阶段的MapReduce任务?这种任务的应用场景是什么?
- 使用MapReduce如何开发自定义二次排序Key?
- 使用MapReduce如何实现统计TopN的需求?
- 如果MapReduce任务中没有shuffle过程会出现什么现象?
- MapReduce中的Combiner阶段在什么场景下适合使用?
- 如何使用MapReduce对数据实现全局排序?">如何使用MapReduce对数据实现全局排序?
- 能不能使用zip或者rar文件解决HDFS中的小文件问题?
- SequenceFile与MapFile的区别 ?">SequenceFile与MapFile的区别 ?
- 总结一下数据倾斜产生的原因,如何避免?如何解决?">总结一下数据倾斜产生的原因,如何避免?如何解决?
- 如何从一批数据中找出倾斜的key?
- 分析一下Hadoop中的RPC框架?">分析一下Hadoop中的RPC框架?
- YARN中的调度器
- 在MapReduce中如何实现多路输入(同时指定多个不同的输入目录)?
- 在MapReduce中如何实现多路输出(按照一定规则,将结果输出到多个不同的目录中)?">在MapReduce中如何实现多路输出(按照一定规则,将结果输出到多个不同的目录中)?
- 谈一下你对本地计算的理解?它的计算性能为什么这么高?
- 谈一谈你对源码分析的看法?如何快速高效分析项目源码?
- 介绍下Hadoop
- Hadoop的特点
- Hadoop主要分哪几个部分?他们有什么作用?
- Hadoop 1.x,2x,3.x的区别
- Hadoop集群工作时启动哪些进程?它们有什么作用?
- 在集群计算的时候,什么是集群的主要瓶颈
- 搭建Hadoop集群的xml文件有哪些?
- Hadoop的checkpoint流程
- Hadoop的默认块大小是多少?为什么要设置这么大?
- Block划分的原因">Block划分的原因
- Hadoop常见的压缩算法?">Hadoop常见的压缩算法?
- Hadoop作业提交到YARN的流程?
- Hadoop的Combiner的作用
- Hadoop序列化和反序列化
- Hadoop的运行模式
- Hadoop小文件处理问题
- Hadoop为什么要从2.x升级到3.x?
- Hadoop的优缺点
- HDFS文件写入和读取流程">HDFS文件写入和读取流程
- HDFS组成架构
- HDFS作用
- HDFS的容错机制">HDFS的容错机制
- HDFS的存储机制">HDFS的存储机制
- HDFS的副本机制
- HDFS故障类型和其检测方法
- HDFS的常见数据格式,列式存储格式和行存储格式异同点,列式存储优点有哪些? ">HDFS的常见数据格式,列式存储格式和行存储格式异同点,列式存储优点有哪些?
- HDFS如何保证数据不丢失?
- HDFS NameNode高可用如何实现?需要哪些角色?
- HDFS的文件结构?">HDFS的文件结构?
- HDFS的默认副本数?为什么是这个数量?如果想修改副本数怎么修改?
- 介绍下HDFS的Block
- HDFS的块默认大小,64M和128M是在哪个版本更换的?怎么修改默认大小? ">HDFS的块默认大小,64M和128M是在哪个版本更换的?怎么修改默认大小?
- HDFS HA怎么实现?是个什么架构?
- 导入大文件到HDFS时如何自定义分片?
- HDFS的mapper和reducer的个数如何确定?reducer的个数依据是什么?
- HDSF通过那个中间组件去存储数据
- HDFS跨节点怎么进行数据迁移
- HDFS的数据一致性靠什么保证?
- HDFS怎么保证数据安全
- HDFS中向DataNode写数据失败了怎么办
- Hadoop2.xHDFS快照">Hadoop2.xHDFS快照
- HDFS写数据过程,写的过程中有哪些故障,分别会怎么处理? ">HDFS写数据过程,写的过程中有哪些故障,分别会怎么处理?
- NameNode存数据吗?
- 使用NameNode的好处
- HDFS中DataNode怎么存储数据的
- 直接将数据文件上传到HDFS的表目录中,如何在Hive表中查询到该数据?
- 介绍下MapReduce
- MapReduce优缺点
- MapReduce架构(过时,新版已经不是JobTracker和TaskTracker,取而代之的是YARN组件)
- MapReduce工作原理">MapReduce工作原理
- MapReduce哪个阶段最费时间
- MapReduce中的Combine是干嘛的?有什么好外?
- MapReduce为什么一定要有环型缓冲区
- MapReduce为什么一定要有Shuffle过程
- MapReduce的Shuffle过程及其优化
- Reduce怎么知道去哪里拉Map结果集?
- Reduce阶段都发生了什么,有没有进行分组
- MapReduce Shuffle的排序算法
- shuffle为什么要排序?
- 说一下map是怎么到reduce的?
- 说一下你了解的用哪几种shuffle机制?
- MapReduce的数据处理过程
- mapjoin的原理(实现)?应用场景?
- reducejoin如何执行(原理)
- MapReduce为什么不能产生过多小文件
- MapReduce分区及作用
- ReduceTask数量和分区数量关系
- Map的分片有多大
- MapReduce join两个表的流程?
- 手撕一段简单的MapReduce程序
- reduce任务什么时候开始?
- MapReduce的reduce使用的是什么排序?
- MapReduce怎么确定MapTask的数量?
- Map数量由什么决定
- MapReduce的map进程和reducer进程的ivm垃圾回收器怎么选择可以提高吞吐量?
- MapReduce的task数目划分
- MapReduce作业执行的过程中,中间的数据会存在什么地方?不会存在内存中么?
- Mapper端进行combiner之后,除了速度会提升,那从Mapper端到Reduece端的数据量会怎么变?
- map输出的数据如何超出它的小文件内存之后,是落地到磁盘还是落地到HDFS中?
- Map到Reduce默认的分区机制是什么?
- 结合wordcount述说MapReduce,具体各个流程,map怎么做,reduce怎么做
- MapReduce数据倾斜产生的原因及其解决方案
- Map Join为什么能解决数据倾斜
- MapReduce运行过程中会发生OOM,OOM发生的位置?
- MapReduce用了几次排序,分别是什么?
- MapReduce压缩方式
- MapReduce中怎么处理一个大文件
- 介绍下YARN
- YARN有几个模块
- YARN工作机制
- YARN有什么优势,能解决什么问题?
- YARN容错机制
- YARN高可用
- YARN调度器
- YARN中Container是如何启动的?
- YARN的改进之处,Hadoop3.x相对于Hadoop 2.x?
- YARN监控
如果让你对大数据平台进行技术选型,你是选择原生Hadoop还是CDH/HDP?这样选择的依据是什么?
学习阶段采用Apache,工作中尽量用CDH/HDP,目前HDP被CDH收购了。 Apache Hadoop:官方版本,开源
Cloudera Hadoop(CDH):商业版本,对官方版本做了一些 优化,提供收费技术支持,提供界面操作,方便集群运维管理
HortonWorks(HDP):开源,提供界面操作,方便运维管理
建议在实际工作中搭建大数据平台时选择 CDH或者HDP,方便运维管理
动手配置一个Hadoop客户端节点,都有哪些注意事项?
- 先配置SSH免密
- 拷贝Hadoop文件(master、slaves文件不需要修改)
- 创建用户,修改环境变量即可
Hadoop客户端节点是怎么识别Hadoop集群的?
个人理解:通过hadoop中的master和slaves文件识别集群
如何实现大海捞针,从HDFS中揪出不经常使用并且占用空间的大文件?
如何获取指定的HDFS目录下所有文件的Block块信息?
通过查看NameNode节点的fsimage文件,可以找到所有文件对应的Block信息
我们自己串联多块硬盘实现海量数据存储和使用HDFS有什么区别?
自己多块硬盘:存储和计算分离,没有相应的工具管理,不容易拓展 HDFS:存储和计算结合,有相应的Web工具管理,容易拓展,有完善的恢复和容错能力,可以部署到很多廉价机器上
HDFS集群之间是否可以实现数据迁移?
可以,hadoop自带了数据迁移工具DistCp
HDFS中的回收站和windows中的回收站有什么区别?
HDFS中的回收站默认是关闭的,如果需要开启,需要修改core-site.xml文件,开启回收站,当文件太大,回收站接受不了的时候,需要在hdfs dfs -rm后面加上-skipTrash,跳过回收站,并且,回收站中的数据都有一个生命周期,可以配置,到点了会自动删除。 Windows的回收站有大小,但是不会自动删除。
Hadoop中必须要有SecondaryNameNode进程吗?
不是,SecondaryNameNode主要负责定期把edits文件中的内容合并到fsimage中,这个合并操作称为checkpoint ,在合并的时候会对edits中的内容进行转换,生成新的内容保存到 fsimage文件中。 但是在NameNode的HA架构中没有SecondaryNameNode进程,文件合并会由standbyNameNode负责实现 所以在Hadoop集群中,SecondaryNameNode进程不是必须的
HDFS中NameNode内存将要耗尽,有什么解决方案?
NameNode启动的时候会把文件中的元数据信息加载到内存中,然后每一 个文件的元数据信息会占用150字节的内存空间,这个是恒定的,和文件大小没有关系,咱们前面 在介绍HDFS的时候说过,HDFS不适合存储小文件,其实主要原因就在这里,不管是大文件还是 小文件,一个文件的元数据信息在NameNode中都会占用150字节,NameNode节点的内存是有限的,所以它的存储能力也是有限的,如果我们存储了一堆都是几KB的小文件,最后发现 NameNode的内存占满了,确实存储了很多文件,但是文件的总体大小却很小,这样就失去了 HDFS存在的价值 通过将文件进行压缩,使用SequenceFile,减少小文件,这样可以节约内存 采用 Federation+HA。HDFS Federation可以解决单一命名空间存在的问题,使用多个NameNode,每个NameNode负责一个命令空间 这种设计可提供以下特性: 1:HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点,不再因内存的限制制约文件存储数目。 2:性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐 率。 3:良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很小。
一台128G内存的NameNode节点理论上可以存储多少文件的元数据?
一个字节8bit,1B=8bit,元数据信息在NameNode中都是150字节。 1GB=10241MB 1MB=10241KB 1KB=1024B 那么128GB=12810241024*1024=140,737,488,355,328 140,737,488,355,328 / 150 = 938,249,922,368.85333333333333333333 大概九千亿的文件
HDFS中的安全模式是为了干什么?有什么意义?
HDFS的安全模式是一种特殊的状态,在安全模式下,只能做数据的读取操作,不能进行增、删、改。 一般在开启集群的时候会进入安全模式,过了一会就自动退出,或者可以手动进入安全模式。 集群在安全模式做了什么? 1、NameNode合并FSimage和edit恢复元数据,恢复到集群上次关机前的状态。整理维护DataNode上报的心跳信息 2、DataNode启动的时候向NameNode汇报可用的block状态 它是HDFS确保集群安全的一种保护机制, NameNode如果检测到任何异常,便会进入到安全模式,直到问题解决。
HDFS的存储能力理论上来说是有极限的,如何扩容?
采用 Federation+HA。HDFS Federation可以解决单一命名空间存在的问题,使用多个NameNode,每个NameNode负责一个命令空间 这种设计可提供以下特性: 1:HDFS集群扩展性。多个NameNode分管一部分目录,使得一个集群可以扩展到更多节点,不再因内存的限制制约文件存储数目。 2:性能更高效。多个NameNode管理不同的数据,且同时对外提供服务,将为用户提供更高的读写吞吐 率。 3:良好的隔离性。用户可根据需要将不同业务数据交由不同NameNode管理,这样不同业务之间影响很小。
开发脚本实现定时向HDFS中上传内容和下载内容
#!/bin/bash
#获取昨天日期字符串
yesterdey=$1
if [ "$yesterday" = "" ]
then
yesterday=`date +%Y_%m_%d --date="1 days ago"`
fi
#拼接日志文件路径信息
logPath=/data/log/access_${yesterday}.log
#将日期字符串中的_去掉
hdfsPath=/log/${yesterday//_/}
#在hdfs上创建目录
hdfs dfs -mkdir -p ${hdfsPath}
#将数据上传到hdfs的指定目录中
hdfs dfs -put ${logPath} ${hdfsPath}
#然后将这个脚本放到crontab中,定时执行(这个是不在这个文件内容中的)
crontab -e
0 1 * * * root sh /data/shell/uploadLogData.sh >> /data/shell/uploadLogData.log
如何开发一个只有map阶段的MapReduce任务?这种任务的应用场景是什么?
做一些简单的聚合排序操作,并且不需要后续处理,这种只需要开发一个map任务即可。reduce啥也不用做
使用MapReduce如何开发自定义二次排序Key?
- 方案一:将需要排序的字段和Key整合
- 方案二:分组后在reduce中进行排序
使用MapReduce如何实现统计TopN的需求?
- map函数抓取对应
对 - reduce函数将所有相同的key的value求和得到sum,将sum存到TreeMap中
- TreeMap按key降序输出数据,即TopN数据
如果MapReduce任务中没有shuffle过程会出现什么现象?
没有shuffle的话,那么reduce任务的负载就会过多,可能需要负责一部分的归并操作
MapReduce中的Combiner阶段在什么场景下适合使用?
如果后续不需要复杂的reduce任务,可以用Combiner,并且使用Combiner时,要注意,计算结果应该和全局是无关的这种情况。
如何使用MapReduce对数据实现全局排序?
- 使用一个reduce实现全局排序
- 自定义分区函数实现全局排序
- 使用TotalOrderPartitioner进行全局排序
能不能使用zip或者rar文件解决HDFS中的小文件问题?
1、不能,zip或者rar打包的数据在mapreduce的时候不支持切片(不支持拆分成多个map任务),hadoop只支持使用bzip2、LZO压缩算法时支持切片,但压缩速率同样较慢,影响集群计算效率。 2、zip或者rar文件本质上只是将所有文件压缩打包成二进制文件,解压速率慢,HDFS无法将其读取并切分成多个Map任务,而HDFS自带的SequenceFile和MapFile在压缩的基础上支持切片成多个Map任务并行计算。
SequenceFile与MapFile的区别 ?
SequenceFile: 1、SequeceFile是Hadoop提供的一种二进制文件,这种二进制文件直接将
对序列化到文件中 2、一般对小文件可以使用这种文件合并,即将文件名作为key,文件内容作为value序列化到大文件中 3、注意:SequeceFile需要一个合并文件的过程,文件较大,且合并后的文件将不方便查看,必须通过遍历查看每一个小文件 MapFile: 1、MapFile是排序后的SequenceFile , MapFile由两部分组成,分别是index和data 2、index作为文件的数据索引,主要记录了每个Record的key值,以及该Record在文件中的偏移位置 3、在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置
总结一下数据倾斜产生的原因,如何避免?如何解决?
数据倾斜往往是某一个key数量过多导致的,在reduce的时候,分区通常根据键值然后hash取余进行分区,往往某一个key数量过多,那么经过分区,大量相同key是会分到同一个reduce端跑,导致那一个reduce任务执行很慢很慢。 避免:1、增加reduce任务数量,通常提升不大,有时候会有反作用 2、对数量过多的key值进行修改,把它打散到其他reduce上,这个能根治倾斜严重的数据
如何从一批数据中找出倾斜的key?
一般来说,我们只需要知道发生了数据倾斜即可,因为通用的解决数据倾斜问题的办法都不是针对特定值的处理来解决的(当然偶尔也有,比如null空值问题),所以不关心到底具体到哪种值的数据导致了数据倾斜。当然,如果一定要知道,可以自己写个通用mr(就是wordcount,加combiner,输入可以指定特定字段组合作为你的key,以及一个阈值,超过这个阈值的写出来,就可以知道哪些数据是非常多的)
分析一下Hadoop中的RPC框架?
hadoopRPC主要分为四个部分:序列化层、函数调用层、网络传输层、服务端处理框架
- 序列化层:
- 序列化的主要作用是将结构化对象转换为字节流以便通过网络进行传输或者写入持久存储。在RPC框架中,它主要用于将用户请求中的参数或者应答转换为字节流以便跨机传输
- 函数调用层:
- 函数调用层主要功能是:定位要调用的函数,并执行该函数,Hadoop采用了Java的反射机制和动态代理实现了函数的调用
- 网络传输层:
- 网络传输层描述了Client和Server之间消息的传输方式,Hadoop采用了基于TCP/IP的socket机制
- 服务端处理框架:
- 服务端处理框架可被抽象为网络I/O处理模型,她描述了客户端和服务端信息交互的方式,它的设计直接决定了服务端的并发处理能力。常见的网络I/O模型有阻塞式I/O,非阻塞式I/O、事件驱动式I/O等,而Hadoop采用了基于reactor设计模式的事件驱动I/O模型
YARN中的调度器
在MapReduce中如何实现多路输入(同时指定多个不同的输入目录)?
使用MultipleInputs.addInputPath()
在MapReduce中如何实现多路输出(按照一定规则,将结果输出到多个不同的目录中)?
在setup()函数里面配置多路输出器MultipleOutputs
multipleOutputs,最后在cleanup()函数里销毁对象
谈一下你对本地计算的理解?它的计算性能为什么这么高?
本地计算数据不需要通过网络进行传输,同时,数据也不需要经过序列化和反序列化的处理,计算性能自然高起来了
谈一谈你对源码分析的看法?如何快速高效分析项目源码?
我任务看源码首先得了解他的架构,知道他的逻辑,然后再去深入源码看它的具体实现过程
介绍下Hadoop
Hadoop是一个生态体系,是目前大数据领域的代名词。里面包含了许许多多的工具和软件,共同为大数据领域做出了很多贡献。
百度:Hadoop是一个分布式系统基础架构,主要是为了解决海量数据的存储和海量数据的分析问题
Hadoop的特点
- 高容错,数据有多个副本 , 当机器宕机时 , 会自动复制副本到其他机器上 , 维持副本个数 , 自动分配失败的任务
- 高可靠,数据有多个副本存储在不同机器上,保证数据的安全可靠
- 高扩展,运算资源存储容量不足时可以横向拓展机器节点来增加
- 高性能,在MapReduce的思想下,Hadoop可以并行工作,加快任务处理速度
- 低成本,Hadoop可以运行在廉价的机器上
- 社区丰富,技术成熟
Hadoop主要分哪几个部分?他们有什么作用?
HDFS:分布式存储,用于数据的存储管理 MapReduce:数据计算框架,对数据进行处理 Yarn:资源调度框架,给不同节点进行资源的调度 Commons:提供hadoop底层技术支持
Hadoop 1.x,2x,3.x的区别
Hadoop1.x:Common、HDFS、MapReduce Hadoop2.x:Common、HDFS、MapReduce、Yarn Hadoop3.x:Common、HDFS、MapReduce、Yarn
Hadoop集群工作时启动哪些进程?它们有什么作用?
NameNode:负责元数据的管理,以及管理各节点的负载均衡,同时响应客户端的请求 SecondaryNameNode:协助NameNode的checkpoint过程,负责fsimage和editlog的合并操作,加快集群启动速度 DataNode:真正用来存储数据的节点
在集群计算的时候,什么是集群的主要瓶颈
集群的最主要瓶颈是磁盘。当面临集群作战时,所希望的是即读即得。可是面对大数据,读取数据需要经过磁盘IO,可以把IO理解为水的管道。管道越大越强,对于T级的数据读取就越快。所以IO的好坏,直接影响了集群对于数据的处理。
搭建Hadoop集群的xml文件有哪些?
- hdfs-site.xml
- core-site.xml
- yarn-site.xml
- mapred-site.xml
Hadoop的checkpoint流程
- 首先,namenode启动一个新的editlog文件,同时将新的日志写到这个新的editlog文件中
- 与此同时,将旧的editlog文件和fsimage文件发送给secondarynamenode,secondarynamenode负责将editlog和fsimage文件进行合并,这个过程叫做checkpoint
- 合并完之后,将fsimage文件再重新发送给namenode,如此反复循环
Hadoop的默认块大小是多少?为什么要设置这么大?
128MB,因为每个文件都会在namenode内存中存储一份元数据,而如果block设置过小,那么block多数量就过多,那么内存占用就多,从而影响性能 如果block设置过大,从磁盘传输数据的时间明显大于寻址时间,导致处理该块数据时比较慢
Block划分的原因
目的:减少磁盘寻道的时间
- 不设置block:因为数据是分散的存放在磁盘上的,读取数据时需要不停的进行磁盘寻道,开销比较大
- 设置block:一次可以读取一个block中的数据,减少磁盘寻道的次数和时间
其他:block在磁盘上非连续存储的,读取数据时需要磁盘寻道
Hadoop常见的压缩算法?
- Gzip
- 优点:压缩比在四种压缩方式中较高;hadoop本身支持,在应用中处理gzip格式的文件就和直接处理文本一样;有hadoop native库;大部分linux系统都自带gzip命令,使用方便
- 缺点:不支持split
- LZO
- 优点:压缩/解压速度也比较快,合理的压缩率;支持split,是hadoop中最流行的压缩格式;支持hadoop native库;需要在linux系统下自行安装lzop命令,使用方便
- 缺点:压缩率比gzip要低;hadoop本身不支持,需要安装;lzo虽然支持split,但需要对lzo文件建索引,否则hadoop也是会把lzo文件看成一个普通文件(为了支持split需要建索引,需要指定inputformat为lzo格式)
- Snappy
- 优点:压缩速度快;支持hadoop native库
- 缺点:不支持split;压缩比低;hadoop本身不支持,需要安装;linux系统下没有对应的命令
- Bzip2
- 优点:支持split;具有很高的压缩率,比gzip压缩率都高;hadoop本身支持,但不支持native;在linux系统下自带bzip2命令,使用方便
- 缺点:压缩/解压速度慢;不支持native
Hadoop作业提交到YARN的流程?
- 作业提交
- Client调用job.waitForCompletion方法,像整个集群提交MapReduce作业。
- Client向ResourceManager申请一个作业id
- RM给Client返回资源提交的路径和作业id
- Client将jar包、切片信息、xml配置文件提交到指定路径
- Client提交完成后向RM申请运行mrApplicationMaster
- 作业初始化
- RM收到Client请求后,将job转换为一个Task,提交到任务队列中
- 某一个空闲的NodeManager领取该job
- NM创建Container,申请运行mrApp
- NM下载Client提交的资源
- 任务分配
- mrApp首先注册自己并保持与RM的联系
- mrApp向RM请求运行多个MapTask任务
- RM将mrApp提交的任务分配给多个NM,NM分别启动MapTask
- 运行MapTask期间,mrApplicationMaster和NM通信,获取容器状态,监督任务执行情况
- MapTask运行完毕以后,mrAM向RM请求运行ReduceTask
- ReduceTask从MapTask获取相应的分区数据
- 程序运行完毕后,mrAM向RM注销自己,释放资源
Hadoop的Combiner的作用
将MapTask处理完的数据进行再次处理,减少网络中数据的传输量,提高计算效率,前提是这些操作不会影响后续的计算。
Hadoop序列化和反序列化
- 序列化:序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便与存储到磁盘(持久化)和网络传输
- 反序列化:反序列化就是将收到字节序列(或其它数据传输协议)或者是磁盘的持久化数据,转换成内存中的对象
- Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校检信息,Header,继承体系等),不便于在网络中高效传输。所以,Hadoop自己开发了一套序列化机制(Writable)
- 紧凑:高效使用存储空间
- 快速:读写数据的额外开销小
- 互操作:支持多语言的交互
Hadoop的运行模式
- 单机(本地)模式:这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统。在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM。这里同样没有DFS,使用的是本地文件系统。单机模式适用于开发过程中运行MapReduce程序,这也是最少使用的一个模式
- 伪分布式模式:也是在一台单机上运行,但用不同的Java进程模仿分布式运行中的各类节点(NameNode,DataNode,JobTracker,TaskTracker,SecondaryNameNode),伪分布式(Pseudo)适用于开发和测试环境,在这个模式中,所有守护进程都在同一个机器上运行
- 全分布式模式:全分布模式通常被用于生产环境,使用N台主机组成一个Hadoop集群,Hadoop守护进程运行在每台主机之上。这里会存在NameNode运行的主机,DataNode运行的主机,以及Tasktracker运行的主机。在分布式环境下,主节点和从节点会分开
Hadoop小文件处理问题
- 小文件优化的方向:
- 在数据采集的时候,就将小文件或小批数据合成大文件再上传HDFS
- 在业务处理之前,在HDFS上使用MapReduce程序对小文件进行合并
- 在MapReduce处理时,可采用CombineTextInputFormat提高效率
- 开启uber模式,实现JVM重用
- Hadoop Archive
- 是一个高效的将小文件放入HDFS块中的文件存档工具,能够将多个小文件打包成一个HAR文件,从而减少NameNode的内存使用
- CombineTextInputFormat
- CombineTextInputFormat用于将多个小文件在切片过程中生成一个单独的切片或者少量的切片
- 开启uber模式,实现JVM重用
- 默认情况下,每个Task任务都需要启动一个JVM来运行,如果Task任务计算的数据量很小,我们可以让同一个Job的多个Task运行在一个JVM中,不必为每个Task都开启一个JVM
Hadoop为什么要从2.x升级到3.x?
Hadoop3.0中引入了一些重要的功能和优化,包括HDFS可擦除编码、多NameNode支持、MR Native Task优化、YARN基于cgroup的内存和磁盘IO隔离、YARN container resizing等
Hadoop的优缺点
优点:
- 高可靠性。Hadoop按位存储和处理数据的能力值得人们信赖。
- 高拓展性。Hadoop是在可用的计算机集簇间分配数据并完成计算任务的,这些集簇可以方便地拓展到数以千计的节点中。
- 高效性。Hadoop能够在节点之间动态地移动数据,并保证各个节点的动态平衡,因此处理速度非常快。
- 高容错性。Hadoop能够自动保存数据的多个副本,并且能够自动将失败的任务重新分配。
- 低成本。与一体机、商用数据仓库以及QlikView、Yonghong Z-Suite等数据集市相比,hadoop是开源的,项目的软件成本因此会大大降低。
- Hadoop带有用Java语言编写的框架,因此运行在Linux生产平台上是非常理想的。Hadoop上的应用程序也可以使用其他语言编写,比如C++。
缺点:
- 不能做到低延迟:由于Hadoop针对高书记吞吐量做了优化,牺牲了获取数据的延迟,所以对于低延迟数据访问,不适合hadoop,对于低延迟的数据访问,HBase是更好的选择。
- 不适合大量的小文件存储:由于NameNode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于NameNode的内存容量,根据经验,每个文件、目录和数据块的存储信息大约占150字节。
- 不适合多用户写入文件,修改文件:Hadoop2.0虽然支持文件的追加功能,但是还是不建议对HDFS上的文件进行修改,因为效率低。
- 对于上传到HDFS上的文件,不支持修改文件,HDFS适合一次写入,多次读取的场景。
- HDFS不支持多用户同时执行写操作,即同一时间,只能有一个用户执行写操作。
特点:
- 支持超大文件:一般来说,HDFS存储的文件可以支持TP和PB级别的数据
- 检测和快速应对硬件故障:在集群环境中,硬件故障是常见性问题,因为有上千台服务器连在一起,故障率高,一次故障检测和自动恢复是HDFS文件系统的一个设计目标
- 流式数据访问:HDFS的数据处理规模比较大,应用一次需要大量的数据,同时这些应用一般都是批量处理,而不是用户交互式处理,应用程序能以流的形式访问数据库。
- 简化的一致性模型:对于外部使用用户,不需要了解hadoop底层细节,比如文件的切块、文件的存储、节点的管理
- 高容错性:数据自动保存多个副本,副本丢失后自动恢复。可构建在廉价机上,实现线性(横向)扩展,当集群增加新节点之后,namenode也可以感知,将数据分发和备份到相应的节点上。
- 商用硬件:Hadoop并不需要运行在昂贵且高可靠的硬件上,它是设计运行在商用硬件的集群上的,因此至少对于庞大的集群来说,节点故障的几率还是非常高的。HDFS遇到上述故障时,被设计成能够继续运行且不让用户察觉到明显的中断。
HDFS文件写入和读取流程
写流程:
- Client连接HDFS,发送上传文件请求
- NameNode响应请求,对文件进行校验;校检成功后返回要存放文件的block所对应的DataNode的信息列表;
- 例如:
- block01:datanode1、datanode2
- block02:datanode2、datanode4
- Client拿到了dataNode的列表后,开始上传文件
- 先上传block1,按照列表将其上传到dataNode1、dataNode2
- 所有的dataNodes列表中的数据块都上传完之后,返回确认上传信息
- 收到全部上传完毕的确认信息,Client关闭文件输出流
- NameNode接收到Client的信息判断文件是否上传成功,如果成功就更新元数据信息
读流程:
- 使用HDFS提供的Client向NameNode发送RPC请求,请求读取文件
- NameNode响应请求,返回该文件全部的blocks的信息,dataNodes列表
- 例如:
- block01:dataNode1、dataNode2、dataNode3
- block02:dataNode2、dataNode3、dataNode4
- Client会选择离Client最近的dataNode进行block的读取;如果Client本身就是dataNode节点,Client就直接在本地读取
- 读取完当前的block1之后,Client关闭当前dataNode的链接,然后寻找读取下一个block2的dataNode
- 当读取完当前的blocks列表之后,发现整个文件还没有读取完,Client会继续向NameNode请求下一批blocks的信息,再进行读取,知道读完整个文件
- 读取过程中,每读完一个block都会进行checksum验证;如果读取dataNode时出现错误,Client将通知NameNode再从下一个拥有该block的dataNode继续读
HDFS组成架构
HDFS是一个主从Master/Slave架构。一个HDFS集群包含一个NameNode,这是一个Master Server,用来管理文件系统的命名空间,以及调节客户端对文件的访问。一个HDFS集群还包括多个DataNode,用来存储数据
- NameNode:存储数据的元数据
- 接受用户操作请求
- 维护文件系统的目录结构
- 管理文件与block之间关系,block与datanode之间关系
- DataNode:
- 文件被分成block存储在磁盘上
- 为保证数据安全,文件会有多个副本
- client:分别访问NameNode和DataNode以获取文件的元信息及内容
- SecondaryNameNode:用于定期合并fsimage和editlog,生成新的fsimage,并推送给NameNode,替换旧的fsimage
HDFS作用
HDFS全称Hadoop分布式文件系统,其最主要的作用是作为Hadoop生态中各系统的存储服务
HDFS的容错机制
- HDFS数据读、写原理以及容错
- 写容错
- 读容错
HDFS的存储机制
- HDFS开创性地设计出一套文件存储方式。即对文件分割后分别存储
- HDFS将要存储的大文件进行切割,切割后存放在既定的存储块(Block)中,并通过预先设定的优化处理、模式对存储的数据进行预处理,从而攻克了大文件存储和计算的需求
- 一个HDFS集群包含两个部分。即NameNode与DataNode,一般来说,一个集群中会有一个NameNode和多个DataNode共同工作
- NameNode是集群的server,主要是用于对HDFS中全部都文件及内容数据进行维护,并不断读取记录集群中DataNode主机情况与工作状态,并通过读取与写入镜像日志文件的方式进行存储
- DataNode在HDFS集群中担任任务详细执行角色,是集群的工作节点。文件被分为若干个同样大小的数据块,分别存储在若干个DataNode上。DataNode会定期向集群内NameNode发送自己的执行状态和存储内容,并依据NameNode发送的指令进行工作
- NameNode负责接收Client发送过来的信息,然后将文件存储位置信息发送给提交请求的Client。由Client直接与DataNode进行联系,从而进行部分文件的运算与操作
- Block是HDFS的基本存储单元,默认大小是128MB
- HDFS还能够对已经存储的block进行多副本备份,将每一个block至少拷贝到3个相互独立的硬件上,这样能够高速恢复损坏的数据
- 用户能够使用既定的API接口对HDFS中的文件进行操作
- 当Client的读取操作发生错误的时候。client会向NameNode报告错误,并请求NameNode排除错误的DataNode后又一次依据距离排序,从而获得一个新的DataNode的读取路径。假设全部都DataNode都报告读取失败,那么整个任务就读取失败
- 对于写出操作过程中出现的问题。FSDataOutputStream并不会马上关闭。Client向NameNode报告错误信息。并直接向提供备份的DataNode中写入数据。
HDFS的副本机制
HDFS故障类型和其检测方法
- 节点故障
- 主要关注DataNode的检查方法
- DataNode每3秒会向NameNode发送自己的心跳信息,如果十分钟内NameNode没有收到心跳信息,就判定DataNode死亡
- 通讯故障
- 每当发送数据,接受者会回复一个应答信号
- 如果没有收到应答信号(多次尝试),发送者就认为主机已经挂掉,或者发生网络错误
- 数据损坏
- 校验和-数据
- 当向硬盘存储数据时,也会存储校验和
HDFS的常见数据格式,列式存储格式和行存储格式异同点,列式存储优点有哪些?
面向行:同一行的数据存储在一起,即连续存储。SequenceFile、MapFile、Avro DataFile。采用这种方式,如果只需要访问行的一小部分数据,亦需要将整行读入内存,推迟序列化一定程度上可以缓解这个问题,但是从磁盘读取整行数据的开销却无法避免。面向行当存储适合于整行数据需要同时处理的情况。 面向列:整个文件被切割为若干列数据,每一列数据一起存储。Parquet、RCFile、ORCFile。面向列的格式使得读取数据时,可以跳过不需要的列,适合于只处理行当一小部分字段的情况。但是这种格式的读写需要更多的内存空间,因为需要缓存行在内存中(为了获取多行中的某一列)。同时不适合流式写入,因为一旦写入失败,当前文件无法恢复,而面向行的数据在写入失败时可以重新同步到最后一个同步点,所以Flume采用的是面向行的存储格式。
HDFS如何保证数据不丢失?
数据写入和读取之前会进行校验,NameNode会周期性的通过DataNode汇报的心跳信息中提取block块的校验和进行检查,如果丢失,则会从其他副本中复制一份进行恢复
HDFS NameNode高可用如何实现?需要哪些角色?
Active NameNode:活跃的namenode Standby NameNode:备用namenode HealthMonitor:监控namenode健康状态的进程 ZKFailoverController:作为NameNode上独立的进程,启动时会创建HealthMonitor和ActiveStandbyElector ActiveStandbyElector:负责完成自动的主备选举,内部封装了zookeeper的处理逻辑
HDFS的文件结构?
HDFS的默认副本数?为什么是这个数量?如果想修改副本数怎么修改?
HDFS采用一种称为机架感知的策略来改进数据的可靠性、可用性和网络带宽的利用率。在大多数情况下,HDFS的副本系数是3,HDFS的存放策略是一个副本存放在本地机架节点上,另一个副本存放在同一机架的另一个节点上,第三个副本存放在不同机架的节点上。这种策略减少了机架间的数据传输,提高了写操作的效率。机架错误的概率远比节点错误的概率小,所以这种策略不会对数据的可靠性和可用性造成影响。与此同时,因为数据只存在两个机架上,这种策略减少了读数据时需要的网络传输带宽。在这种策略下,副本并不是均匀地分布在机架上。这种策略在不损坏可靠性和读取性能的情况下,改善了写的性能。
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
介绍下HDFS的Block
HDFS中存储数据的是DataNode节点,而DataNode几点里面是分为一个个block块存储数据的。 因为读磁盘是需要寻道时间的,随机读会造成寻道的时间比真正读出磁盘内容的时间占比过大。人们发现规律,读取当前数据的时候,很大可能会读取前后附近的数据。这不如直接就读出一大片数据算了。一整块数据读到内存里只需要寻道一次,还高效。而且大文件数据可能一个地方放不下,需要被拆开放多个电脑存储。所以block都出现是很有现实意义的。
HDFS的块默认大小,64M和128M是在哪个版本更换的?怎么修改默认大小?
HDFS的块大小在2.7.3之后是128M,在之前是64M。
<property>
<name>dfs.block.size</name>
<value>512000</value>
</property>
HDFS HA怎么实现?是个什么架构?
导入大文件到HDFS时如何自定义分片?
hadoop的作业在提交过程中,需要把具体的输入进行分片。具体的分片细节由InputSplitFormat指定。
HDFS的mapper和reducer的个数如何确定?reducer的个数依据是什么?
Mapper数量确定:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask,所以只能通过设定分片的大小间接调整mapper的个数 Reducer数量确定:reducer的个数可以由用户独立设置的,在默认情况下只有一个reducer。他的个数既可以使用命令行参数设置(mapreduce.job.reduces=number),也可以在程序中指定(job.setNumReduceTasks(number))。 注意:
- 如果ReduceTask数量 > getPartition的结果数
- 则会多产生几个空的输出文件
- 如果ReduceTask数量 < getPartition的结果数
- 会有一部分分区数据无处安放,会报错Exception
- 如果ReduceTask的数量=1
- 不管MapTask端输出多少个分区文件,最终结果都交给这一个ReduceTask,最终也只会产生一个结果文件
- 分区号是从0开始,逐一累加
HDSF通过那个中间组件去存储数据
Client:就是客户端,负责文件的切分,将文件切分为大小相同的物理快(Block)分布式存储在DataNode中。与NameNode进行交互,获取文件的位置信息,与DataNode进行交互,读取或者写入文件。
HDFS跨节点怎么进行数据迁移
- scp实现两个远程主机之间的文件复制
scp -r hello.txt root@slave1:/user/hello.txt //推 push
scp -r root@slave1:/user/hello.txt hello.txt //拉 pull
scp -r root@slave1:/user/hello.txt root@slave2:/user/hello.txt //通过本地主机实现两个远程主机的文件复制
- 采用distcp命令实现两个Hadoop集群之间的递归数据复制
hadoop distcp hdfs://master:9000/user/hello.txt hdfs://bigdata:9000/user/hello.txt
HDFS的数据一致性靠什么保证?
- 在文件刚刚开始建立的时候,文件中的每个数据块都会产生一个校验和(checksum),这个校验和会保存在.meta文件内部。
- 客户端获取数据的时候会和这个校验和进行对比,检查是否相同,从而发现数据块是否损坏。
- 如果说正在读取的数据块损坏,则可以读取其他副本。接着NameNode会标记该block块已经损坏,然后复制该block达到预期设置的文件备份数。
- DataNode在其文件创建后三周验证其校验和(checksum)
HDFS怎么保证数据安全
- 认证(authentication):认证指的是向一个系统或是用户提出怀疑,让其证明自己的身份。只有经过认证的身份才被允许进入到数据系统
- 授权(authorization):授权是指授予一个通过认证的用户访问数据资源的权限
- 审计(auditing):所有的访问和操作都需要被记录在审计日志中,以便在稍后的时间点进行审计
HDFS中向DataNode写数据失败了怎么办
当Client在写入过程中,有DataNode挂了。写入过程并不会立即终止(如果立即终止,易用性和可用性都不太好),取而代之HDFS尝试从流水线中摘除挂了的DataNode并恢复写入,这个过程称为pipeline recovery 如果发生这种情况,那么会执行一些操作:
- Pipeline数据流管道会被关闭,ACK queue中的packets会被添加到data queue的前面以确保不会发生packets数据包的丢失
- 在正常的DataNode节点上的以保存好的block的ID版本会升级——这样发生故障的DataNode节点上的block数据会在节点恢复正常后被删除,失效节点也会被从Pipeline中删除
- 剩下的数据会被写入到Pipeline数据流管道中的其他两个节点中
Hadoop2.xHDFS快照
HDFS snapshot是HDFS整个文件系统,或者某个目录在某个时刻的镜像。该镜像并不会随着源目录的改变而进行动态的更新、可以将快照理解为拍照片时的那一瞬间的投影,过了那段时间之后,又会有新的一个投影。 HDFS快照的核心功能包括:数据恢复、数据备份、数据测试。
HDFS写数据过程,写的过程中有哪些故障,分别会怎么处理?
NameNode存数据吗?
- 主服务器管理文件的命名空间信息
- 凡是对文件系统命名或其他属性的修改信息都会保存到这里。比如,有个名为Eva的文件放在目录/usr下,现在要将他改名为zuo,移动到/usr/local目录下,这些修改日志都会被 NameNode的edit log文件记录。
- 存放HDFS的元数据信息
- 即文件系统的目录树以及追踪集群文件,简单来说就是NameNode不实际存储数据,但是他知道数据的存放位置。这些信息不是长久固定的,每次启动系统后需要重新从数据节点获取这些信息。比如,向上篇中的3号block放到从节点003,008,010这个节点上,在NaemNode中就会有一个信息:“3号数据块放在003,008,010这三个节点上”。
- 数据块位置分配信息
- 每个数据文件被切分成128MB的大小的数据块之后,主节点会查看各个从节点的内存情况,选取内存较合适的从节点存放数据块。
使用NameNode的好处
NameNode:就是master,它是一个主管、管理者
- 管理HDFS的名称空间
- 管理数据块(Block)映射信息
- 配置副本策略
- 处理客户端读写请求
HDFS中DataNode怎么存储数据的
一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和以及时间戳
直接将数据文件上传到HDFS的表目录中,如何在Hive表中查询到该数据?
这里如果直接将新的分区文件上传到hdfs上,因为hive没有对应的元数据所以是无法査询到数据的,所以我们要进行表修复或者添加分区。 方案一:上传数据后修复表
hdfs dfs -mkdir -p 分区目录
hdfs dfs -put 分区目录
hive>msck repair table 表名
方案二:上传数据后添加分区
hdfs dfs -mkdir -p 分区目录
hdfs dfs -put 分区目录
hive>alter table 表名 add partition()
介绍下MapReduce
MapReduce是一个分布式运算程序的编程框架,它的核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上
MapReduce优缺点
- 优点
- 易于编程:以普通程序的编程方法加上使用MapReduce提供的接口,可以快速完成分布式程序的编写
- 良好的拓展性:计算资源得不到满足时,可以通过简单的增加计算器来拓展计算能力
- 高容错性:如果一个任务所在计算节点挂了,上面的计算任务可以自动转移到另外的节点上执行,即故障自动转移,这个过程是内部完成的,无需人工干预
- 适合PB级别以上数据的离线处理
- 缺点
- 不擅长实时计算:无法像mysql一样在毫秒级或者秒级返回计算结果
- 不擅长流式计算:流式计算的输入数据是动态的,而MapReduce要求输入数据是静态的,已经持久化在存储上
- 不擅长DAG(有向无环图)计算:多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出,这种情况下,MapReduce的性能很低。因为MapReduce的每个阶段的输出结果都会先写入磁盘中,大量的磁盘IO会造成性能的急剧下降
MapReduce架构(过时,新版已经不是JobTracker和TaskTracker,取而代之的是YARN组件)
MapReduce包含四个组成部分,分别为Client、JobTracker、TaskTracker、Task
- Client客户端:每一个Job都会在用户端通过Client类将应用程序以及参数配置Configuration打包成Jar文件存储在HDFS,并把路径提交到JobTracker的master服务,然后由master创建每一个Task(即MapTask和ReduceTask),将它们分发到各个TaskTracker服务中执行
- JobTracker:JobTracker负责资源监控和作业调度。JobTracker监控所有的TaskTracker与job的健康状况,一旦发现失败,就将相应的任务转移到其它节点;同时JobTracker会跟踪任务的执行进度,资源使用量等信息,并将这些信息告诉任务调度器,而调度器会在资源出现空闲时,选择合适的任务使用这些资源。在Hadoop中,任务调度器是一个可插拔的模块,用于可以根据自己的需要设计相应的调度器。
- TaskTracker:TaskTracker会周期性地通过HeartBeat将本节点上资源的使用情况和任务的运行进度汇报给JobTracker,同时执行JobTracker发送过来的命令并执行相应的操作(如启动新任务,杀死任务等)。TaskTracker使用“slot”等量划分本节点上的资源量。“slot”代表计算资源(cpu,内存等)。一个Task获取到一个slot之后才有机会运行,而Hadoop调度器的作用就是将各个TaskTracker上的空闲slot分配给Task使用。slot分为MapSlot和ReduceSlot两种,分别提供MapTask和ReduceTask使用,TaskTracker通过slot数目(可配置参数)限定Task的并发度
- Task:Task分为MapTask和ReduceTask两种,均由TaskTracker启动。HDFS以固定大小的block为基本单位存储数据,而对于MapReduce而言,其处理单位是split。split是一个逻辑概念,它只包含一些元数据信息,比如数据起始位置、数据长度、数据所在节点等。它的划分方法完全由用户自己决定。但需要注意的是,split的多少决定了MapTask的数目,因为每一个split只会交给一个MapTask处理。split与block的关系如下图