﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-Technologies Kingdom</title><link>http://www.cnblogs.com/OnlyXP/</link><description>无境界</description><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2009 11:42:58 GMT</lastBuildDate><pubDate>Mon, 06 Jul 2009 11:42:58 GMT</pubDate><ttl>60</ttl><item><title>Hadoop相关网络资源汇总</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/06/14/1503175.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Sun, 14 Jun 2009 12:12:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/06/14/1503175.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1503175.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/06/14/1503175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1503175.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1503175.html</trackback:ping><description><![CDATA[<span  style="font-family: arial; font-size: 13px; line-height: normal; ">
<div><span style="font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; "><span style="font-size: large; "><span  style="font-weight: normal;">(NOTE: 之前研究过的一些hadoop相关资料，在这里汇总起来，方便他人学习)</span><br />
<br />
第一手资源</span></span></div>
<div><span style="font-weight: bold; ">hadoop官方网站</span><br />
</div>
<div><span style="font-weight: bold; "><a href="http://hadoop.apache.org/" rel="nofollow" style="color: #551a8b; ">hadoop.apache.org</a></span></div>
<div><span style="font-weight: bold; "><br />
</span></div>
<div><span style="font-weight: bold; ">最权威的官方资源之一<br />
</span></div>
<div><span style="font-weight: bold; "><a href="http://developer.yahoo.com/hadoop/" rel="nofollow" style="color: #551a8b; ">dev.yahoo.hadoop</a></span></div>
<div><span style="color: #551a8b; text-decoration: underline; "><br />
</span></div>
</div>
</span></span></div>
<div><span style="font-weight: bold; ">hadoop.cn(偶尔有一些有用信息)<br />
</span></div>
<div><span style="font-weight: bold; "><a href="http://www.hadoop.org.cn/" rel="nofollow" style="color: #551a8b; ">www.hadoop.org.cn</a>&#160;</span></div>
<div><br />
</div>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><a href="http://www.hadoopchina.com/index.php?option=com_frontpage&amp;Itemid=1&amp;limitstart=11" rel="nofollow" style="color: #0000cc; "><span style="text-decoration: none; ">hadoopchina</a></div>
</span></div>
</span></div>
<div><br />
</div>
<div><span style="font-weight: bold; "><span style="font-size: large; ">手册</span></span></div>
<div><span style="font-weight: bold; "><span style="font-weight: normal; ">
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><br />
</div>
<div><span style="font-weight: bold; ">hdfs命令行指南<span style="text-decoration: underline; ">
<div style="display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; ">
<div style="display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; ">
<div style="display: inline !important; "><a href="http://hadoop.apache.org/core/docs/current/commands_manual.html#fsck" rel="nofollow" style="color: #0000cc; "></a></div>
</div>
</div>
</div>
</div>
</span></div>
</span></div>
</span></span></div>
<div><span style="text-decoration: underline; ">
<div style="display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; ">
<div style="display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; display: inline !important; ">
<div style="display: inline !important; "><a href="http://hadoop.apache.org/core/docs/current/commands_manual.html#fsck" rel="nofollow" style="color: #0000cc; ">http://hadoop.apache.org/core/docs/current/commands_manual.html#fsck</a></div>
</div>
</div>
</span></div>
</div>
</span></div>
</span></div>
</span></span></div>
</div>
</span></div>
</span></div>
</div>
</span></div>
</span></div>
</span></span></span></span></div>
<div>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">官方文档</div>
<div style="text-decoration: underline; "><a href="http://hadoop.apache.org/core/docs/r0.20.0/cn/" rel="nofollow" style="color: #551a8b; ">http://hadoop.apache.org/core/docs/r0.20.0/cn/</a></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div style="text-decoration: underline; "><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; "><span style="font-size: large; ">相关Blog</span></div>
<div>
<div><span style="font-weight: bold; ">facebook工程师blog</span></div>
<div><span style="font-weight: bold; "><a href="http://www.facebook.com/note.php?note_id=76191543919&amp;ref=mf" rel="nofollow" style="color: #551a8b; "><span style="text-decoration: none; ">http://www.facebook.com/note.php?note_id=76191543919&amp;ref=mf</span></a><br style="text-decoration: underline; " />
</span></div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-weight: bold; ">hadoop一个核心开发者的blog</span></div>
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://www.lexemetech.com/2007/09/java-servlet-for-thrift.html" rel="nofollow" style="color: #0000cc; ">http://www.lexemetech.com/2007/09/java-servlet-for-thrift.html</a></div>
</span></div>
</span></div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">hadoop0.19特性归纳</div>
<div style="text-decoration: underline; "><a href="http://solomons.javaeye.com/blog/277784" rel="nofollow" style="color: #551a8b; ">http://solomons.javaeye.com/blog/277784</a></div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">这个家伙很有意思,并且是研究hadoop的</div>
<a href="http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html" rel="nofollow" style="color: #551a8b; ">http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html</a><br style="text-decoration: underline; " />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://blog.csdn.net/ww_great/archive/2008/11/14/3296724.aspx" rel="nofollow" style="color: #551a8b; ">http://blog.csdn.net/ww_great/archive/2008/11/14/3296724.aspx</a></div>
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><br />
</div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; ">hadoop源码分析</span></div>
<div style="text-decoration: underline; "><a href="http://blog.csdn.net/xymyeah/archive/2008/08/20/2802572.aspx" rel="nofollow" style="color: #0000cc; ">http://blog.csdn.net/xymyeah/archive/2008/08/20/2802572.aspx</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">hadoop源码分析比较好的一篇文章</span></div>
<div style="text-decoration: underline; "><a href="http://caibinbupt.javaeye.com/?show_full=true" rel="nofollow" style="color: #0000cc; ">http://caibinbupt.javaeye.com/?show_full=true</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">源码分析，给了张package功能分析表</span></div>
<div style="text-decoration: underline; "><a href="http://caibinbupt.javaeye.com/blog/270378" rel="nofollow" style="color: #0000cc; ">http://caibinbupt.javaeye.com/blog/270378</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<span style="text-decoration: underline; "><a href="http://www.cnblogs.com/bjzhanghao/archive/2008/11/12/1325113.html" rel="nofollow" style="color: #0000cc; ">http://www.cnblogs.com/bjzhanghao/archive/2008/11/12/1325113.html</a>&#160;</span><span style="text-decoration: underline; ">&#160;</span>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">hadoop架构设计和要点</div>
<div style="text-decoration: underline; "><a href="http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html" rel="nofollow" style="color: #551a8b; ">http://www.blogjava.net/killme2008/archive/2008/06/05/206043.html</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">讲述cascading</span></div>
</span><a href="http://www.javaeye.com/news/3507-cascading-a-simple-application-of-hadoop-mapreduce" rel="nofollow" style="color: #0000cc; ">http://www.javaeye.com/news/3507-cascading-a-simple-application-of-hadoop-mapreduce</a></div>
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><br />
</div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://blog.rapleaf.com/dev/?p=33" rel="nofollow" style="color: #0000cc; ">http://blog.rapleaf.com/dev/?p=33</a></div>
<div style="text-decoration: underline; font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><br />
</div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; ">淘宝数据仓库团队</div>
<div style="text-decoration: underline; "><a href="http://rdc.taobao.com/blog/dw/archives/category/dw%E6%9E%B6%E6%9E%84" rel="nofollow" style="color: #0000cc; ">http://rdc.taobao.com/blog/dw/archives/category/dw架构</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<a href="http://hi.baidu.com/shirdrn/blog/category/Hadoop" rel="nofollow" style="color: #0000cc; ">http://hi.baidu.com/shirdrn/blog/category/Hadoop</a><span style="text-decoration: underline; ">&#160;</span></span><span style="text-decoration: underline; ">&#160;</span>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">hadoop初记，部分代码剖析</span></div>
<div style="text-decoration: underline; "><a href="http://blog.csdn.net/kauu/archive/2006/12/10/1437207.aspx" rel="nofollow" style="color: #0000cc; ">http://blog.csdn.net/kauu/archive/2006/12/10/1437207.aspx</a></div>
</div>
</span></div>
</span></div>
</span></div>
</div>
</span></div>
</span></div>
</span></span></div>
<div style="text-decoration: underline; "><span style="font-weight: bold; "><br />
</span></div>
<div><span style="font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; ">hadoop源码剖析不错的</span></div>
</div>
</span></span></div>
</div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://caibinbupt.javaeye.com/blog/292073" rel="nofollow" style="color: #551a8b; ">http://caibinbupt.javaeye.com/blog/292073</a><br style="text-decoration: underline; " />
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">也研究MapReduce的家伙</span><br style="text-decoration: underline; " />
</div>
</div>
</span></span></div>
<div><span style="font-weight: bold; "><span style="font-weight: normal; ">
<div style="text-decoration: underline; "><a href="http://coderplay.javaeye.com/blog/259880" rel="nofollow" style="color: #551a8b; ">http://coderplay.javaeye.com/blog/259880</a><br />
</div>
<div><span style="font-weight: bold; "><br />
</span></div>
</span></span></div>
<div style="text-decoration: underline; "><span style="font-weight: bold; "><br />
</span></div>
<div style="text-decoration: underline; "><span style="font-weight: bold; "><br />
</span></div>
<div><span style="font-weight: bold; "><span style="font-size: large; ">相关主题和文档</span></span></div>
<div><span style="font-size: 18px; font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; ">hadoop部署</span></div>
<a href="http://www.slideshare.net/steve_l/dynamic-hadoop-clusters" rel="nofollow" style="color: #551a8b; ">http://www.slideshare.net/steve_l/dynamic-hadoop-clusters</a><span style="color: #551a8b; text-decoration: underline; "><br />
</span></div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; "><br />
</span></div>
</div>
</span>hadoop升级</span></div>
</span></span></div>
<div><span style="font-weight: bold; "><span style="font-size: large; "><span style="font-size: 13px; font-weight: normal; ">
<div style="display: inline !important; "><span style="font-weight: bold; "><span style="border-collapse: collapse; font-family: Simsun; font-weight: normal; ">
<pre style="white-space: pre-wrap; display: inline !important; "><span style="border-collapse: separate; font-family: arial; font-size: 13px; white-space: normal; ">
<div style="display: inline !important; "><span style="font-weight: bold; "><span style="font-weight: normal; ">
<div style="display: inline !important; "><span style="font-weight: bold; "><span style="border-collapse: collapse; font-family: Simsun; font-weight: normal; ">
<pre style="white-space: pre-wrap; display: inline !important; "><span style="border-collapse: separate; font-family: arial; font-size: 13px; white-space: normal; ">
<div style="display: inline !important; "><a href="http://zkl-1987.javaeye.com/blog/365172" rel="nofollow" style="color: #551a8b; ">http://zkl-1987.javaeye.com/blog/365172</a><br style="text-decoration: underline; " />
<div style="display: inline !important; "><span style="font-weight: bold; "><span style="border-collapse: collapse; font-family: Simsun; font-weight: normal; ">
<pre style="white-space: pre-wrap; display: inline !important; "><span style="border-collapse: separate; font-family: arial; font-size: 13px; white-space: normal; ">
<div style="display: inline !important; "><a href="http://www.javaeye.com/topic/365172" rel="nofollow" style="color: #551a8b; ">http://www.javaeye.com/topic/365172</a><br style="text-decoration: underline; " />
<span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div style="text-decoration: underline; "><br />
</div>
<div>
<div style="text-decoration: underline; "><span style="font-weight: bold; "><a href="http://www.nabble.com/Book:-Hadoop-The-Definitive-Guide-tc21803469.html" rel="nofollow" style="color: #551a8b; ">SequenceFile的demo</a><br />
<br />
</span></div>
<span style="color: #551a8b; text-decoration: underline; "><span style="color: #000000; ">
<div><a href="http://developer.yahoo.com/blogs/hadoop/FairSharePres.ppt" rel="nofollow" style="color: #0000cc; ">hadoop公平调度器的介绍ppt</a></div>
<br />
<a href="http://www.google.com/" rel="nofollow" style="color: #551a8b; ">DBInputFormat和DBOutputFormat的介绍</a></span><br />
</span>
<div style="text-decoration: underline; "><span style="text-decoration: underline; "><br />
</span></div>
<div><span style="font-weight: bold; ">特殊应用WebDav, 这个家伙实现的hdfs-webdav
<div style="text-decoration: underline; ">
<div><a href="http://www.blogjava.net/badqiu/archive/2008/11/24/242225.html" rel="nofollow" style="color: #0000cc; ">http://www.blogjava.net/badqiu/archive/2008/11/24/242225.html</a></div>
<div><br />
</div>
<div><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://markmail.org/search/?q=mapred.job.classpath.files" rel="nofollow" style="color: #0000cc; ">http://markmail.org/search/?q=mapred.job.classpath.files</a>&#160;&#160;</div>
</span></div>
</div>
</span></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">hadoop namenode 高可用性(容灾)(Redundant Network Architecture,&#160;<span style="font-weight: normal; ">相关软件有:&#160;Linux bonding,&#160;<span style="text-decoration: none; "><a href="http://www.ibm.com/developerworks/cn/linux/l-halinux/index.html" rel="nofollow" style="color: #551a8b; ">heartbeat</a></span>
<div style="display: inline !important; ">,&#160;DRBD Disk
<div style="display: inline !important; "><span style="font-weight: bold; ">)</span></div>
</div>
</span></span></div>
<a href="http://www.hadoop.org.cn/document/Hadoop%20Namenode%20High%20Availability.pdf" rel="nofollow" style="color: #551a8b; ">http://www.hadoop.org.cn/document/Hadoop%20Namenode%20High%20Availability.pdf</a></div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">磁盘空间过满时启动失败的处理</span></div>
<div style="text-decoration: underline; "><a href="http://blog.csdn.net/ww_great/archive/2008/11/14/3296724.aspx" rel="nofollow" style="color: #551a8b; ">http://blog.csdn.net/ww_great/archive/2008/11/14/3296724.aspx</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">写SequenceFile格式的输出</span></div>
<div style="text-decoration: underline; "><a href="http://www.umiacs.umd.edu/~jimmylin/cloud9/umd-hadoop-dist/cloud9-docs/content/staging-records.html" rel="nofollow" style="color: #0000cc; ">http://www.umiacs.umd.edu/~jimmylin/cloud9/umd-hadoop-dist/cloud9-docs/content/staging-records.html</a><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; ">Hadoop中的集群配置和使用技巧</span><br style="text-decoration: underline; " />
</div>
<div style="text-decoration: underline; "><a href="http://www.infoq.com/cn/news/2008/08/hadoop-config-tip" rel="nofollow" style="color: #0000cc; ">http://www.infoq.com/cn/news/2008/08/hadoop-config-tip</a></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">MapReduce tips</span></div>
<a href="http://www.javaeye.com/topic/351026" rel="nofollow" style="color: #0000cc; ">http://www.javaeye.com/topic/351026</a><br style="text-decoration: underline; " />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">比较好的MR管道实例</span></div>
<div style="text-decoration: underline; "><a href="http://www.cnblogs.com/phinecos/archive/2008/11/11/1331599.html" rel="nofollow" style="color: #0000cc; ">http://www.cnblogs.com/phinecos/archive/2008/11/11/1331599.html</a></div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">hadoop调试调优</span></div>
<div style="text-decoration: underline; "><a href="http://business.rapleaf.com/pdfs/hadoop_part_3.pdf" rel="nofollow" style="color: #551a8b; ">http://business.rapleaf.com/pdfs/hadoop_part_3.pdf</a></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div><span style="font-weight: bold; ">hadoop in facebook(</span><span style="font-weight: bold; ">facebook的hadoop配置)</span><br style="text-decoration: underline; " />
</div>
<div style="text-decoration: underline; "><span style="font-weight: bold; "><span style="font-weight: normal; "><a href="http://www.hadoop.org.cn/document/Anatomy%20of%20the%20Facebook%20Cluster.pdf" rel="nofollow" style="color: #551a8b; ">http://www.hadoop.org.cn/document/Anatomy%20of%20the%20Facebook%20Cluster.pdf</a></span></span></div>
<div style="text-decoration: underline; "><br />
</div>
<div>
<div style="display: inline !important; "><span style="font-weight: bold; "><span style="border-collapse: collapse; font-family: Simsun; font-weight: normal; ">
<pre style="white-space: pre-wrap; display: inline !important; "><span style="border-collapse: separate; font-family: arial; font-size: 13px; white-space: normal; ">
<div style="display: inline !important; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div><span style="font-weight: bold; ">Practical MapReduce</span></div>
<a href="http://www.cloudera.com/blog/2009/05/18/10-mapreduce-tips/" rel="nofollow" style="color: #0000cc; ">http://www.cloudera.com/blog/2009/05/18/10-mapreduce-tips/</a></div>
</span></div>
</span></pre>
</span></span></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div style="text-decoration: underline; "><span style="font-family: Simsun; font-size: 16px; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div style="text-decoration: underline; "><span style="line-height: 19px; "><a href="http://files.meetup.com/1228907/Hadoop%20WebDav%20at%20Contextweb.ppt" rel="nofollow" style="font-family: arial, sans-serif; color: #0000cc; ">Transitioning of existing applications to use HDFS</a></span><br />
</div>
<div style="text-decoration: underline; "><span style="line-height: 19px; "><br />
</span></div>
<div style="text-decoration: underline; "><span style="line-height: 19px; "><a href="http://files.meetup.com/1228907/Hadoop%20at%20ContextWeb.ppt" rel="nofollow" style="font-family: arial, sans-serif; color: #0000cc; "><em style="color: #cc0033; font-style: normal; font-weight: normal; text-decoration: underline; ">Hadoop</em>&#160;at&#160;<em style="color: #cc0033; font-style: normal; font-weight: normal; text-decoration: underline; ">ContextWeb</em></a></span></div>
</div>
</span></div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
<div style="text-decoration: underline; "><br />
</div>
</div>
<div style="text-decoration: underline; "><br />
</div>
<div><span style="font-weight: bold; "><span style="font-size: large; ">图书</span></span></div>
<div><span style="font-size: 18px; font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; ">
<div>&lt;&lt;Pro hadoop>></div>
<div><span style="text-decoration: none; "><a href="http://www.google.com/notebook/goog_1241325634953" rel="nofollow" style="color: #0000cc; ">&lt;&lt;hadoop: the definitive guide>></a>&#160;(hadoop作者写的)</span></div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><span style="font-weight: bold; "><span style="font-size: large; ">MISC</span></span></div>
<div><span style="font-size: 18px; font-weight: bold; "><span style="font-family: Simsun; font-size: 16px; font-weight: normal; ">
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><span style="font-weight: bold; ">清华大学的分布式相关课程</span><br />
</div>
<div style="font-family: arial, sans-serif; font-size: 83%; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; overflow-x: hidden; overflow-y: hidden; background-color: #ffffff; "><a href="http://hpc.cs.tsinghua.edu.cn/dpcourse/readings.htm" rel="nofollow" style="color: #551a8b; ">http://hpc.cs.tsinghua.edu.cn/dpcourse/readings.htm</a><br />
</div>
<div><font  face="arial" size="3"><span  style="font-size: 13px;"><br />
</span></font></div>
</span></span></div>
</div>
</span></span></div>
</div>
</span></div>
</span></pre>
</span></span></div>
</div>
</span></pre>
</span></span></div>
</span></span></div>
</span></pre>
</span></span></div>
</span></span></span></div>
</div>
</div>
</div>
</span></div>
</span></div>
</div>
</span></div>
</span></div>
</span></span></div>
</span><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1503175.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48008/" target="_blank">IBM发布全球首款开源智能编译器</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>hadoop Map Stage流程分析</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/05/25/1488811.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Mon, 25 May 2009 05:02:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/05/25/1488811.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1488811.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/05/25/1488811.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1488811.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1488811.html</trackback:ping><description><![CDATA[<p><img height="344" alt="" src="http://images.cnblogs.com/cnblogs_com/onlyxp/kv_inner_sort.png" width="1000" border="0" /></p>
<p>单个Spill在内存中的 Inner Sort.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img height="657" alt="" src="http://images.cnblogs.com/cnblogs_com/onlyxp/mergeParts.png" width="1000" border="0" /></p>
<p>所有 spill 文件在 map结束时调用 mergeParts 进行归并.</p>
<p>&nbsp;</p>
<p>未完待续...</p>
<img src ="http://www.cnblogs.com/OnlyXP/aggbug/1488811.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48007/" target="_blank">IE颓势不减 微软下月公布最新浏览器架构</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>hadoop作业调度 - 源码分析</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/05/20/1467774.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Wed, 20 May 2009 06:03:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/05/20/1467774.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1467774.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/05/20/1467774.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1467774.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1467774.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><img height="400" alt="" src="http://images.cnblogs.com/cnblogs_com/onlyxp/TaskScheduler1.jpg" width="833" border="0" /></p>
<p>TaskScheduler是作业调度器的抽象基类. 具体的实现有: </p>
<ul>
    <li>JobQueueTaskScheduler: 默认的FIFO调度队列</li>
    <li>LimitTasksPerJobTaskScheduler: 扩展自JobQueueTaskScheduler, 可以对每个Job的task总数作限制.</li>
    <li>CapacityScheduler: Yahoo开发的一个基于容量的作业调度器</li>
    <li>FairScheduler: 公平调度器, 保证小任务得到快速响应, 大任务保证服务水平, 由facebook开发. </li>
</ul>
<p>&nbsp;</p>
<p>JobTracker维护一个TaskScheduler的实例,并托管其生命周期.<br />
<br />
</p>
<p><strong>TaskScheduler实例伴随JobTracker一起构造</strong></p>
<div class="cnblogs_code" style="width: 741px; height: 219px"><img id="Code_Closed_Image_133350" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_133350').style.display='none'; document.getElementById('Code_Open_Image_133350').style.display='inline'; document.getElementById('Code_Open_Text_133350').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_133350" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_133350').style.display='none'; getElementById('Code_Closed_Image_133350').style.display='inline'; getElementById('Code_Closed_Text_133350').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_133350">Code</span><span id="Code_Open_Text_133350" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;JobTracker(JobConf&nbsp;conf)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;InterruptedException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;创建调度器</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class</span><span style="color: #000000">&lt;?</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TaskScheduler</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;schedulerClass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conf.getClass(</span><span style="color: #000000">"</span><span style="color: #000000">mapred.jobtracker.taskScheduler</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobQueueTaskScheduler.</span><span style="color: #0000ff">class</span><span style="color: #000000">,&nbsp;TaskScheduler.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskScheduler&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(TaskScheduler)&nbsp;ReflectionUtils.newInstance(schedulerClass,&nbsp;conf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;</p>
<p>启动JobTracker的主方法中, 构造JobTracker对象并给taskScheduler设置TaskTrackerManager实例字段:</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_134051" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_134051').style.display='none'; document.getElementById('Code_Open_Image_134051').style.display='inline'; document.getElementById('Code_Open_Text_134051').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_134051" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_134051').style.display='none'; getElementById('Code_Closed_Image_134051').style.display='inline'; getElementById('Code_Closed_Text_134051').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_134051">Code</span><span id="Code_Open_Text_134051" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;JobTracker&nbsp;startTracker(JobConf&nbsp;conf)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException,&nbsp;InterruptedException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;JobTracker&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">true</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JobTracker(conf);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;给taskScheduler设置TaskTrackerManager实例</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.taskScheduler.setTaskTrackerManager(result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(result&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobEndNotifier.startNotifier();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;result;<br />
}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在offerService中回调其start()方法:</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;offerService()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;InterruptedException,&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;taskScheduler.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
}</span></div>
<p>&nbsp;</p>
<p>taskScheduler在JobTracker.heartbeat方法中进行任务指派:</p>
<p>&nbsp;</p>
<div class="cnblogs_code" style="width: 715px; height: 616px"><img id="Code_Closed_Image_135341" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_135341').style.display='none'; document.getElementById('Code_Open_Image_135341').style.display='inline'; document.getElementById('Code_Open_Text_135341').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_135341" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_135341').style.display='none'; getElementById('Code_Closed_Image_135341').style.display='inline'; getElementById('Code_Closed_Text_135341').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_135341">Code</span><span id="Code_Open_Text_135341" style="display: none"><br />
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;HeartbeatResponse&nbsp;heartbeat(TaskTrackerStatus&nbsp;status,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;restarted,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;initialContact,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;acceptNewTasks,&nbsp;</span><span style="color: #0000ff">short</span><span style="color: #000000">&nbsp;responseId)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;如果当次心跳允许指派任务，且当前上报心跳的taskTracker可接收新task(传入的acceptNewTasks为true)<br />
&nbsp;&nbsp;&nbsp; //,&nbsp;并且其不在黑名单中, </span><span style="color: #008000">则进入调度</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(recoveryManager.shouldSchedule()&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;acceptNewTasks&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">isBlacklisted)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TaskTrackerStatus&nbsp;taskTrackerStatus&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getTaskTracker(trackerName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(taskTrackerStatus&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOG.warn(</span><span style="color: #000000">"</span><span style="color: #000000">Unknown&nbsp;task&nbsp;tracker&nbsp;polling;&nbsp;ignoring:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;trackerName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Task</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;tasks&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getSetupAndCleanupTasks(taskTrackerStatus);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tasks&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;调用具体的taskScheduler实现来为当前taskTracker指派任务</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tasks&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;taskScheduler.assignTasks(taskTrackerStatus);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(tasks&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(Task&nbsp;task&nbsp;:&nbsp;tasks)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expireLaunchingTasks.addNewTask(task.getTaskID());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug(trackerName&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;-&gt;&nbsp;LaunchTask:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;task.getTaskID());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actions.add(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LaunchTaskAction(task));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; ...<br />
}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>taskScheduler销毁:</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;close()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(taskScheduler&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;taskScheduler.terminate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://www.cnblogs.com/Images/dot.gif" /><br />
}</span></div>
<p>&nbsp;</p>
<p>taskScheduler中还有一个方法getJobsFromQueue(String queueName), 当前用于JobClient查询指定任务队列的Job信息.<br />
</p>
<p>TaskScheduler的实现的关键是分派任务的策略. 这体现在assignTasks方法中. TaskScheduler所需要的关于集群信息由<br />
传入的TaskTrackerManager提供, TaskScheduler运行所需要的关于job的信息由JobQueueJobInProgressListener的Collection&lt;JobInProgress&gt; getJobQueue()方法提供.</p>
<p><br />
JobQueueTaskScheduler是默认使用的TaskScheduler. 是一个单纯的FIFO.</p>
<p>其任务分配的规则相当简单:<br />
对于Map任务:</p>
<p>1. 需要预留部分 task slot 以供失效任务，或应对边际效应的speculative任务之用.</p>
<p>2. 如果为当前TT找到 local task, 在不超过TT并发指标,&nbsp;且满足集群task slot预留的基础上, 可继续为此 tt 分配 task. <br />
&nbsp;&nbsp;&nbsp; 如果分配给当前TT的是remote task, 则当次分派完毕(也就是只会为当前TT分配一个任务)。</p>
<p>对于reduce任务:</p>
<p>&nbsp; 规则同上，不同之处在于不管有没有找到 local task, 每次heartbeat仅为给定 TT 分配一个task.</p>
<p>&nbsp;</p>
<p>这里再补充一点信息, 在实际运营当中，当有某台机器的磁盘出现read only file-system时, 整个Job都会被挂死.<br />
原因是因为机器任务失败后，其TaskTracker仍会不断和JobTracker进行心跳来领任务，而对于 ROFS这种情况，其后续Task的执行也必然错误.<br />
这样，这个TT不断的错误，直到超过Job中容忍的错误上限时整个Job失败.个人觉得应该在JobInProcess作用域加入黑名单机制,当某台机器在当前Job中执行任务超过给定次失败时，则把其列入黑名单.<br />
<br />
对于ROFS错误，要么是文件系统错误，要么是硬盘损坏。<br />
对于文件系统错误，首先可以通过fsck进行文件系统修复，如果修复未果，只能重启，如果重启未果，则需要进行操作系统修复。<br />
如果是磁盘损坏，若支持热插拔最好，否则只能关机换盘.</p><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1467774.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48002/" target="_blank">竞争日趋激烈 微软欲借 Windows 7 扭转战局</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>A Viewstate for PHP</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/04/19/1438976.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Sat, 18 Apr 2009 17:42:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/04/19/1438976.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1438976.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/04/19/1438976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1438976.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1438976.html</trackback:ping><description><![CDATA[<span  style="font-family: Helvetica; font-size: 16px; line-height: normal; ">
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">One of ASP.net&#8217;s most attractive features is the viewstate. It is a convienent way to store arbitrary data in a persistent mechanism. In fact, it&#8217;s rather like PHP&#8217;s $_SESSION array.</p>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">There is, however, one difference. $_SESSION is unique to a user but is reused across pages. With only one window to your website, the two preform the same function. But if a user has multiple tabs or windows, $_SESSION can change in between what would otherwise be two successive page loads.</p>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">The viewstate has two functions:</p>
<ol>
    <li>Storing properties for controls and forms,</li>
    <li>Storing arbitrary data</li>
</ol>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">The viewstate is responsible for ensuring a red label is still red (and doesn&#8217;t default back to black) between page loads. Controls and forms manage this transparently from the developer (excluding a non-obtrusive ViewState property on controls). There is also a viewstate on the page object. It will act like a dictionary, allowing you to save arbitrary data to it.</p>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">The&#160;<a target="_blank" title="ViewState in ASP.net - ExtremeExperts" href="http://www.extremeexperts.com/Net/Articles/ViewState.aspx" style="text-decoration: none; color: #186fd0; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #186fd0; ">viewstate is a magical thing</a>, and it achieves that through&#160;<a title="Any problem in computer science can be solved with another layer of indirection" href="http://www.alternateinterior.com/2006/09/any-problem-in-computer-science-can-be-solved-with-another-layer-of-indirection.html" style="text-decoration: none; color: #186fd0; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #186fd0; ">indirection</a>. It is what separates a browser form submission from a user actually preforming an action. Prado and Fortitude both duplicate this functionality in PHP.</p>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">For a full example, take a look at&#160;<a title="Fortitude" href="http://www.alternateinterior.com/2006/07/fortitude.html" style="text-decoration: none; color: #186fd0; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #186fd0; ">Fortitude Form&#8217;s code</a>. But for today&#8217;s purposes, I just wanted to demonstrate how to create a simple viewstate in PHP.</p>
<pre><code>&lt;?php
if (array_key_exists ("viewstate", $_POST)) {
$viewstate = unserialize (base64_decode ($_POST["viewstate"]));
$viewstate->count++;
} else {
$viewstate = new stdObject;
$viewstate->count = 0;
}
?>
&lt;html>
&lt;body>
Page-load count: &lt;?=$viewstate->count;?>
&lt;form method="post" action="?">
&lt;input type="hidden" value="&lt;?=base64_encode(serialize($viewstate));?>" name="viewstate" />
&lt;input type="submit" value="Increment" />
&lt;/form>
&lt;/body>
&lt;/html>
</code></pre>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">It preforms very similarily to $_SESSION. Although I used an object, it works just as well with an array. But it accomplishes a separate scope for each page. Frequently in PHP, pagination results are placed in $_SESSION, but that means only one set can be used at a time without butchering the rest. In a page scope, any manipulations can be done at will. And that exposes the real difference between the two: global things, like login operation or options, should be set in $_SESSION. Local, page-level or temporary things should be set in the page&#8217;s viewstate. Opening two or three or even one hundred twenty copies of that script will maintain that many instances of $viewstate->count. $_SESSION maintains only one.</p>
<p style="font-family: Helvetica, Arial, sans-serif; font-weight: normal; font-size: 12px; margin-top: 0px; margin-right: 0px; margin-bottom: 2em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 18px; color: #101010; ">Note that the security problems the ExtremeExperts article mentions are just as true with PHP as ASP.net. A manipulative user could set viewstate to a custom crafted value and disrupt the applications expectations. But that just means judicious amounts of validation are required before consuming viewstate on postbacks. Both ASP.net and PHP&#8217;s viewstate can be made secure.</p>
</span><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1438976.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48001/" target="_blank">上海电信计划2012年80%用户实现100M带宽</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Internet级单点登录的数据管理(转)</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/04/13/1434764.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Mon, 13 Apr 2009 06:39:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/04/13/1434764.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1434764.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/04/13/1434764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1434764.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1434764.html</trackback:ping><description><![CDATA[<span  style="font-family: Simsun; font-size: 16px; line-height: normal; ">
<div style="margin-top: 6px; margin-right: 6px; margin-bottom: 6px; margin-left: 6px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; min-height: 1100px; counter-reset: __goog_page__ 0; font-family: Verdana; font-size: 10pt; line-height: normal; background-color: #ffffff; "><span style="color: #333333; "><font size="3">
<div style="margin-top: 0px; margin-bottom: 0px; ">摘要</div>
　　<br />
　　　　Google 提供许多Internet服务，这些服务要求用户进行鉴权，依赖于一种称之为Google账号的单点登录的服务，该服务始于2002年。到2006年为止，Google在全球范围内已经拥有几十种应用，几百万用户账号。我们探讨这些服务的数据管理需求和架构、以及在运行这些服务时所遇到的问题和获得的经验。通过这些探讨，我们对&#8220;理论遇上实践&#8221;这一问题提出我们的观点。系统的成功来自于在好的算法和实际工程之间所作的折中、权衡。<br />
　　1	介绍<br />
　　 Google的所有应用都基于一个常见的单点登录系统（SSO），这些应用都通过登录方式或者和增强型功能的发送来唯一识别用户。SSO的实用性则限制着这些应用的实用性。Google在实用性方面的目标是非常高的，除了他们非常熟悉的服务（例如Google Labs），因此SSO的实用性目标是具有侵略性的。在分布式系统中，为了达到较高实用性的一个方法是牺牲数据一致性。让终端用户面对不一致的逻辑数据项会使得系统走向不可预知的失败。因为Google致力于提供尽可能好的用户体验，所以他们不轻易做出权衡可用性和实用性的决定。在SSO架构设计的早期，把single-copy一致性作为可用性需求。<br />
　　 在高度实用的，可容错的分布式计算机系统中获得single-copy一致性是一个值得深究的问题。Lamport's Paxos算法和Oki and Liskov的Viewstamp复制工作中的复制状态机的方法引起了我们的注意，因为这种方法具有通用性和使用性。Lampson描述了如何使用该方法和其他的机制来构建高性能的分布系统。<br />
　　 因为我们考虑了Google SSO系统的多种实现方案，我们从Sleepycat Software (现在的 Oracle)的Berkeley DB(BDB-HA)研究了基于复制的高可用性的新功能。BDB-HA具有一种能兼容于Paxos and Viewstamped Replication的复制模型。它是一个嵌入式数据库，它把配置和判决规则交给应用程序处理，因此它可以很容易适用于Google的高分布性且些许非传统的产品环境。BDB数据库非常适用于具有高效率存储和检索少量随机关键值对的任务，这能很好地和SSO系统相匹配。<br />
　　　　接下来的内容组织如下：第2部分给出Berkeley DB实用性的背景概要；第3部分从存储的角度讨论SSO的架构，以及怎样和BDB-HA相结合。第4部分我们概括了SSO服务和BDB-HA的边界。第5部分，探讨构建和运行此系统的经验；第6部分进行总结。<br />
　　2	Berkeley DB概览<br />
　　 Berkeley DB是用于值/数据对的嵌入式、高性能、可升级、事务级存储的系统。&#8220;嵌入式&#8221;表明了Berkeley DB是一个直接和应用程序的地址空间连接的库，从而避免高代价的IPC。IPC会降低客户端/服务器系统的性能。在常见的x86平台中Berkeley DB每秒能返回数以百万计的值/数据对。Berkeley DB可以升级某些数据元：它将字节存储为千兆字节；该系统可以在两个至几十个站点间进行复制；可以把它当作简单的数据仓库或者高并发性的事务级引擎。<br />
　　 Berkeley DB提供键入式和有序查找。它不支持任何数据模型（例如，关联模型或者面向对象模型），但是可以在它之上使用不同的数据模型。它的简单的存储模型非常方便的为应用程序提供了存储数据的灵活性，不管是什么格式的数据。<br />
　　 Berkeley DB 支持复制模型的主要复制版本，通过单一写（称之为master）和多个只读的复制版本。从概念上来说，Berkeley DB的复制是简单的：所有写操作都指向master。Master发起更新操作，接着将相应的数据库日志记录传到复制版本，每个复制版本都做出相应改变，就好像它在执行&#8220;取消操作&#8221;。复制版本在事务级的基础上执行操作，因此master忽略了的事务不需要对复制版本进行任何操作，除了写日志记录。复制版本和master一起维护同一个日志。当master发生错误时，复制版本则拥有选择权，最终&#8220;竞争胜出&#8221;的复制版本成为新的master。所有其他的复制版本则和这个新的master进行同步，根据需要回滚或者抛出它们的日志，从而保证所有的复制版本都有一致的日志。<br />
　　3	SSO架构<br />
　　 图1所示为SSO的数据架构。SSO服务将用户名映射到用户帐号，将服务映射到服务所对应的数据。这些映射存储在SSO数据库中，为了平衡负载和数据定位，将它们分割为上百部分（称之为shard）。每个shard是一个复制了的Berkeley Db数据库，这个数据库由5到15个复制版本组成。每个复制版本中的SSO数据存储于单一的Berkeley DB Btree数据库中。<br />
　　 较小的shard具有五个全复制版本，每一个都可以成为master。所有的更新操作都必须通过master。一致性读也必须通过master。有时候我们也允许&#8220;失效读&#8221;，相对于我们所控制的时间，失效读可能有些许过期，失效读可以执行于无master的复制版本。大的应用程序组一般具有五个能成为master的复制版本，另外还有一个只读的复制版本。只读的复制版本从master接收更新操作，但是不参与成为master的竞争，也不提交更新操作，因此，只读的复制版本的数目和它们之间的距离并不影响延迟以及操作的实用性。当系统处在良好运行状态的时候（通常情况下），只读的复制版本的状态和master同步得很好。只要多于一半的具有竞争资格的复制版本（可以成为master的复制版本）已经启动并且相互建立通信，Shard就可以拥有一个master。<br />
　　 为了保证在机器、网络以及数据中心出现错误时的实用性，我们在多个分布多处的数据中心间传播复制版本。同时，我们努力保证各个复制版本间非常接近，因为复制版本间的通信延迟会影响它向shard提交写操作的时间，也会影响生成新的master的时间。为了数据定位，Shard组在地理上分布于不同位置。我们尝试着为shard指定新的用户，这种指定基于数据最可能被访问的位置。当用户数据在多个服务间共享，而且这些服务分散在不同位置的数据中心时，这种指定是明智的。现对于现在所做的，我们可以做更多的数据布局优化，但是它并不最终具有系统性能的最高优先级。<br />
　　 如图1 所示，从逻辑上看，有两种不同种类的shard。绝大多数的shard是独立的数据库，它们将一组用户id映射到帐号数据，将服务id映射到独立于用户的服务数据。其他的shard则执行ID映射，将用户名映射到用户id，将用户id 映射到shard。&#160;<br />
　　　　 ID映射用于登录、邮件传送，有时候也用于给定用户名的用户帐号数据查询。为了客量测性，ID映射shard被链接在一个双连接的列表中，来存储可扩展的映射。链中的每个shard处理键空间的一个子列。临近的shard则储存临近的列。客户端的库代码保持ID映射中的shard名的线索以及它们相应的关键列，以使得我们不必为每个关键访问通道移动列表。如果键值在shard中恢复平衡（可以使用离线工具），存储系统的客户端会注意到相应变化并调整他们的cache定位。<br />
　　4	数据库集成<br />
　　 Berkeley DB把许多判决策略放到应用程序中执行。例如，应用程序负责提供通信基础架构。应用程序注册一个回调函数，Berkeley DB在需要发送消息的时候使用该函数；应用程序则接收该消息并调用Berkeley DB函数来处理消息。因为应用程序拥有通信基础架构，所以它负责决定复制版本运行的同步程度。极端的情况下，master可以向复制版本分派消息，并假定至少有一个复制版本接收到该消息然后立即继续分派。而在另外一种极端情况下，master可以保持等待直到所有的复制版本应答表明它们已经使用发送的记录。当然，两种情况的选择会影响系统的性能和定义。<br />
　　4.1	群集<br />
　　 在Paxos 和 Viewstamped Replication算法之后，Google通过执行群集协议来保证即使是在站点（包括master在内）遭遇到灾难性的数据丢失的情况下，更新的数据也不会丢失。只要Berkeley DB通知SSO应用它正在发送的信息对事务语义是必要的，那么master就一直处于等待状态，直到它从包括它本身在内的多数的复制版本那接收到确认应答。只有在接收到上述应答之后，SSO应用才会认为事务处理已经完成。因此，即使是master崩溃导致丢失它的所有数据，这些数据仍会保存在其他站点上，对事务进行应答。类似的，当要去选择一个新的master时，SSO需要得到大多数的复制版本的同意。因为任意两个复制版本是互相交迭的，所以我们可以保证至少有一个参加matser选择的复制版本可以看到来自于上一个master的最新的更新操作。Berkeley DB通常会选择一个带有最新的日志条目的复制版本作为master，所以这可以确保新的master日志将包含上一个master提交的所有更新信息。<br />
　　4.2	Lease<br />
　　 一个单纯的基于Paxos的系统需要包含大量的复制版本来进行读写，这使得读操作的代价非常高。实际的系统通常应用一种称之为通话延时的机制。如果划分操作或者一些错误致使master在没有通知时间的情况下失去控制权，该机制可以允许master执行本地读操作，而避免返回旧数据的危险。<br />
　　 Google在Berkeley DB复制上执行了lease机制。当回应一个读的请求时，一个master必须等待另一个master一段时间。每个lease超时周期（现在一般是几秒时间），Master通过和大部分复制版本的成功连接来刷新自己的lease。在这段暂停时间间隔期间禁止从完成了的应用中进行选择。在lease超时周期中，应用程序必须禁止master选择的完成。 lease没有必要保证适当的写行为，因为应用程序必须得到大部分复制版本的成功应答后才会认为写操作已经完成。只要master和大部分的复制版本建立连接，lease就会自动更新。<br />
　　　　看看master执行本地读操作时lease的必要，假设一个复制组包含5个复制版本，用A到E表示。在时间0，A是master。在时间1，网络的分隔让A在一边，从B到E则在另一边。在没有lease的情况下，从B到E的复制版本会进行一轮选择，选B为新的master，并处理新的更新操作。同时，A将继续响应本地的读请求，不知不觉就返回了旧的数据。lease机制避免从B到E的复制版本进行master的选择，直到A的master的lease期满，尽管A已经断开与其他复制版本的连接。<br />
　　4.3	群集关系<br />
　　 除了群集协议和延时，复制系统的一个其他关键特性是不在Berkeley DB内处理的，它就是复制群组。<br />
　　 通过改变DNS登录口来改变逻辑名从而改变这些物理环境。通过在配置重增加新的复制品名和IP地址来增加一个新的逻辑复制品。<br />
　　 很难去描述一个完整的运算法则，下面给出一些关键性的概念：<br />
　　 只有master执行DSN决议；<br />
　　 Master的配置会随着DNS设置的改变而改变。<br />
　　配置存储在数据库里，通过一般的数据库的操作来更新。<br />
　　没有master的复制品通过检查数据库来了解配置（当前的提示告诉他们什么时候去检查）。<br />
　　配置增加或删除的部分会被列出，master定期地对它进行读取。<br />
　　鉴定性的操作（提交和选择），复制服务器只处理那些从相同配置来的信息。<br />
　　新发起的复制版本在其版本组中属于不具备竞争资格的成员.至少应在它开始运行之后,并且它被认为具有master能力它才能获得竞争资格.因此新的复制版本不能够使得竞争结果失效.<br />
　　　　我们要求所有的配置转换都拥有一个成员子集,这些成员属于新的或旧的集合中。这是一个比较弱化的限制，但是它可以帮助较为容易的排除同时具有多个master或者不能选出一个master的可能性。<br />
　　　　最通常的配置变化是根据合理的复制版本名对单一的physical machine重新布局。这应该由系统的平稳操作自动完成。其他的配置变化需要操作员进行操作。<br />
　　　　 Paxos及其相关协议的正确性依赖于复制版本保持稳定存储。如果太多的复制版本失去状态，却继续像平常一样执行协议，并且如果其中一个复制版本是master，那么更新操作就可能会丢失。这种情况和physical replica machine的互换是相似的。只有在可以成为master的时候，失去状态的复制版本才能重新启动，作为配置中不具备竞争资格的成员。<br />
　　5	经验<br />
　　5.1	数据库和应用<br />
　　 Google 使用Berkeley DB HA的第一个发行版本来开SSO的开发。Sleepycat开发了普通的基础架构，Google开发特定的应用。每一个团队都需要去做不同的权衡，我们紧密团结的工作，来决定到底因该将多种不同的功能体现在应用程序中还是Berkeley库中。<br />
　　 之前关于部分群组，延时和复制版本组管理的抽象描述都是介于数据库和应用之间。例如，Google在应用中执行的master延时，是因为在那段时间内，Sleepycat无法得知从其他用户<br />
　　 对这个功能发起的请求。master延时在Berkeley DB里执行，因为当master改变时，Berkeley DB有更完整和更准确的信息。接口的增加使得我们可以在应用中完成对master延时的支持，然而这并不是通常的做法。<br />
　　　　从竞争产生的概念上来说，Berkeley DB最初的算法和Paxos并不兼容。当一个复制版本开始一个新的竞争，它会选择一个比之前要大的生成数。对于其他复制版本来说，只有当它们没有参与过更大操作数的竞争时它们才能参与前述复制版本的竞争。为了执行Paxos-like行为，必须稳定地储存竞争生成数，以使得当所有的复制版本都关闭时（包括计划中的维护或者非计划性的断电），旧的消息仍然流动于系统中，而且在复制版本恢复之后不会在后续竞争中引起错误的行为。发生上述错误行为的可能性是很小的，但是对于像Google那么大的安装程序来说，需要尽可能地考虑更小的可能性。Sleepycat的所有其他客户都没有把这种情况当成可能的威胁。<br />
　　　　执行稳定的竞争id，意味着昂贵的写磁盘代价和额外的持续代价。因为在竞争过程中数据库的更新操作是无法使用的，Sleepycat希望避免竞争时的磁盘写操作，从而降低系统的整体实用性。虽然数毫秒的磁盘写等待对基于Internet的应用来说可能是可以接受的，但是在backplane-based系统中会被认为是无法可以忍受的，例如开关管理的TCP连接。两个小组对这种特性做了详细的讨论，以决定它是基础架构的要素（如Sleepycat）还是特定应用的行为（如Google所作的）。Sleepycat最终决定执行稳定的竞争生成，因为没有实质的办法在应用中正确地执行它们，还因为Sleepycat看到了Paxos全兼容执行方案的价值。<br />
　　5.2	实施	<br />
　　<br />
　　经过复制的基于Berkeley DB的SSO系统使用于2003年末。从实施上来看，当我们初次将早期的SSO系统版本替换为基于Berkeley DB的未经复制的系统版本然后再替换为经过复制的版本时，事情显得非常顺利。这个系统平稳运行一个月每月后，我们就要开始考虑如何改进预期瓶颈。例如，初期配置不包含自动管理复制版本组成员资格的能力。这在大约一年后才完成，那时我们具有足够多的shard，我们的操作小组花费很多时间来人工替换出错的机器。还有一个例子，为了简单和方便，ID映射原来是由一个单一的shard来执行。大约一年后才引入可升级的ID映射，那时，流量增长的预测结果表明，现有的ID映射master将会很快超载。<br />
　　对于以合适的方法通过设置Internet服务来部署可靠的、可升级的系统来说，只有在必要的情况下延时复杂性的思想才能很好的发挥作用。有些问题必须先得到解决，否则你无法部署任何东西，而有些问题则可以稍候再解决。在最初的部署之前，当SSO系统的升级瓶颈相当不可预测时，对于系统的实际经验可以帮助我们从系统进展的角度来划分多个后续任务。这种方法用于Internet，对正在运行的软件进行完全控制，但是当产品的其他部分工作和管理时，它并不需要工作的很好。<br />
　　　　从操作的观点看，SSO存储系统如今具有低的维护费用，使得小组人员可以集中精力于支持新的应用和特性。从最初的部署以来，它已经经过不止一个数量级的升级；仍然有发展的空间。<br />
　　6	结论<br />
　　 大型的系统需要足够的算法和较少的维护。在做设计的时候应该更多地考虑的是，系统在出现问题时怎样更好地应对，而不是考虑哪些故障会出现哪些不会出现。像Paxos具有高可容错性算法是非常有价值的。它仍然有助于了解操作环境。我们不使用byzantine容错复制算法，因为额外的成本和复杂性是不可估计的。<br />
　　　　需要很周详的考虑来权衡实用性和一致性。运行系统的经验让我们有理由相信在不牺牲用户体验的同时可以减轻一致性的性能要求。例如，用来标识用户的用户帐号映射几乎不改变，从shard到名字的映射也只改变一点点。我们可以允许对这些类型的稍微失时效的读操作而不牺牲可用性。然而，数据库基础设计并不支持最有效的写操作，因此我们不得不为设计中的所有写操作付出延迟和实用性的代价。<br />
　　　　要从整体的角度来考虑系统的实用性和可靠性，这是理所当然的教训。SSO系统由分布式的前端服务器集合，中间层服务器，负载均衡器等等，以及许多的经过复制的数据库shard组成。能够使用令人着魔的复制算法是很具有诱惑力的，这些算法详细描述系统可以多么的实用，而且具有单一副本的一致性。当这些成为重要的因素时，高实用、高可靠的数据库则成为唯一的组件；它还必须处理许多事务，如数据库组件外部的划分、依据于账户数据的服务定位，以及如何为用户层操作设置合理的超时时间。</font></span></div>
</span><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1434764.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/48000/" target="_blank">数万名网友签名抗议星际争霸2取消局域网功能</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>a</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429596.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Sat, 04 Apr 2009 14:11:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429596.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1429596.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1429596.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1429596.html</trackback:ping><description><![CDATA[[img]a" onload="alert(1);" [/img]
<img src ="http://www.cnblogs.com/OnlyXP/aggbug/1429596.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>CouchDB essentials</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429432.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Sat, 04 Apr 2009 06:14:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429432.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1429432.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/04/04/1429432.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1429432.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1429432.html</trackback:ping><description><![CDATA[<div> <div> <p>&#8220;Each node in a system should be able to make decisions purely based on local state. If you need to do something under high load with failures occurring and you need to reach agreement, you&#8217;re lost&#8230; If you&#8217;re concerned about scalability, any algorithm that forces you to run agreement will eventually become your bottleneck. Take that as a given.&#8221;</p> </div> <div><p> &#8212; <em>Werner Vogels</em>, Amazon CTO and Vice President </p><p>&nbsp;</p><p>&nbsp;</p><h2>Local Consistency</h2><p><strong>The Key to Your Data</strong></p><p>At the heart of CouchDB is a powerful <em>B-Tree</em> storage engine. A B-Tree is a sorted data structure that allows for searches, insertions, and deletions in logarithmic time. As <em>Figure 2-2</em> illustrates, CouchDB uses this B-Tree storage engine for all internal data, documents, and views. If we understand one, we will understand them all. <br /></p><p><img alt="" src="http://books.couchdb.org/relax/figure/02/02.png" width="2172" height="1700" /></p><p>Anatomy of a View Request<br /></p><p><br /></p><p><img alt="" src="http://books.couchdb.org/relax/figure/02/03.png" />&nbsp;</p><h2>Distributed Consistency</h2><p>You could use multi-master, master/slave, partitioning, sharding, write-through caches, and all sorts of other complex techniques.</p><p>&nbsp;</p><h3>Incremental Replication</h3> <p>Because CouchDB operations take place within the context of a single document, if you want to use two database nodes you no longer have to worry about them staying in constant communication. CouchDB achieves <em>eventual consistency</em> between databases by using incremental replication, a process where document changes are periodically copied between servers. We are able to build what&#8217;s known as a <em>shared nothing</em> cluster of databases where each node is independent and self-sufficient, leaving no single point of contention across the system.</p><p><br /></p><p><img alt="" src="http://books.couchdb.org/relax/figure/02/04.png" />&nbsp;<img alt="" src="http://books.couchdb.org/relax/figure/02/05.png" /></p><p><img alt="" src="http://books.couchdb.org/relax/figure/02/06.png" /></p><p>&nbsp;</p></div></div><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1429432.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47999/" target="_blank">Silverlight打造杰克逊纪念专题</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>从网络上整理的google c++编程风格指南</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421015.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Tue, 24 Mar 2009 17:43:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421015.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1421015.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421015.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1421015.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1421015.html</trackback:ping><description><![CDATA[<p>google c++编码风格指南</p>
<p><a href="http://www.cnblogs.com/Files/OnlyXP/google_cpp_guide.pdf">/Files/OnlyXP/google_cpp_guide.pdf</a></p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/OnlyXP/aggbug/1421015.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>网络编程套路杂记1</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421007.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Tue, 24 Mar 2009 16:27:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421007.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1421007.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/03/25/1421007.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1421007.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1421007.html</trackback:ping><description><![CDATA[<span  style="font-family: arial; font-size: 13px; line-height: normal; "><span  style="font-weight: bold; ">
<p><span  style="font-weight: normal;">edisonpeng@tencent.com</span></p>
<p>&#160;</p>
<p>网络client程序</p>
<div><span  style="font-weight: normal; ">基本套路:</span></div>
<div><span  style="font-weight: normal; "><br />
</span></div>
<div><span  style="font-weight: normal; ">1. connect to server</span></div>
<div>&#160;&#160;<span  style="font-weight: normal; ">同步sync + timeout方式</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160;异步connect + callback方式</span></div>
<div><br />
</div>
<div><span  style="font-weight: normal; ">2. send request &amp; recv response</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160;同步方式send + recv方式.</span></div>
<div>&#160;&#160;<span  style="font-weight: normal; ">异步方式:</span></div>
<div>&#160;&#160; &#160;异步回调</div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; &#160;每个请求生成一个Token, 发送请求并把Token存放到一个TokenTracker中, 之后callback回来后在TokenTracker中查找相应token,并进行相应回调处理.这是典型的</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; &#160;ACT(Asynchronous Completion Token)模式, 通常结合主动对象模式(Active Object)来实现RPC中间件的AMI(Asynchronous method invocation).ICE就是一例.</span></div>
<div>&#160;</div>
<div>&#160;&#160; &#160;异步FutureTask</div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; &#160;在某个选定时刻进行同步等待. 也是基于ACT和Active Object来实现.</span></div>
<div><br />
</div>
<div><br />
</div>
<div>网络server程序</div>
<div><span  style="font-weight: normal; "><span  style="font-weight: bold; ">
<div>Stateless server</div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; 例如http server, 只需要维护　连接对象, 一个连接(connection)对象通常也包含其相关的请求对象(request).</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; a. 若每个连接的请求是时序同步执行的：每个连接通常只需关联一个请求对象.等接收完一个请求的数据后，屏蔽其网络事件，直到处理完一个请求后才重新注册其网络事件.</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160; b. 若每个连接可同时发送多个请求，则每个连接会若干个请求对象．</span></div>
<div><span  style="font-weight: normal; ">　 &#160;无论是a还是b情况下，每个请求的数据的接收和响应的发送必须时序化.</span></div>
<div><span  style="font-weight: normal; "><br />
</span></div>
<div>Stateful Server</div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;例如用户状态服务器, 连接和client session的对应关系可能是 一对一, 一对多 或者 多对一.</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;如果连接和session是一对一，则session直接作为连接的attachment.</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;如果连接和session是 一对多　或者　多对一　关系. 那么必须有单独的查找表用于记录 连接 -> session 的对应关系.</span></div>
<div><span  style="font-weight: normal; "><br />
</span></div>
</span></span></div>
<div><span  style="font-weight: normal; "><br />
</span></div>
<div><span  style="font-weight: normal; ">1. accept 新连接．</span></div>
<div><span  style="font-weight: normal; ">　创建新连接对象，新连接交给连接管理器进行session维护.&#160;</span></div>
<div><span  style="font-weight: normal; ">　这里client connection的处理可以分为: connection per process/thread, threadPool等.</span></div>
<div><br />
</div>
<div><span  style="font-weight: normal; ">2. 请求处理</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;主要涉及的工作包括: 数据读取, 请求解析, 请求过滤(包括黑白名单过滤, 权限验证等), 请求处理.</span></div>
<div><span  style="font-weight: normal; ">　总的来说，此阶段的工作可以做成SEDA模型, 比如数据读取可以根据不同的类别作不同的权衡，信令数据用单线程读取，大块数据用多线程/线程池读取.</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;其余阶段依此类推.</span></div>
<div><span  style="font-weight: normal; ">&#160;&#160; &#160;示例: Java的开源网络框架Mina，还有facebook的cassandra都实现了SEDA的网络处理模型.</span></div>
<div><br />
</div>
</span>
<div><br />
</div>
<div><span  style="font-weight: bold; ">server设计的技巧</span></div>
<div><span  style="font-weight: bold; ">1. 海量连接管理</span></div>
<div>如果在unix/linux下, 比如httpserver, 可以预先分配一个65535的数组来管理连接，因为linux下连接的fd都是整型，且分配是自增的，这样连接的定位就是O(1)的.</div>
<div><br />
</div>
<div><span  style="font-weight: bold; ">2. 海量Session超时处理</span></div>
<div>比如Google的Chubby这种有大量client session的server, 我们可以按照一定的超时时间刻度对session进行分组，并对组按session lastTouchTime时间降序排序，这样我们每次只需要检查session队列尾部元素是否过期并批量清除.</div>
<div><br />
</div>
<div><span  style="font-weight: bold; "><br />
</span></div>
<div><span  style="font-weight: bold; "><br />
</span></div>
<div><span  style="font-weight: bold; ">2. 异步的技巧</span></div>
<div>通过引入队列buffering机制来消除编程上的异步语义，单机网络程序比如tencent的MCP, 分布式网络程序比如JMS.</div>
</span><img src ="http://www.cnblogs.com/OnlyXP/aggbug/1421007.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47998/" target="_blank">传诺基亚正在开发Android手机</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>UserAgent的历史变迁</title><link>http://www.cnblogs.com/OnlyXP/archive/2009/01/13/1374965.html</link><dc:creator>彭帅</dc:creator><author>彭帅</author><pubDate>Tue, 13 Jan 2009 08:10:00 GMT</pubDate><guid>http://www.cnblogs.com/OnlyXP/archive/2009/01/13/1374965.html</guid><wfw:comment>http://www.cnblogs.com/OnlyXP/comments/1374965.html</wfw:comment><comments>http://www.cnblogs.com/OnlyXP/archive/2009/01/13/1374965.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/OnlyXP/comments/commentRss/1374965.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/OnlyXP/services/trackbacks/1374965.html</trackback:ping><description><![CDATA[<p>UserAgent的历史变迁<br />
日期：2008-12-05　来源：译言<br />
Google推出的Chrome让大家热议纷纷，只有专业用户才会注意到用Chrome访问网页时发出的&#8220;Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13&#8221;UserAgent字符串，貌似天书，它到底是怎么回事儿代表什么呢？我们来看看吧.</p>
<p>最早的时候有一个浏览器叫NCSA Mosaic，把自己标称为NCSA_Mosaic/2.0 (Windows 3.1)，它支持文字显示的同时还支持图片，于是Web开始好玩起来。</p>
<p>然后出现了一个新的网页浏览器，&#8220;Mozilla&#8221;，其实就是&#8220;Mosaic终结者&#8221;的意思，这搞的Mosaic很不爽，(毕竟Mosaic出道早，江湖老)，新浏览器最后正式公布的名称是Netscape，它把自己标称为Mozilla/1.0 (Win3.1)，更好玩了。Netscape支持框架显示，后来框架在大家中间流行起来了，但Mosaic不支持框架啊，于是伟大的&#8220;用户代理人探测&#8221;技术出现了，如果是&#8220;Mozilla&#8221;，那就发给支持框架的页面，至于其他的浏览器，则发给不含框架的页面。</p>
<p>Netscape想逗Microsoft玩儿，把Windows叫做&#8220;几乎不曾做过调试的设备驱动器&#8221;，后者很恼火。Microsoft于是推出了自己的网页浏览器，叫做Internet Explorer，希望它能成为&#8220;Netscape终结者&#8221;。Internet Explorer也支持框架，但它不是Mozilla啊，所以没人给它发送带有框架的页面。Microsoft慢慢烦躁起来，不再寄希望于网站管理员逐渐认识IE并给它发框架，而是宣称自己是&#8220;兼容Mozilla&#8221;的，开始模仿Netscape，把自己标称为Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)，这样Internet Explorer也能收到框架了，整个Microsoft狂喜，但网站管理员开始有点被搞糊涂了。</p>
<p>Microsoft把IE和Windows一起卖，并且把产品也弄得比Netscape更好了，拉开了第一场浏览器之战。结果和大家知道的一样，Netscape被干掉了，Microsoft大胜、大喜。但是后来Netscape以Mozilla的新名称重生了，构造了Gecko，标称其为Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.1) Gecko/20020826，Gecko属于渲染引擎，表现优异。Mozilla开发了Firefox，标称为Mozilla/5.0 (Windows; U; Windows NT 5.1; sv-SE; rv:1.7.5) Gecko/20041108 Firefox/1.0，并且Firefox表现也非常优秀。Gecko扩张迅速，一些浏览器使用了它的代码并标称为Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.2) Gecko/20040825 Camino/0.8.1 ，这是一个，还有Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.8) Gecko/20071008 SeaMonkey/1.0，另一个，它们都伪装成Mozilla，同时也都是基于Gecko支持的。</p>
<p>Gecko表现优秀，IE则很差劲，于是身份甄别再次发生，输送给Gecko的是设计良好的网页代码，其他浏览器就没有这个待遇了。Linux的跟随者很伤心，因为他们创建了基于KHTML引擎支持的Konqueror，但却不会被输送好代码，虽然他们自己认为KHTML和Gecko一样优秀，于是Konquerer开始伪装自己&#8220;像Gecko&#8221;那样以得到好的网页，并标称自己为Mozilla/5.0 (compatible; Konqueror/3.2; FreeBSD) (KHTML, like Gecko)，这个世界更让人困惑了.</p>
<p>后来出现了Opera这样的主儿，宣称&#8220;允许用户自己决定让浏览器装成谁&#8221;，它的菜单中提供了Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.51， Mozilla/5.0 (Windows NT 6.0; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.51，Opera/9.51 (Windows NT 5.1; U; en)供大家来选择，选谁是谁。</p>
<p>Apple开发了Safari，使用了KHTML，同时也增加了很多新特性，后来干脆一锅煮，另起炉灶叫了WebKit，但是它有希望能够得到那些为KHTML编写的网页，于是Safari标称自己为Mozilla/5.0 (Macintosh; U; PPC Mac OS X; de-de) AppleWebKit/85.7 (KHTML, like Gecko) Safari/85.5，这个世界更混乱了。</p>
<p>Microsoft越来越担心Firefox的发展，重新启动了Internet Explorer的开发，标称自己为Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ，可以很好的渲染代码，但那要看网站管理员是否指示它这么做。</p>
<p>Google也开发了自己的浏览器Chrome，使用了Webkit，有点像Safari，希望能得到为Safari编写的网页，于是决定装成Safari。这样啊，Chrome使用了WebKit渲染引擎，想装成Safari，而WebKit呢又伪装自己是KHTML，KHTML呢又是伪装成Gecko的，同时所有的浏览器又都宣称自己是Mozilla，于是，Chrome宣称自己是Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13,，UserAgent字符串彻底混乱了，也几乎不再发挥任何作用，每个人都宣称自己是别人，混乱充斥人间啊。</p>
<img src ="http://www.cnblogs.com/OnlyXP/aggbug/1374965.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47996/" target="_blank">7月编程语言排行榜</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>