当前位置: 首页 > news >正文

会python做网站自己怎样免费建设网站

会python做网站,自己怎样免费建设网站,深圳网站建设公司多吗,营销型网站设计方针转载#xff1a;http://blog.csdn.net/AE86_FC/archive/2010/08/26/5842020.aspx NameNode启动过程详细剖析 NameNode中几个关键的数据结构 FSImage Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中#xff0c;每次保存fsimage之后到下次保存之间的所有…转载http://blog.csdn.net/AE86_FC/archive/2010/08/26/5842020.aspx NameNode启动过程详细剖析 NameNode中几个关键的数据结构 FSImage Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中每次保存fsimage之后到下次保存之间的所有hdfs操作将会记录在editlog文件中当editlog达到一定的大小bytes由fs.checkpoint.size参数定义或从上次保存过后一定时间段过后sec由fs.checkpoint.period参数定义namenode会重新将内存中对整个HDFS的目录树和文件元数据刷到fsimage文件中。Namenode就是通过这种方式来保证HDFS中元数据信息的安全性。 Fsimage是一个二进制文件当中记录了HDFS中所有文件和目录的元数据信息在我的hadoop的HDFS版中该文件的中保存文件和目录的格式如下   当namenode重启加载fsimage时就是按照如下格式协议从文件流中加载元数据信息。从fsimag的存储格式可以看出fsimage保存有如下信息 1.         首先是一个image head其中包含 a)         imgVersion(int)当前image的版本信息 b)        namespaceID(int)用来确保别的HDFS instance中的datanode不会误连上当前NN。 c)         numFiles(long)整个文件系统中包含有多少文件和目录 d)        genStamp(long)生成该image时的时间戳信息。 2.         接下来便是对每个文件或目录的源数据信息如果是目录则包含以下信息 a)         path(String)该目录的路径如”/user/build/build-index” b)        replications(short)副本数目录虽然没有副本但这里记录的目录副本数也为3 c)         mtime(long)该目录的修改时间的时间戳信息 d)        atime(long)该目录的访问时间的时间戳信息 e)         blocksize(long)目录的blocksize都为0 f)         numBlocks(int)实际有多少个文件块目录的该值都为-1表示该item为目录 g)        nsQuota(long)namespace Quota值若没加Quota限制则为-1 h)        dsQuota(long)disk Quota值若没加限制则也为-1 i)          username(String)该目录的所属用户名 j)          group(String)该目录的所属组 k)        permission(short)该目录的permission信息如644等有一个short来记录。 3.         若从fsimage中读到的item是一个文件则还会额外包含如下信息 a)         blockid(long)属于该文件的block的blockid b)        numBytes(long)该block的大小 c)         genStamp(long)该block的时间戳 当该文件对应的numBlocks数不为1而是大于1时表示该文件对应有多个block信息此时紧接在该fsimage之后的就会有多个blockidnumBytes和genStamp信息。 因此在namenode启动时就需要对fsimage按照如下格式进行顺序的加载以将fsimage中记录的HDFS元数据信息加载到内存中。 BlockMap 从以上fsimage中加载如namenode内存中的信息中可以很明显的看出在fsimage中并没有记录每一个block对应到哪几个datanodes的对应表信息而只是存储了所有的关于namespace的相关信息。而真正每个block对应到datanodes列表的信息在hadoop中并没有进行持久化存储而是在所有datanode启动时每个datanode对本地磁盘进行扫描将本datanode上保存的block信息汇报给namenodenamenode在接收到每个datanode的块信息汇报后将接收到的块信息以及其所在的datanode信息等保存在内存中。HDFS就是通过这种块信息汇报的方式来完成 block - datanodes list的对应表构建。Datanode向namenode汇报块信息的过程叫做blockReport而namenode将block - datanodes list的对应表信息保存在一个叫BlocksMap的数据结构中。 BlocksMap的内部数据结构如下      如上图显示BlocksMap实际上就是一个Block对象对BlockInfo对象的一个Map表其中Block对象中只记录了blockidblock大小以及时间戳信息这些信息在fsimage中都有记录。而BlockInfo是从Block对象继承而来因此除了Block对象中保存的信息外还包括代表该block所属的HDFS文件的INodeFile对象引用以及该block所属datanodes列表的信息即上图中的DN1DN2DN3该数据结构会在下文详述。 因此在namenode启动并加载fsimage完成之后实际上BlocksMap中的key也就是Block对象都已经加载到BlocksMap中每个key对应的value(BlockInfo)中除了表示其所属的datanodes列表的数组为空外其他信息也都已经成功加载。所以可以说fsimage加载完毕后BlocksMap中仅缺少每个块对应到其所属的datanodes list的对应关系信息。所缺这些信息就是通过上文提到的从各datanode接收blockReport来构建。当所有的datanode汇报给namenode的blockReport处理完毕后BlocksMap整个结构也就构建完成。 BlockMap中datanode列表数据结构 在BlockInfo中将该block所属的datanodes列表保存在一个Object[]数组中但该数组不仅仅保存了datanodes列表还包含了额外的信息。实际上该数组保存了如下信息   上图表示一个block包含有三个副本分别放置在DN1DN2和DN3三个datanode上每个datanode对应一个三元组该三元组中的第二个元素即上图中prev block所指的是该block在该datanode上的前一个BlockInfo引用。第三个元素也就是上图中next Block所指的是该block在该datanode上的下一个BlockInfo引用。每个block有多少个副本其对应的BlockInfo对象中就会有多少个这种三元组。        Namenode采用这种结构来保存block-datanode list的目的在于节约namenode内存。由于namenode将block-datanodes的对应关系保存在了内存当中随着HDFS中文件数的增加block数也会相应的增加namenode为了保存block-datanodes的信息已经耗费了相当多的内存如果还像这种方式一样的保存datanode-block list的对应表势必耗费更多的内存而且在实际应用中要查一个datanode上保存的block list的应用实际上非常的少大部分情况下是要根据block来查datanode列表所以namenode中通过上图的方式来保存block-datanode list的对应关系当需要查询datanode-block list的对应关系时只需要沿着该数据结构中next Block的指向关系就能得出结果而又无需保存datanode-block list在内存中。 NameNode启动过程 fsimage加载过程 Fsimage加载过程完成的操作主要是为了 1.         从fsimage中读取该HDFS中保存的每一个目录和每一个文件 2.         初始化每个目录和文件的元数据信息 3.         根据目录和文件的路径构造出整个namespace在内存中的镜像 4.         如果是文件则读取出该文件包含的所有blockid并插入到BlocksMap中。 整个加载流程如下图所示   如上图所示namenode在加载fsimage过程其实非常简单就是从fsimage中不停的顺序读取文件和目录的元数据信息并在内存中构建整个namespace同时将每个文件对应的blockid保存入BlocksMap中此时BlocksMap中每个block对应的datanodes列表暂时为空。当fsimage加载完毕后整个HDFS的目录结构在内存中就已经初始化完毕所缺的就是每个文件对应的block对应的datanode列表信息。这些信息需要从datanode的blockReport中获取所以加载fsimage完毕后namenode进程进入rpc等待状态等待所有的datanodes发送blockReports。 blockReport阶段 每个datanode在启动时都会扫描其机器上对应保存hdfs block的目录下(dfs.data.dir)所保存的所有文件块然后通过namenode的rpc调用将这些block信息以一个long数组的方式发送给namenodenamenode在接收到一个datanode的blockReport rpc调用后从rpc中解析出block数组并将这些接收到的blocks插入到BlocksMap表中由于此时BlocksMap缺少的仅仅是每个block对应的datanode信息而namenoe能从report中获知当前report上来的是哪个datanode的块信息所以blockReport过程实际上就是namenode在接收到块信息汇报后填充BlocksMap中每个block对应的datanodes列表的三元组信息的过程。其流程如下图所示:   当所有的datanode汇报完blocknamenode针对每个datanode的汇报进行过处理后namenode的启动过程到此结束。此时BlocksMap中block-datanodes的对应关系已经初始化完毕。如果此时已经达到安全模式的推出阈值则hdfs主动退出安全模式开始提供服务。 启动过程数据采集和瓶颈分析 对namenode的整个启动过程有了详细了解之后就可以对其启动过程中各阶段各函数的调用耗时进行profiling的采集数据的profiling仍然分为两个阶段即fsimage加载阶段和blockReport阶段。 fsimage加载阶段性能数据采集和瓶颈分析 以下是对建库集群真实的fsimage加载过程的的性能采集数据   从上图可以看出fsimage的加载过程那个中主要耗时的操作分别分布在FSDirectory.addToParentFSImage.readString以及PermissionStatus.read三个操作这三个操作分别占用了加载过程的73%15%以及8%加起来总共消耗了整个加载过程的96%。而其中FSImage.readString和PermissionStatus.read操作都是从fsimage的文件流中读取数据分别是读取String和short的操作这种操作优化的空间不大但是通过调整该文件流的Buffer大小来提高少许性能。而FSDirectory.addToParent的调用却占用了整个加载过程的73%所以该调用中的优化空间比较大。        以下是addToParent调用中的profiling数据   从以上数据可以看出addToParent调用占用的73%的耗时中有66%都耗在了INode.getPathComponents调用上而这66%分别有36%消耗在INode.getPathNames调用30%消耗在INode.getPathComponents调用。这两个耗时操作的具体分布如以下数据所示   可以看出消耗了36%的处理时间的INode.getPathNames操作全部都是在通过String.split函数调用来对文件或目录路径进行切分。另外消耗了30%左右的处理时间在INode.getPathComponents中该函数中最终耗时都耗在获取字符串的byte数组的java原生操作中。 blockReport阶段性能数据采集和瓶颈分析 由于blockReport的调用是通过datanode调用namenode的rpc调用所以在namenode进入到等待blockreport阶段后会分别开启rpc调用的监听线程和rpc调用的处理线程。其中rpc处理和rpc鉴定的调用耗时分布如下图所示   而其中rpc的监听线程的优化是另外一个话题在其他的issue中再详细讨论且由于blockReport的操作实际上是触发的rpc处理线程所以这里只关心rpc处理线程的性能数据。        在namenode处理blockReport过程中的调用耗时性能数据如下   可以看出在namenode启动阶段处理从各个datanode汇报上来的blockReport耗费了整个rpc处理过程中的绝大部分时间(48/49)blockReport处理逻辑中的耗时分布如下图   从上图数据中可以发现blockReport阶段中耗时分布主要耗时在FSNamesystem.addStoredBlock调用以及DatanodeDescriptor.reportDiff过程中分别耗时37/48和10/48其中FSNamesystem.addStoredBlock所进行的操作时对每一个汇报上来的block将其于汇报上来的datanode的对应关系初始化到namenode内存中的BlocksMap表中。所以对于每一个block就会调用一次该方法。所以可以看到该方法在整个过程中调用了774819次而另一个耗时的操作即DatanodeDescriptor.reportDiff该操作的过程在上文中有详细介绍主要是为了将该datanode汇报上来的blocks跟namenode内存中的BlocksMap中进行对比以决定那个哪些是需要添加到BlocksMap中的block哪些是需要添加到toRemove队列中的block以及哪些是添加到toValidate队列中的block。由于这个操作需要针对每一个汇报上来的block去查询BlocksMap以及namenode中的其他几个map所以该过程也非常的耗时。而且从调用次数上可以看出reportDiff调用在启动过程中仅调用了14次(有14个datanode进行块汇报)却耗费了10/48的时间。所以reportDiff也是整个blockReport过程中非常耗时的瓶颈所在。        同时可以看到出了reportDiffaddStoredBlock的调用耗费了37%的时间也就是耗费了整个blockReport时间的37/48该方法的调用目的是为了将从datanode汇报上来的每一个block插入到BlocksMap中的操作。从该方法调用的运行数据如下图所示   从上图可以看出addStoredBlock中主要耗时的两个阶段分别是FSNamesystem.countNode和DatanodeDescriptor.addBlock后者是java中的插表操作而FSNamesystem.countNode调用的目的是为了统计在BlocksMap中每一个block对应的各副本中有几个是live状态几个是decommission状态几个是Corrupt状态。而在namenode的启动初始化阶段用来保存corrput状态和decommission状态的block的map都还是空状态并且程序逻辑中要得到的仅仅是出于live状态的block数所以这里的countNoes调用在namenode启动初始化阶段并无需统计每个block对应的副本中的corrrput数和decommission数而仅仅需要统计live状态的block副本数即可这样countNodes能够在namenode启动阶段变得更轻量以节省启动时间。 2.3 瓶颈分析总结 从profiling数据和瓶颈分歧情况来看fsimage加载阶段的瓶颈除了在分切路径的过程中不够优以外其他耗时的地方几乎都是在java原生接口的调用中如从字节流读数据以及从String对象中获取byte[]数组的操作。        而blockReport阶段的耗时其实很大的原因是跟当前的namenode设计以及内存结构有关比较明显的不优之处就是在namenode启动阶段的countNode和reportDiff的必要性这两处在namenode初始化时的blockReport阶段有一些不必要的操作浪费了时间。可以针对namenode启动阶段将必要的操作抽取出来定制成namenode启动阶段才调用的方式以优化namenode启动性能。转载于:https://www.cnblogs.com/qianxun/archive/2011/04/26/2029494.html
http://www.pierceye.com/news/367393/

相关文章:

  • 怎样在网站做友情链接网页什么设计
  • 做seo网站营销推广南宁建设职业技术学院招聘信息网站
  • 网站建设全网推广小程序手机网站怎么优化
  • wordpress 网站logowin系统没有wordpress
  • 玉山电商网站建设东莞市建设规划局网站
  • 网站建设运营公司企业特色c2c的代表性的电商平台
  • 上海网站建设,分类广告软件公司简介
  • 网站虚拟主机被国家禁止访问的网站怎么打开
  • wordpress手机加载不出来优化官网咨询
  • 平台网站建设预算表如何来做网站
  • 温州网站制作企业东莞网络推广公司电话
  • 网站建设的条件重庆那些网站
  • 伊犁网站制作大连甘井子区房价
  • 循环视频做网站背景win2012r2 建设网站
  • 建设网站制作汉狮团队义乌北苑编程网站开发公司
  • 网站开发公司会计处理滨州市住房和城乡建设局网站
  • 企业网站站内优化长尾关键词挖掘站长工具
  • 山东平台网站建设企业怎么做自己的品牌网站
  • 长沙seo网站排名杭州网站建设q479185700棒
  • 泰州网站建设搭建工程造价网
  • 网站流程优化c2c模式举例子
  • 帝国网站调用图片集网店平台有哪些
  • 做flash音乐网站的开题报告删除wordpress左上角
  • php网站开发学什么衡水大型网站建设
  • 广州网站开发软件平台wordpress 问号
  • 西安市建设干部学校网站厦门网站优化服务
  • 深圳市南山区住房和建设局官方网站如何把html网站改为asp网站
  • 网站建设有什么技术做dw网站图片怎么下载地址
  • 初中生如何做网站潍坊网站开发
  • 如何修改用织梦做的网站的模板价格对比网站开发