精华内容
下载资源
问答
  • 信息架构:超越Web设计(第4版) 英文版,完整版,485页,可以粘贴复制
  • 信息架构超越Web设计(第4版)(全彩).[美]Louis Rosenfeld(详细书签)
  • 信息架构超越Web设计(第4版)(全彩).[美]Louis Rosenfeld(详细书签)信息架构超越Web设计(第4版)(全彩).[美]Louis Rosenfeld(详细书签)
  • 信息架构超越Web设计(第4版) 的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些原则提供了...
  • 信息架构是网站品质的根源。中国互联网比欧美要晚好几年,从创意、规划、设计等方面都能看出来。但差距到底在哪里?很大程度是缘于从业者对“信息架构”认知的缺乏,这也就是推荐本书的原因。我们在各行各业都能看到...
  • 本书的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些原则提供了当前实践中的情境,验证了那些...
  • 信息架构超越Web设计(第4版) 的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些原则提供了...
    信息架构:超越Web设计(第4版) 的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些原则提供了当前实践中的情境,验证了那些与技术和供应商无关的工具,以及那些经受住时间考验的技术。
    
    本书包括:
    信息架构概述,以及为创建有效的数字产品和服务而解决的问题 
    深入探讨了信息架构组件,包括组织、标签、导航、搜索和元数据

    让你从研究进入策略、设计和信息架构实现的流程和方法


     下载地址:

    目录
    第1 部分 信息架构简介 
    第1 章 信息架构要解决的问题 3 
    第2 章 信息架构的定义 19 
    第3 章 为查找而设计 33 
    第4 章 为理解而设计 43 
    第2 部分 信息架构的基本原理 
    第5 章 信息架构详解 65 
    第6 章 组织系统 .79 
    第7 章 标签系统 .105 
    第8 章 导航系统 .139 
    第9 章 搜索系统 .169 
    第10 章 叙词表、受控词表和元数据 215 
    第3 部分 完成信息架构 
    第11 章 研究 .251 
    第12 章 策略 .283 
    第13 章 设计和文档 .309 
    展开全文
  • √ 领域畅销经典重装再现,北极熊书长期被信息架构师、设计师及网站开发者奉为圣经 √ 新版内容全面更新,关注焦点彻底突破网站,面向更热门更前沿的电子产品与设备 √ 深度剖析IA 要素,包括组织、标签、导航、搜索...
  • 产品圣经《Web信息架构》重磅新版 北极熊迈向移动|硬件|未来
  • 信息架构超越Web设计(第4版)(全彩)》 的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些...
  • 信息架构超越Web设计(第4版)(全彩)》 的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和永恒原则,这一原则也适用于不断增长的移动世界。在第4版中,作者运用大量最新的插图和例子为这些...
  • 信息架构 超越WEB设计

    2018-06-15 11:08:48
    高清的pdf全彩的书籍,第四版比之前的版本更新,更加适应现在的架构,更通俗易懂方便阅读。
  • 摘要:总体上讲,SOA和WebAPI似乎解决的是同一个问题:以...在本教程中,我们将介绍这项评估的关键阶段,帮助您评估您的企业在此旅程中的位置,分析您可能想要采取哪些行动来让您的集成架构朝着或超越API公开的方向发
  • 内容简介 · · · · · · 本书的前三个版本都是信息架构领域的开山著作。其中描述了信息组织的普遍和...整合:信息架构风格指南 347 “原因”所在 347 “方式”所在 348 本章回顾 349 结语 351 附录A参考文献 355
  • 在本教程中,我们将介绍这项评估的关键阶段,帮助您评估您的企业在此旅程中的位置,分析您可能想要采取哪些行动来让您的集成架构朝着或超越API公开的方向发展。首先,让我们简要介绍一下业务功能公开的历史,然后更...
  • 信息架构 超越Web设计 第4版 Louis Rosenfeld 360 2016.06 是pdf
  • 集成架构对比 WebAPI 与面向服务的架构和企业应用程序集成 简介 几乎所有企业都有多个应用程序作为其关键数据的记录系统而且还拥有它们赖以创业的业务功 能因此一些组织想要不断向其企业内外更广泛的受众揭示这些...
  • 在进程分离的架构下,意味着我们可以用 Rust 写 GUI 后端,用于提供语言服务等;Rust 写前端则可以编译为 WebAssembly,以更好的性能在浏览器上运行。 本地运行。没啥说的,怎么地也不如再有的 GUI 框架做得好。 ...

    自打我有了一个写 Uncode IDE 的小目标之后,我开始寻找一些适用于 Rust 语言的 GUI 框架。对于未来而言,基于 Rust 语言写 GUI 提供了大量的优点。

    • 浏览器环境。在进程分离的架构下,意味着我们可以用 Rust 写 GUI 后端,用于提供语言服务等;Rust 写前端则可以编译为 WebAssembly,以更好的性能在浏览器上运行。

    • 本地运行。没啥说的,怎么地也不如再有的 GUI 框架做得好。

    • 移动设备上运行。就是想想,说不定还能实现。

    于是,在我这一个月的努力之下,我尝试了三个不同风格的 Rust GUI 框架:终于总算是勉强能跑起来了。顺便一提,这三个框架都不是稳定版本,功能都不够完善。

    唯一值得称道的一点是,我写这篇文章用的工具用的是其中的 Druid 框架写的 Print 编辑器吧。它可以稳定的运行着,虽然功能还不够完善,但是勉强可以用起来。

    而且,从输入的效果来看,输入的响应速度还是相当不错的 —— 毕竟在没有各种智能 + 智障提醒的情况下,它不会有多慢。

    混合框架 Tauri

    为了方便于开发,我开始我假设 Uncode 是运行在浏览器环境的,所以呢,我就找了 Electron 的替代器 Tauri。

    Tauri 走的是古老的混合应用框架 Cordova 的思路,通过调用系统默认的 WebView 来作为环境。想想,还是很美好的,所以我尝试了使用 Tauri 运行了第一个 hello, world。然后试着,加了几个功能,也是勉强能接受的,直到我需要一个多窗口的功能,发现没有。

    于是,我去 GitHub 上了解了一下情况,看了一眼 Todo:

    • Frameless Mode (coming soon)

    • Transparent Mode (coming soon)

    • Multiwindow Mode (coming soon)

    看了一眼时间,没错今年是 2021 了,这些个 Todo 这么多,我还怎么继续啊。

    小结,其实呢,如果你用过 Cordova 的话,那你就知道 Cordova 在跨平台上的诸多问题。不过,写写小工具还是相关不错的,hello,world 只需要 600 KB,体积少了 100M 还是很香的。

    跨 Web 与原生框架 Iced

    接着,我开始寻找了第二个 GUI 框架,我看到了一个更美好的框架 Iced:用 Iced 写的应用,除了可以在桌面上运行,还可以编译为 Web 应用在浏览器上跑。有没有很香??

    拿起 Iced 就开发干了:

    • Flexd 布局 + 1 分,

    • 独立的 Style 编写 + 1 分

    • ……

    如下是使用 Iced 编写的 Style,支持一定程度的自定义:

    mod style {
    ...
    impl container::StyleSheet for ProjectToolWindow {
      fn style(&self) -> container::Style {
        container::Style {
          backg round: Some(Background::Color([1.0, 1.0, 1.0].into())),
          text_color: Some(Color::BLACK),
          ..container::Style::default()
        }
       }
     }
    }
    

    那,我们来写个编辑器吧。咦,没有多行 text input。我思考了一下一个编辑器的工作量,我决定放弃这个框架。

    总结:API 非常友好,至少我是觉得不错滴,但是 widget 不全。

    桌面级 Druid

    我要醒醒醒醒,原生 GUI 开发和 Web UI 开发不一样,大部分组件库没那么全的。嗯,看来这样一来,我的目标就很清晰了:多窗口 + 多行文本。一波努力之下,我找到了 Druid。然后看了看作者的头像,似乎有点眼熟,点进去一眼,原来就是那个写 Xi Editor 的作者了。

    • 编辑器支持功能 GET。同时还有 xi-win 作为参考版本,widget 里还提供了多行文本的支持,也就是我现在在写本文的这个工具,用的就是多行文本。虽然,后期得自定义,但是至少得是 it works。

    • 内置多语言支持。

    • 官方提供了主题的 Demo。

    • 官方有一个参考应用:字体编辑器。

    排版方式上,同样是可以用 Flex,如下:

    fn make_ui() -> impl Widget<AppState> {
    Flex::column()
    .with_child(navigation_bar())
    .with_flex_child(center(), 1.0)
    .with_child(bottom_tool_window())
    .with_child(status_bar())
    .background(crate::theme::BACKGROUND_COLOR)
    }
    

    比较有意思的是,这个框架内置了大量的 GUI 范式,你得按它的模式来编写。

    总结:基本可用的 Rust GUI 库,文档还有待完善。

    展开全文
  • 七步法:Web API设计方法论

    千次阅读 2015-01-15 13:01:42
    Web设计、实现和维护API不仅仅是一项挑战;对很多公司来说,这是一项势在必行的任务。本系列 将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护公共API。...

    为Web设计、实现和维护API不仅仅是一项挑战;对很多公司来说,这是一项势在必行的任务。本系列 将带领读者走过一段旅程,从为API确定业务用例到设计方法论,解决实现难题,并从长远的角度看待在Web上维护公共API。沿途将会有对有影响力的人物的访谈,甚至还有API及相关主题的推荐阅读清单。


    这篇 InfoQ文章是 Web API从开始到结束系列文章中的一篇,后续我们将继续为您带来文章的更新


    设计Web API不止是URL、HTTP状态码、头信息和有效负载。设计的过程--基本上是为了你的API“观察和感受” -- 这非常重要,并且值得你付出努力。本文简要概括了一种同时发挥HTTP和Web两者优势的API设计方法论。并且它不仅对HTTP有效。如果有时你还需要通过WebSockets、XMPP、MQTT等实现同样的服务,大部分API设计的结果同样可用。可以让未来支持多种协议更容易实现和维护。


    优秀的设计超越了URL、状态码、头信息和有效负载


    一般来说, Web API设计指南的重点是通用的功能特性,比如URL设计,正确使用状态码、方法、头信息之类的HTTP功能特性,以及持有序列化的对象或对象图的有效负载设计。这些都是重要的实现细节,但不太算得上API设计。并且正是API的设计--服务的基本功能特性的表达和描述方式--为Web API的成功和可用性做出了重要贡献。


    一个优秀的设计过程或方法论定义了一组一致的、可重复的步骤集,可以在将一个服务器端服务组件输出为一个可访问的、有用的Web API时使用。那就是说,一个清晰的方法论可以由开发人员、设计师和软件架构师共享,以便在整个实现周期内帮助大家协同活动。一个成熟的方法论还可以随着时间的发展,随着每个团队不断发现改善和精简过程的方式而得到精炼,却不会对实现细节产生不利的影响。实际上,当实现细节和设计过程两者都有清晰的定义并相互分离时,实现细节的改变(比如采用哪个平台、OS、框架和UI样式)可以独立于设计过程。


    API设计七步法


    接下来我们要对Richardson和Amundsen合著的《REST风格的Web API》一书中所介绍的设计方法论做简要地概述。因为篇幅所限,我们不能深入探讨这一过程中的每一步,但这篇文章可以让你有个大概的认识。另外,读者可以用这篇概述作为指南,根据自己组织的技能和目标开发一个独有的Web API设计过程。


    说明:是的,7步看起来有点儿多。实际上清单中有5个步骤属于设计,额外还有两个条目是实现和发布。最后这两个设计过程之外的步骤是为了提供一个从头到尾的体验。


    你应该计划好根据需要重新迭代这些步骤。通过步骤2(绘制状态图)意识到在步骤1(列出所有组成部分)有更多工作要做。当你接近于写代码(步骤6)时,可能会发现第5步(创建语义档案)中漏了一些东西。关键是用这个过程暴露尽可能多的细节,并愿意回退一步或者两步,把前面漏掉的补上。迭代是构建更加完整的服务画面以及澄清如何将它暴露给客户端程序的关键。


    步骤1:列出所有组成部分

    第一步是列出客户端程序可能要从我们的服务中获取的,或要放到我们的服务中的所有数据片段。我们将这些称为语义描述符。语义是指它们处理数据在应用程序中的含义,描述符是指它们描述了在应用程序自身中发生了什么。注意,这里的视点是客户端,不是服务器端。将API设计成客户端使用的东西很重要。


    比如说,在一个简单的待办事项列表应用中,你可能会找到下面这些语义描述符:


    id : 系统中每条记录的唯一标识符


    title : 每个待办事项的标题


    dateDue : 待办事项应该完成的日期


    complete : 一个是/否标记,表明待办事项是否已经完成了。


    在一个功能完备的应用程序中,可能还会有很多语义描述符,涉及待办事项的分类(工作、家庭、园艺等),用户信息(用于多用户的实现)等等。不过为了突出过程本身,我们会保持它的简单性。


    步骤2:绘制状态图

    下一步是根据建议的API绘制出状态图。图中的每个框都表示一种可能的表示--一个包含在步骤1中确定的一或多个语义描述符的文档。你可以用箭头表示从一个框到下一个的转变--从一个状态到下一个状态。这些转变是由协议请求触发的。


    在每次变化中还不用急着指明用哪个协议方法。只要标明变化是安全的(比如HTTP GET),还是不安全/非幂等的(比如HTTP.POST),或者不安全/幂等的(PUT)。


    说明:幂等动作是指重复执行时不会有无法预料的副作用。比如HTTP PUT ,因为规范说服务器应该用客户端传来的状态值替换目标资源的已有值,所以说它是幂等的。而 HTTP POST 是非幂等的,因为规范指出提交的值应该是追加到已有资源集合上的,而不是替换。


    在这个案例中,我们这个简单的待办事项服务的客户端应用程序可能需要访问可用条目的清单,能过滤这个清单,能查看单个条目,并且能将条目标记为已完成。这些动作中很多都用状态值在客户端和服务器之间传递数据。比如add-item 动作允许客户端传递状态值title和dueDate。下面是一个说明那些动作的状态图。


    这个状态图中展示的这些动作(也在下面列出来了)也是语义描述符-- 它们描述了这个服务的语义动作。


    read-list


    filter-list


    read-item


    create-item


    mark-complete


    在你做这个状态图的过程中,你可能会发现自己漏掉了客户端真正想要或需要的动作或数据项。这是退回到步骤1的机会,添加一些新的描述符,并/或者在步骤2中改进状态图。


    在你重新迭代过这两步之后,你应该对客户端跟服务交互所需的所有数据点和动作有了好的认识和想法


    步骤 3 : 调和魔法字符串

    下一步是调和服务接口中的所有“魔法字符串”。“魔法字符串” 全是描述符的名称--它们没有内在的含义,只是表示客户端跟你的服务通讯时将要访问的动作或数据元素。调和这些描述符名称的意思是指采用源自下面这些地方的,知名度更高的公共名称:


    Schema.org


    microformats.org


    Dublin Core


    IANA Link Relation Values


    这些全是明确定义的、共享的名称库。当你服务接口使用来自这些源头的名称时,开发人员很可能之前见过并知道它们是什么意思。这可以提高API的可用性。


    说明:尽管在服务接口上使用共享名称是个好主意,但在内部实现里可以不用(比如数据库里的数据域名称)。服务自身可以毫不困难地将公共接口名称映射为内部存储名称。


    以待办事项服务为例,除了一个语义描述符- create-item,我能找到所有可接受的已有名称。为此我根据Web Linking RFC5988中的规则创建了一个具有唯一性的URI。在给接口描述符选择知名的名称时需要折中。它们极少能跟你的内部数据存储元素完美匹配,不过那没关系。


    经过名称调和,我的状态图变成了下面这样:


    步骤 4 : 选一个媒体类型

    API设计过程的下一步是选一个媒体类型,用来在客户端和服务器端之间传递消息。Web的特点之一是数据是通过统一的接口作为标准化文档传输的。选择同时支持数据描述符(比如"identifier"、"status"等)和动作描述符(比如"search"、"edit"等)的媒体类型很重要。有相当多可用的格式。


    在我写这篇文章时,一些顶尖的超媒体格式是 (排名不分先后):


    超文本标记语言 (HTML)


    超文本应用程序语言(HAL)


    Collection+JSON (Cj)


    Siren


    JSON-API


    交换表达式的统一基础 (UBER)


    让所选择的媒体类型适用于你的目标协议也很重要。大多数开发人员喜欢用HTTP 协议做服务接口。然而WebSocketsXMPPMQTTCoAP 也会用--特别是对于高速、短消息、端到端的实现。


    在这个例子中,我会以HTML为消息格式,并采用HTTP协议。HTML有所有数据描述符所需的支持(<UL>用于列表, <LI>用于条目, <SPAN>用于数据元素)。它也有足够的动作描述符支持 (<A>用于安全链接, <FORM method="get">用于安全转变, <FORM method="post">用于非安全转变)。


    注意:在这个状态图中, “编辑”动作是幂等的(比如HTTP PUT),并且HTML仍然没有对PUT的原生支持。在这个例子中,我会添加一个域来将HTML的POST做成幂等的。


    好了,现在我可以基于那个状态图创建一些样例表示来“试试”这个接口了。对我们的例子而言,只有两个表示要渲染:“待办事项列表”和“待办事项条目”表示:

    图1 :用HTML表示待办事项列表集合



    图2 :用HTML表示待办事项条目


    记住,在你做状态图的表示样例时,可能会发现之前的步骤中有所遗漏(比如漏掉描述符,动作描述符中有幂等之类的变化等)。那也没关系。现在就是解决所有这些问题的时机-- 在你把这个设计变成代码之前。


    等你对表示完全满意之后,在开始写代码之前还有一个步骤--创建语义档案。


    步骤 5 : 创建语义档案

    语义档案是一个文档,其中列出了设计中的所有描述符,包括对开发人员构建客户端和服务器端实现有帮助的所有细节。这个档案是一个实现指南,不是实现描述。这个差别很重要。



    服务描述符的格式

    服务描述文档格式已经出现了相当长一段时间了,并且当你想给已有的服务实现生产代码或文档时很方便。确实有很多种格式。

    在我写这篇文章时,顶级竞争者有:


    Web服务定义语言(WSDL)


    原子服务描述(AtomSvc)


    Web应用程序描述语言(WADL)


    Blueprint


    Swagger


    REST风格的应用程序建模语言(RAML)


    档案的格式

    现在只有几种档案格式。我们推荐下面两种:


    应用级语义档案 (ALPS)


    JSON-LD + Hydra


    这两个都比较新。JSON-LD规范在2014年早期达成了W3C推荐状态。Hydra仍是一个非官方草案(本文写成时还是),有一个活跃的开发者社区。ALPS仍处于IETF的早期草案阶段。


    因为档案文档的理念是要描述一个问题空间的现实生活方面(不只是那一空间中的单一实现),所以其格式跟典型的描述格式十分不同:

    图3 : ALPS格式的待办事项列表语义档案


    你会注意到,这个文档就像一个基本的词汇表,包含了待办事项服务接口中所有可能的数据值和动作--就是这个理念。同意遵循这个档案的服务可以自行决定它们的协议、消息格式甚至URL。同意接受这个档案的客户端将会构建为可以识别,如果合适的话,启用这个文档中的描述符。


    这种格式也很适合生成人类可读的文档,分析相似的档案,追踪哪个档案用得最广泛,甚至生成状态图。但那是另外一篇文章的课题了。


    现在你有完整的已调和名称的描述符清单,已标记的状态图,以及一个语义档案文档,可以开始准备编码实现样例服务器和客户端了。


    步骤 6 : 写代码

    到了这一步,你应该可以将设计文档(状态图和语义档案)交给服务器和客户端程序的开发人员了,让他们开始做具体的实现。

    HTTP服务器应该实现在第2步中创建的状态图,并且来自客户端的请求应该触发正确的状态转变。服务发送的每个表示都应该用第3步中选好的格式,并且应该包含一个第4步中创建的指向一个档案的链接。响应中应该包含相应的超媒体控件,实现了在状态图中显示、并在档案文档中描述的动作。客户端和服务器端开发人员在这时可以创建相对独立的实现,并用测试验证其是否遵守了状态图和档案。


    有了稳定的可运行代码,还有一步要做:发布。


    步骤 7 : 发布你的API

    Web API应该至少发布一个总能给客户端响应的URL -- 即便是在遥远的将来。我将其称为“看板URL” --每个人都知道的。发布档案文档也是个好主意,服务的新实现可以在响应中链接它。你还可以发布人类可读的文档、教程等,以帮助开发人员理解和使用你的服务。


    做好这个之后,你应该有了一个设计良好的、稳定的、可访问的服务运行起来了,随时可以用。


    总结


    本文讨论了为Web设计API的一组步骤。重点是让数据和动作描述正确,并以机器可读的方式记录它们,以便让人类开发人员即便不直接接触也能轻松为这个设计实现客户端和服务器端。


    这些步骤是:


    列出所有组成部分收集客户端跟服务交互所需的所有数据元素。


    绘制状态图:记录服务提供的所有动作(状态变化)


    调和魔法字符串:整理你的公开接口以符合(尽可能)知名的名称


    选择媒体类型:评审消息格式,找到跟目标协议的服务转变最贴近的那个。


    创建语义档案:编写一个档案文档,定义服务中用的所有描述符。


    写代码:跟客户端和服务器端开发人员分享档案文档,并开始写代码测试跟档案/状态图的一致性,并在有必要时进行调整。


    发布你的API:发布你的"看板URL"和档案文档,以便其他人可以用他们创建新的服务以及/或者客户端程序。


    在你的设计过程中,你可能会发现有遗漏的元素,需要重做某些步骤,以及要做一些折中的决定。这在设计过程中出现得越早越好。将来开发人员要求用新的格式和协议实现时,你还有可能用这个API设计。


    最后,这个方法论只是为Web API设计过程创建一种可靠、可重复、一致的设计过程的一种可能方式。在你做这个例子时,可能会发现插入一些额外的步骤,或者缩减一些会更好用,并且-- 当然 -- 消息格式和协议决策在不同案例中可能也会发生变化。


    希望这篇文章能给你一些启发,让你知道如何给自己的组织以及/或者团队创建一个最佳的API设计方法论。

    展开全文
  • Spark:超越Hadoop MapReduce

    千次阅读 2017-04-12 12:06:09
    此外,即使专为大数据设计的系统,如 Hadoop,由于一些数据的属性问题也很难有效地处理图数据,我们将在本章的其他部分看到这方面的内容。  Apache Spark 与 Hadoop 类似,数据分布式存储在服务器的集群或者是...

    引言:和 Hadoop 一样,Spark 提供了一个 Map/Reduce API(分布式计算)和分布式存储。二者主要的不同点是,Spark 在集群的内存中保存数据,而 Hadoop 在集群的磁盘中存储数据。 
    本文选自《SparkGraphX实战》。

      大数据对一些数据科学团队来说是 主要的挑战,因为在要求的可扩展性方面单机没有能力和容量来运行大规模数据处 理。此外,即使专为大数据设计的系统,如 Hadoop,由于一些数据的属性问题也很难有效地处理图数据,我们将在本章的其他部分看到这方面的内容。
      Apache Spark 与 Hadoop 类似,数据分布式存储在服务器的集群或者是“节点”上。 不同的是,Spark 将数据保存在内存(RAM)中,Hadoop 把数据保存在磁盘(机械 硬盘或者 SSD 固态硬盘)中。
      定义 :在图和集群计算方面,“节点”这个词有两种截然不同的意思。 图数据由顶点和边组成,在这里“节点”与顶点的意思相近。在集群计算 方面,组成集群的物理机器也被称为“节点”。为避免混淆,我们称图的 节点为顶点,这也是 Spark 中的专有名词。而本书中的“节点”这个词我 们严格定义为集群中的单个物理计算节点。
               图片描述
      大数据因为数据量大单机无法处理。Hadoop 和 Spark 都是把数据分布在集群节点上的分 布式框架中。Spark 把分布式数据集存放在内存中,所以比 Hadoop 把数据存放在磁盘中 处理速度要快很多。
      除了将要计算的数据保存的位置不同(内存和磁盘),Spark 的 API 比 Hadoop的 Map/Reduce API 更容易使用。Spark 使用简洁且表达力较好的 Scala 作为原生编程语言,写 Hadoop Map/Reduce 的 Java 代码行数与写 Spark 的 Scala 的代码行的数 量比一般是 10:1。
      虽然本书主要使用 Scala,但是你对 Scala 不熟悉也不用担心,我们在第 3 章提 供了快速入门,包括怪异、晦涩和简练的 Scala 语法。进一步熟悉 Java、C++、C#、 Python 等至少一门编程语言是必要的。

    模糊的大数据定义

      现在的“大数据”概念已经被很大程度地夸大了。大数据的概念可以追溯到Google 在 2003 年发表的 Google 文件系统的论文和 2004 年发表的 Map/Reduce 论文。
      大数据这个术语有多种不同的定义,并且有些定义已经失去了大数据所应有的意 义。但是简单的核心且至关重要的意义是:大数据是因数据本身太大,单机无法处理。
      数据量已经呈爆炸性增长。数据来自网站的点击、服务器日志和带有传感器的 硬件等,这些称为数据源。有些数据是图数据(graph data),意味着由边和顶点组成, 如一些协作类网站(属于“Web 2.0”的社交媒体的一种)。大的图数据集实际上是 众包的,例如知识互相连接的 Wikipedia、Facebook 的朋友数据、LinkedIn 的连接数 据,或者 Twitter 的粉丝数据。

    Hadoop :Spark 之前的世界

      在讨论 Spark 之前,我们总结一下 Hadoop 是如何解决大数据问题的,因为Spark 是建立在下面将要描述的核心 Hadoop 概念之上的。
      Hadoop 提供了在集群机器中实现容错、并行处理的框架。Hadoop 有两个关键 能力 :

    • HDFS—分布式存储
    • MapReduce—分布式计算

    HDFS 提供了分布式、容错存储。NameNode 把单个大文件分割成小块,典型 的块大小是 64MB 或 128MB。这些小块文件被分散在集群中的不同机器上。容错性 是将每个文件的小块复制到一定数量的机器节点上(默认复制到 3 个不同节点, 下图中为了表示方便,将复制数设置为 2)。假如一个机器节点失效,致使这个机器上的 所有文件块不可用,但其他机器节点可以提供缺失的文件块。这是 Hadoop 架构的 关键理念 :机器出故障是正常运作的一部分。
           图片描述
      三个分布式数据块通过 Hadoop 分布式文件系统(HDFS)保持两个副本。
      MapReduce 是提供并行和分布式计算的 Hadoop 并行处理框架,如下图 。
               图片描述
      MapReduce 是被 Hadoop 和 Spark 都用到的一个数据处理范式。图中表示计算服务器日 志文件中“error”出现的次数,这是一个 MapReduce 操作。通常 Map 操作是一对一的 操作,对每一个源数据项生成一个相应的数据转换操作。Reduce 是多对一的操作,聚合 Map 阶段的输出。Hadoop 和 Spark 都用到了 MapReduce 范式。
      用 MapReduce 框架,程序员写一个封装有 map 和 reduce 函数的独立代码片段来处 理 HDFS 上的数据集。为取到数据位置,代码打包(jar 格式)分发到数据节点, Map 操作就在这些数据节点上执行,这避免了集群的数据传输导致消耗网络带宽。 对于 Reduce 聚合操作,Map 的结果被传输到多个 Reduce 节点上做 reduce 操作(称 之为 shuffling)。首先,Map 阶段是并行操作的,Hadoop 提供了一个弹性机制,当 一个机器节点或者一个处理过程失败时,计算会在其他机器节点上重启。
      MapReduce 编程框架将数据集抽象为流式 key-value 键值对,然后处理这些键 值对并写回到 HDFS。这是一个有局限的范式,但它已被用来解决许多数据并行问题, 用链接在一起的 MapReduce 进行“读-处理-写”操作过程。对于一些简单的任务,上图显示的是比较适合的场景。但是对于一些如机器学习算法中的迭代计算算 法,用这种 MapReduce 范式就很痛苦,这也是选择使用 Spark 的原因。

    Spark :内存中的 MapReduce 处理

      我们来看另一个可选的分布式处理系统,构建在 Hadoop 基础之上的 Spark。在这一小节你会了解到,在 Spark 处理图数据时扮演重要角色的弹性分 布式数据集(RDD)导致 Hadoop 衰落的两类问题是 :

    • 交互式查询
    • 迭代算法

    Hadoop 很适合在一个大的数据集上做单次查询,而在许多实际场景中,一旦有 了一个想要的答案,我们就想再问数据一个问题,这就是交互式查询。使用 Hadoop 的话,就意味着要等待重新从磁盘中加载数据,再次处理数据。我们不得不执行一 组相同的计算作为随后分析的前提,这不符合常理。
      迭代算法已经被广泛应用于机器学习任务,如随机梯度下降算法,以及之后 会看到的 PageRank 这类图计算算法。迭代算法是在一个数据集上一遍又一遍地做 一组计算,直到满足一个标准(循环结束条件)才结束迭代。 在 Hadoop 中实现这种算法,一般需要一系列加载数据的 MapReduce 任务,这些 MapReduce 任务要在 每一个迭代过程中重复运行。对于非常大的数据集,每个迭代过程要花费 100 秒或1000 秒,整个迭代过程非常耗时。
      下面你会看到 Spark 如何解决这些问题。如 Hadoop 一样,Spark 也是运行在 一个常见的硬件配置的机器集群上。Spark 中的一个核心抽象是弹性分布式数据集(RDD)。RDD 是由 Spark 应用创建的(在Spark Driver上),由集群管理,如下图。
               图片描述
      Spark 提供一个弹性分布式数据集,可以认为它是一个分布式的常驻内存的数组。
    组成 RDD 分布式数据集的数据分区会被加载到集群的机器上。

    基于内存的数据处理

      Spark 执行的大部分操作都是在随机访问内存中(RAM)进行。Spark 是基于内 存的,而 Hadoop Map/Reduce 是顺序处理数据,所以 Spark 比 Hadoop 更适合处理 随机访问的图数据。
      Spark 的关键好处在于交互式查询和迭代处理过程中在内存中缓存 RDD。缓存 起来的 RDD 可以避免每次重新处理父 RDD 链,而只需要直接返回父 RDD 计算后 的缓存结果。
      自然的,这意味着要用到 Spark 的基于内存的计算处理特性,要求集群中的机 器内存要足够大。要是可用内存不够,那么 Spark 就会优雅地溢出数据到磁盘,以 保证 Spark 能继续运行。
      当然 Spark 集群也需要一个持久化存储数据的地方,而且还要是分布式存储系 统才行,可选的有 HDFS、Cassandra 和亚马逊的 S3。

      本文选自《Spark GraphX实战》,点此链接可在博文视点官网查看此书。
                        图片描述
      想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                           图片描述

    展开全文
  • 云计算的基础架构:并行计算+资源虚拟化 (2011-08-20 12:15:51) 标签: 校园 分类: 工作篇 高性能云计算:从科学应用的角度   科学计算往往需要可用的数量庞大的计算机来执行大...
  • 在家宅着什么事也没有,整天就是抖音快手微博微信,突然看到之前快手大数据架构师在某个大会上的演讲,我把这个弄成文字版,大家也是一起学习一下。 快手 App 目前日活 1.5 亿,每天会产生数万亿规模的用户行为数据...
  • 回归架构本真:从规划、思维到设计,构建坚不可摧的架构根基 一、什么是架构    关于什么是架构,业界从来没有一个统一的定义。Martin Fowler在《企业应用架构模式》中也没有对其给出定义,只是提到能够...
  • [解决方案]在_DNS_数据里用机器学习自动寻找恶意软件_C&C:超越蜜罐和逆向工程 移动安全 安全体系 红蓝对抗 web安全 数据安全
  • 在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前,我们先讨论架构的概念定义,概念是人认识这个世界的基础,并用来沟通的...
  • POJO应用架构:Spring与EJB 3.0的对比

    千次阅读 2007-04-10 10:58:00
    POJO应用架构:Spring与EJB 3.0的对比http://dev.yesky.com/240/2106740.shtml2005-09-08 09:44 作者: 陶刚编译 出处: 天极网 责任编辑:方舟 爱因斯坦曾经说过:"每件事物都应该尽可能简单,而不是更简单"。...
  • 新智元推荐 来源:OneFlow【新智元导读】近日,袁进辉(老师木)代表OneFlow团队在全球互联网架构大会上海站做了《深度学习平台技术演进》的报告。报告包括深度学习的计算力问题、硬件基础、软件挑战、传统大数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,575
精华内容 7,030
关键字:

信息架构:超越web设计