1.hdfs写数据流程
1.客户端向namenode请求上传文件,namenode检测该文件是否已存在,父目录是否存在,然后返回是否可以上传。
2.客户端请求上传第一个block,namenode返回三个节点(dn1,dn2,dn3)。
3.客户端向dn1请求上传数据,dn1收到请求后会调用dn2,dn2调用dn3,建立传输通道,dn1、dn2、dn3逐级应答。
4.客户端开始往dn1上传第一个block(先从磁盘读取放到一个本地内存缓存),以packet为单位。dn1收到一个block就会传给dn2,dn2传给dn3。dn1每传完一个packet会被放入一个应答队列等待应答。
5.当一个block传输完成之后,客户端再次向namenode请求上传第二、第三个block,重复上面的步骤(2-4步),直至文件上传完成。
2.hdfs读数据流程
1 客户端通过向namenode请求下载文件 ,namenode 收到请求之后查询元数据信息,找到datanode数据块的信息。
2 客户端挑选一台就近的datanode,进行请求数据。
3 datanode开始传输数据给客户端,是以packet 为单位进行读取。
4 客户端 接收packet 数据,先在本地缓存,最后写入到目标文件。
3.datanode和namenode工作机制
NameNode工作机制
1.第一次启动:第一次启动都需要格式化nameNode ,创建fsimage,edits. 第一次启动只需要加载fsiamge。
2.如果不是第一次启动: 直接加载edits ,fsimage镜像文件 ,合并成一个新的fsimage 文件,再创建edits 文件记录新的操作行为。
启动的过程中,会存在30秒钟等待时间 ,这个等待的时间就是安全模式。
DataNode工作机制
1.一个数据块在datanode上是以文件形式存储在磁盘上的,包括了两个文件,一个数据本身,一个是元数据包 包括数据块的长度,,数据块的校验和,由于HDFS上的数据是不允许被重复上传的所以在上传之前会对上传的数据进行检查 ,时间戳。
2.DataNode启动后会向nameNode进行注册,通过后,会周期性的向namenode上报自己的datanode上的块信息。
3.心跳报告,每3秒钟向nameNode进行汇报,心跳的返回结果中带有NameNode 带给该datanode复制数据块,移动数据块的命令, 如果说超过了10分钟datanode没有响应 ,则就会认为这个datanode节点不可用,会选择其他的机器。
3.如果NameNode意外终止,secondaryNameNode的工作是什么?它是如何工作的?
secondaryNameNode
1.并非NameNode的热备;
2.辅助NameNode,分担其工作量;
3.定期合并fsimage和edits,推送给NameNode;
4.在紧急情况下,可辅助恢复NameNode。
4.HDFS安全模式
在系统的正常操作期间,namenode会在内存中保留所有块位置的映射信息。在安全模式下,各个datanode会向namenode发送最新的块列表信息,namenode了解到足够多的块位置信息之后,即可高效运行文件系统。
如果满足“最小副本条件”,namenode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1)。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以namenode不会进入安全模式。
5.zookeeper的一些概念会议
1.没有数据
通过myid给自己投票,根据myid的大小决定票数(比如myid为1,就给自己投1票),谁的票数多,谁就是leader,其余的为follower。半数以上的节点运行成功之后,才提供服务。
2.有数据
根据xid数据的更新版本号为标准,xid最大的为leader(因为follower要同步leader上的数据,所以要确保leader的数据为最新版本),如果xid一样则判断myid的票数。
所谓HA(high available),即高可用(7*24小时不中断服务)。实现高可用最关键的策略是消除单点故障。
Active standby 解决了namenode 单点故障。
存在的服务 : zookeeper(解决一致性问题) ; journalnode(解决edits同步问题); zkfc(解决切换问题,负责监测)。
同步: 元数据(edits ,fsimage ), journalnode 节点,同步edits 编辑日志 。集群中安全性得到了保证,但是一致性却减弱了,为了解决一致性的问题,必须存在zookeeper 。
切换机制: 首先要监控到 namenode 挂了,才能进行切换。如何知道挂掉了: 通过ZKFC RPC 调用监控namenode ,一旦namenode挂掉了,zookeeper 就会通知另外一个namenode 的zkfc 进程启动 standby切换为active,在切换之前会先杀掉之前的active(通过执行一个ssh远程调用)。
6.hive调优方式
1.Fetch抓取:把不需要MR任务计算的查询语句设置成不执行MR任务。三个参数,none表示禁用Fetch,所有查询都执行MR任务;more在进行select/filter/limit查询时不会运行MR任务;minimal在select/limit的时候不会运行MR任务,但是filter会运行MR任务。
hive.fetch.task.conversion
2.本地模式:让输入的数据量特别小的任务直接在本地节点上进行处理,而不提交到集群。本地模式通过判断文件的大小(默认128MB)和已输入文件的个数(默认4个)来判断是否在本地执行。
set hive.exec.mode.local.auto=true; //开启本地 mr
set hive.exec.mode.local.auto.inputbytes.max=50000000;
set hive.exec.mode.local.auto.input.files.max=10;
3.表的优化:优化手段有join、行列过滤、分区、分桶、动态分区等等。
4.避免数据倾斜:通过合理设置map和reduce数、小文件合并等方式尽量保证负载均衡。或为了避免因为map或reduce任务卡死导致数据倾斜,通常也设置推测执行。
5.推测执行:为了避免因为程序的BUG/负载不均衡/资源分布不均等原因导致同一作业中某一任务运行速度过慢,设置推测执行,为该任务启动一个备份任务,同时执行,最先运行完成的计算结果作为最终结果。分为map端和reduce端的推测执行。
set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true
6.并行执行:把没有依赖关系的MR任务设置为并行执行,提高多任务运行时的效率。
set hive.exec.parallel=true ; // 开启任务并行执行
set hive.exec.parallel.thread.number=8; //默认值为8个任务可以同时运行
7.严格模式:为了防止一些不正常的查询语句的执行。
hive.mapred.mode= strict
8.JVM重用:当有很多小文件的时候,每次运行MR任务都会开启一个JVM进程,JVM频繁的开启关闭消耗大量的性能,所以在处理小文件的时候,可以设置JVM重用,让一个JVM处理多个任务后再关闭。
mapreduce.job.jvm.numtasks
9.压缩:通过压缩对项目进行优化。例如开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量。
10.执行计划:Hive中提供的可以查看Hql语句的执行计划,在执行计划中会生成抽象语法树,在语法树中会显示HQL语句之间的依赖关系以及执行过程。通过这些执行的过程和依赖可以对HQL语句进行优化。