Hadoop 学习

关于Hadoop

Hadoop崩溃集群重启

先停掉进程,sbin/stop-yarn.sh sbin/stop-dfs.sh。然后删除每个集群上datanode的信息。默认在/tmp。如果配置了该目录,就去指定目录删除。data目录和log目录,最后执行格式化namenode format,再重启Hadoop。sbin/start-yarn.sh sbin/start-dfs.sh。打扫干净屋子再请客。
常见问题:

  1. namenode和datanode启动失败,版本不一致。出错原因:namenode有个版本号,datenode也有版本号。存在于name/current/目录和data/current目录,cat version可以查看版本号。
  2. jps发现进程已经没有,但是重新启动集群,提示进程已经开启。出错原因:Linux根目录下/tmp存在启动的进程临时文件,将集群相关进程文件删掉,再重新启动。
  3. 配置hdfs网页登录使用的静态用户为hadoop,否则在页面没有操作hdfs目录权限。
    hadoop.http.staticuser.user hadoop
  4. 常用端口号namenode内部通信端口:8020/9000/9820,namenodeHttp ui 9870,mapreduce查看执行任务端口8088,历史服务器通信端口:19888

hdfs优缺点

优点:高容错性,数据自动保存多个副本,通过增加副本的形式,提高容错性;适合处理大数据,能够处理GB,TB甚至PB的数据,能够处理百万规模以上的文件数量;可构建在廉价机器上,通过多副本机制,提高可靠性。
缺点:不适合低延时数据,比如毫秒级的访问做不到。无法高效地对大量小文件进行存储。

mapreduce原理

概括:输入结果集--》map--》中间数据集--》reduce--》输出结果集。
CPU密集型型计算:读取文件和写入文件花费时间小,主要时间用在数据计算上。
I/O密集型计算:读取文件和写入文件花费时间大,CPU计算时间花费小。
hdfs文件是分块存储的,同样mapreduce在计算时也会对文件进行切片,根据io密集或者CPU密集计算,切分合适的切片大小。
map并行度是由切片数量决定的,一个切片对应一个并行度。
reduce并行度由人来决定。
MR:数据以一条记录为单位,经过map方法映射成kv,相同的key为一组,这一组数据调用一次reduce方法,在方法内迭代计算这一组数据。
迭代器模式:
数据集一般是用迭代计算的方式。

map task和reduce task

切片会格式化记录,以记录为单位调用map方法。
map的输出映射成k,v,kv会参与分区计算,拿着key算出P分区号,k,v,p。分区号是按照key取模
map task的输出是一个文件,存在本地的文件系统中。
内存缓冲区溢写磁盘时,做一个2次排序:分区有序,且分区内key有序。未来相同的一组key会相邻地排在一起。
reduce的归并排序其实可以和reduce方法的计算同时发生,尽量减少IO,因为有迭代器模式的支持。
迭代器模式是批量计算中非常优美的实现形式。

hdfs

概述:
  namenode:存储文件的元数据,如文件名、文件目录结构,文件属性(生成时间,副本数,文件权限),以及每个文件的块列表和块所在的datanode等。
            是master管理者,管理hdfs名称空间,配置副本策略,管理数据块映射信息,处理客户端读写请求。
  datanode:在本地文件系统存储文件块数据,以及块数据的校验和。
            是slave,执行namenode下达的操作命令。存储实际的数据块,执行数据块的读写操作。
  secondarynamenode:每隔一段时间,对namenode元数据备份。
            并非namenode的热备,当namenode挂掉并不能马上替换namenode。辅助namenode,分担其工作量,比如定期合并fsimage镜像文件和edits配置文件,并推送给namenode。紧急情况下可辅助恢复namenode,只能恢复一部分数据。
  client:客户端。
          进行文件切分,文件上传hdfs的时候,client将文件切分成一个个的block,然后进行上传。
          与namenode交互,获取文件的位置信息。
          与DataNode交互,读取或者写入数据。
          client提供一些命令来管理hdfs,比如namenode格式化。
          client可以通过一些命令来访问hdfs,比如对hdfs进行增删改查操作。
HDFS定义:
  HDFS是分布式文件管理系统中的一种。
  通过目录树来定位文件 /data/bigdata/origin_data/...
  适合一次写入,多次读出的场景。
优缺点:
  高容错性:数据自动保存多个副本,通过增加副本的形势,提高容错性。某一个副本丢失后,可以自动恢复副本数据。
  适合处理大数据:规模达到GB、TB、甚至PB级别。能够处理百万规模以上的文件数量。
  可以构建在廉价机器上:通过多副本机制,提高可靠性。
  不适合低延迟数据访问,毫秒级做不到。
  无法高效地对大量小文件进行存储:
    因为namenode默认大小128G,存储大量小文件,会占用namenode大量的内存来存储文件目录和块信息,不可取,因为namenode内存有限。1个文件块占用namenode的150字节内存。
    小文件寻址时间会超过读取时间,违反了hdfs的设计目标。
  不支持并发写入、文件随机修改:
    一个文件只能有一个线程写,不允许多线程同时写入。hdfs不能并发写指的是同位置同名文件只能有一个writer,否则会使得所有的上传请求失败。不同位置或者不同名的文件可以同时上传。
    仅支持数据append追加,不支持文件的随机修改。
hdfs文件大小:
    hdfs的文件在物理上是分块存储(block),块的大小可以通过配置参数dfs.blocksize来规定,默认大小在hadoop2.x/3.x是128M,1.x版本是64M。
    寻址时间即为查找到block的时间。
    寻址时间为传输时间的1%时,则为最佳状态。如果寻址时间为10ms,则传输时间为10/0.01=1000ms。普通机械硬盘的传输速率为100MB/s,因此每个文件块大小设置为128M比较合理。
为什么hdfs文件块设置不能太大也不能太小?
    hdfs的块设置太小,会增加寻址时间,程序一直在找块的开始位置。
    hdfs的块设置太大,会增加传输时间,从磁盘传输数据的时间会明显大于定位这个块的开始位置所需的时间,导致程序在处理这块数据时非常慢。
hdfs写入流程?
    1. hdfs的client创建一个客户端,客户端有很多种,这里创建的是分布式文件系统的客户端,distributed file system,向namenode请求上传文件。
    2. namenode检查目录树是否有权限创建目录,检查目录结构以及文件是否已经存在。检查无误后,响应可以上传文件。
    3. 客户端请求上传第一个块文件(0-128M),由namenode检查上传到哪个DataNode。选择策略是优先选择本地节点,然后是其他机架的节点。
    4. 客户端创建文件流,建立block传输通道,写入到第一个DataNode节点,然后由DataNode节点之间互相传输。防止客户端对接多个DataNode,影响传输效率。
    5. 传输的过程中会形成一个缓冲队列chunk,大小为512字节+4字节的校验位。攒够64KB的时候形成packet,发送到下一个DataNode节点。
    6. 收到DataNode写入成功的响应,清除缓冲队列的数据。写入缓冲队列的同时还会写入ack队列,目的是备份数据,防止写入失败,以便恢复数据。
hdfs读数据流程?
    1. hdfs的client创建一个客户端,分布式文件系统的客户端,向namenode请求下载文件。
    2. namenode检查是否有权限读取,无误后返回目标文件的元数据信息。
    3. 客户端创建一个文件流用来读取DataNode上的目标文件,读取原则是选择最近的节点。节点距离分为同一机架的同一个服务器节点(最近),同一机架的不同服务器节点(中间),不同机架的服务器节点(最远)。
    4. 选择DataNode节点除了距离也要考虑负载的因素,如果最近节点上负载过多,则选择临近节点。
namenode与secondarynamenode工作机制:
    首先科普下namenode存储规则,存在磁盘上可靠性高,计算慢。存在内存中计算快,可靠性低。采用内存+磁盘的存储方式,内存中存放的是fsimage和edits文件。fsimage存储数据a=10,edits存储客户端进行的操作a+10,合并后a变成a+10=20。因为不支持随机修改,只支持追加,所以把操作请求记录到edits文件,然后合并镜像和编辑文件,最终得到计算结果。关机的时候namenode会合并最新的edits文件和fsimage文件。为了防止edits文件过大,secondarynamenode会辅助完成这个工作,但是只会完成历史的文件,namenode与2nn存储的差别在于inProgross的edits文件。一般设置的检查点时间为一小时,或者edits文件追加满了就会执行合并。合并完成后将最新的镜像文件回传给namenode。2nn合并的是历史edits,最新的edits存在namenode中,namenode在空闲时将最新的镜像文件和最新的edits编辑文件合并,将最终结果覆盖到镜像文件中。
    1. 第一次启动namenode格式化后,创建fsimage和edits文件,如果不是第一次启动,直接加载镜像文件和编辑日志到内存中。
    2. 客户端对元数据进行增删改查的请求,记录到edits文件中,加载到内存中,更新内存数据。
    3. 2nn请求nn是否需要检查点checkoutpoint。检查点触发条件:定时时间到期(默认一小时),edits文件数据满了。
    4. 触发检查点后,请求执行checkoutpoint。然后nn生成一个历史edits文件,同时将fsimage和历史edits文件一起拷贝给2nn。
    5. 2nn合并到内存,根据edits中的操作对数据进行更新,并生成新的fsimage文件,回传给nn。覆盖nn的fsimage;
    6. 下次启动时nn加载最新的fsimage和edits文件到内存中,更新文件数据内容。
fsimage文件和edits文件:
    fsimage文件是hdfs文件系统元数据的一个永久性检查点,其中包含hdfs文件系统的所有目录和文件iNode的序列化信息。
    edits文件是存放hdfs所有更新操作的路径,
    seen_txid文件保存的是一个数字,就是最后一个edits_的数字。
    每次namenode启动的时候都会将fsimage文件读入内存,加载edits里面的更新操作,保证内存中的元数据信息是最新的,同步的,可以看成namenode启动的时候就将fsimage和edits文件进行了合并。
    hdfs oiv -p 文件类型 -i镜像文件 -o转换后文件输出路径:  hdfs oiv -p XML -i fsimage_0000000023 -o /opt/module/hadoop3.1.3/fsimage.xml
    hdfs oev -p 文件类型 -i编辑日志 -o转换后文件输出路径:  hdfs oev -p XML -i edits_000000000023 -o /opt/module/hadoop3.1.3/edits.xml
checkoutpoint时间设置:
    dfs.namenode.checkpoint.period--》3600s 时间周期一小时
    dfs.namenode.checkpoint.txns-->1000000 操作动作次数一百万次
    dfs.namenode.checkpoint.check.period--》60s 每60s检查操作次数是否到达一百万次
datanode工作机制:
    1.datanode启动后向namenode注册。将数据信息记录在namenode元数据中,返回注册成功响应。
    2. 以后每周期(默认6小时)上报所有块信息。
    3. 心跳每3秒一次,返回namenode的命令给DataNode。
    4. 超过10分钟+30秒没有收到datanode心跳,则认为该节点不可用。将不再向该节点的DataNode上写入信息。
hdfs校验数据完整性的方式是crc文件。
面试重点:
    1. hdfs文件块大小跟什么有关?
        硬盘读写速度,在企业中,一般中小公司为128M,大公司为256M。
    2. hdfs的shell操作
    3. hdfs的读写流程。

yarn

概述:
  resourcemanager:整个集群资源(内存、CPU等)的老大
  nodemanager:单个节点服务器的老大
  applicationmaster:单个任务的老大
  container:容器,相当于一台独立的服务器,里面封装了任务运行所需要的资源。
  说明:客户端可以有多个,集群上可以有多个applicationmaster,每个nodemanager可以有多个container。

MapReduce

概述:
  MapReduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架。计算过程分为两个阶段:map和reduce
  map阶段并行处理输入数据。
  reduce阶段对map结果进行汇总。
  MapReduce处理流程:
    

posted on 2023-03-26 17:09  张少凯  阅读(35)  评论(0编辑  收藏  举报

导航