array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 Google搜索技术和数据中心揭秘(转贴) - 爱码网
一 Google搜索技术
Google将其成功部分地归功于公司所发明的独有运算机制,令其搜索引擎可以在极短时间内对数以百万计的网络用户的搜索请求提供答案。

  上周三,Google副总裁Urs Hoelzle在Eclipse会议上的一番发言,令与会者有机会了解Google的搜索技术是如何产生以及该技术现在是如何运作的。

  Hoelzle对与会者说,要发明Google的技术,开发者必须抛弃过去大型数据库所使用技术的思维定势。由于一天里面所有搜索请求的内容都是不可预计的,因此手头上就必须拥有100亿左右的网页数据,这是确实是很大的挑战。

  Hoelzle出示了一系列早期Google硬件数据中心的照片。1997年拍的照片中是两台破旧的台式电脑。1999年,是数台Intel服务器,机器后面露出一堆乱七八糟的数据线。2000年的数据中心内,摆放的是1000台排列整齐的双处理器服务器。

  Hoelzle表示,“底层的硬件价格十分低廉,但却完成了许多工作。”同时,使用如此多的服务器,可靠性是Google关心的另一重点。Hoelzle表示,“Google使用自动控制的机制进行运作。否则,工程师们需要为重启服务器而疲于奔命。”

  为了抵抗不可抗力带来的影响,Google搭建了Google文件系统,该系统与Google的搜索运算系统紧密结合,并且对服务器故障有很高的承受能力。

  Google的所有操作均基于一系列的大容量文件,这些文件被拆分为64M大小的数据包,分布在多个“数据包服务器”中。文件的描述、数据包的数目和数据包的位置等资料都存放在中央服务器中。每一个64M的数据包都会在另外两个服务器上备份,三份拷贝的路径亦存放在中央服务器中。

  由于所有的文件都存放在Red Hat Linux服务器中,Google以很低的成本就保证了服务的可靠性。中央服务器会定时向数据包服务器发出脉冲信号,确定数据包服务器是否在正常运作。如果没有收到应答信号,又或者应答信号中显示某台数据包服务器的数据受到损害,中央服务器会从其他数据包服务器上取出数据包修复受损的服务器。这一工作通常在一分钟内则可以完成。

  Hoelzle指出,只有三台服务器上的拷贝同时受损,才会对Google的服务有所影响。这时候,就需要用一段长时间去收集互联网的数据以重建受损文件。

  Google会对Web Crawler收集到的网页进行索引, Web Crawler亦会对这些网页的作出描述。Hoelzle表示,建立网页的索引是很艰巨的一项工作,需要数百台计算机运算数天。同时,索引必须经常地更新。

  为了高速地对索引进行检索,Google将其分成许多称为“碎片”的小块,分布在不同的服务器中,以便进行并行搜索。每一台服务器都搜索出一部分结果,然后再整合在一起成为完整的答案。

  Hoelzle表示,Google的文件系统、索引技术及商用服务器的网格令每一次搜索的平均时间四分之一秒。而文件系统的定时脉冲信号机制,则给予Google很高的可靠性和可用性。

  同时,当Google的服务器分析搜索请求的时候,会将该搜索请求拆分,然后再从数据库中找出令大部分用户满意的结果,这一过程称为“map reduction”。Hoelzle表示,“Google曾经在一次大型维护意外事故中失去了2000台map reduction服务器中的1800台。”但由于系统的负载均衡机制,将未完成的搜索任务合理分配,Google仍然能完成所有的搜索请求。

  Hoelzle指出,“这一机制使我们能很快从故障中复原,并不影响我们的服务。”

二 Google数据中心

Google在搜索领域的成功无疑离不开其先进的搜索算法,然而在背后却存在着一些鲜为人知的秘密:其实Google在运行数据中心方面的经验比其搜索算法更宝贵。

  Google并没有耗资能够数千万甚至上亿美元的资金来购买昂贵的设备,而是仅有数百万美元购置的廉价计算机来构筑其基础设施。通过研究硬件成本,Google的技术人员发现,购买一些高端服务器的成本要远高于数十台更简单的"大众化"服务器。

  但是购买廉价服务器后,难题就在于如何协调这些硬件的运行,确保一台计算机的故障不会影响到整个系统,能正常完成任务如返回搜索结果或显示广告。

  为此Google考虑采用家用PC机,毕竟家用PC因软件和硬件缺陷而造成的崩溃每3年才会发生一次。以Google的规模,如果拥有数千台PC,每天有一台PC崩溃是很正常的。因此,最好是能够以自动的方式解决这一问题,否则服务肯定会出现问题。

  为此,吸引全球最优秀计算机头脑的Google公司已经开发了大量的软件工具,来完成计算设备的安装。

  Google拥有自己的文件系统,称为"Google文件系统",这一系统专门针对处理大型数据进行了优化,它能够处理64MB大小的数据块。更为重要的是,它能够应付随时可能发生的磁盘或网络故障。外Google的数据被复制三份,并存放在不同地方,这样确保万无一失。凭借这些应付故障的措施,PC就完全可以担负互联网搜索服务的重任。

  Google数以千计的PC服务器运行一种基于Red Hat版本的简化版Linux,该系统内核已经针对Google的特殊应用进行了修改。

  Google还设计了一种能够处理大量数据而迅速响应查询的系统。Google将整个Web划分为数以百万计的碎片,以Google的技术术语这些碎片被称为shard,它能在系统出错的时候被复制。

  Google创建了一个出现在Web上的词汇索引,而且它还有文档服务器存储着Google现在的页面。

  Google在数据中心管理方面另一个重要的技术创新是编写出能够在数以千计的服务器上平滑运行的软件系统。通常情况下,开发在多个服务器上并行运行的软件系统需要专门的编程工具和机巧。

  Google的编程工具称为MapReduce,在系统出错的情况下,它能自动恢复整个程序,而这对削减成本至关重要。从去年开始,Google已经开始大规模使用MapReduce编程工具。

  此外,Google还开发了批量任务调度软件Global Work Queue,能对上百万的操作进行调度安排。该软件系统能够将任务分解成许多更小的计算操作,并将它们分配给各台计算机完成。

  为了解决紧急灾难性问题,Google还准备了6辆救火车,以应对Google数据中心发生的紧急事件。此外,电力成本是Google数据中心设计中的另一个重要因素。由于采购了更多廉价计算设备,整体功耗就会增加,为此控制电力开支也是Google设计数据中心必须考虑的一个主要问题。

相关文章: