Electronic Joint Business

Solution for E-Business

xml

Hadoop 技术手册(二) 用 Map/Reduce 进行大数据分析

当今社会是数据的时代。2001 年,Google 发布图像搜索功能时,只有 2.5 亿个图像被索引, 10 年间,这个搜索功能已经可以检索超过 100 亿个图像。现在每分钟有 35 小时时长的视频被上传到 YouTube。而 Twitter 平均每天要处理 5500 万 tweet。数据的增加,很快就超过单一计算机的处理能力。基于集群的分布式并行编程能够让软件与数据同时运行在一个网络内彼此相连的许多计算机上。这样的分布式并行环境的最大优点是可以很容易的通过增加计算机来扩充新的计算结点,并由此获得不可思议的海量计算能力, 同时又具有相当强的容错能力,某一计算节点失效也不会影响计算的正常进行以及结果的正确性。

Google 使用了运行在 GFS ( Google File System ) 分布式文件系统上的, 名为 MapReduce 的编程模型进行分布式并行编程,为全球亿万用户提供搜索服务。而 Hadoop 项目正是受到了 MapReduce 和 Google File System(GFS) 的启发,2005 年秋天, Hadoop 被作为 Lucene 的子项目 Nutch 的一部分正式引入。 在 2006 年 3 月份,Map/Reduce 和 Nutch Distributed File System (NDFS) 正式被纳入 Hadoop 的项目中。

Hadoop 实现了 Google 的 MapReduce 编程模型,提供了简单易用的编程接口,它也提供了自己的分布式文件系统 HDFS,与 Google 不同的是,Hadoop 是开源的,任何人都可以使用这个框架来进行并行编程。如果说分布式并行编程的难度足以让普通程序员望而生畏的话,开源的 Hadoop 的出现极大的降低了它的门槛,读完本文,你会发现基于 Hadoop 编程非常简单,利用该框架能够轻松编写出可以处理海量数据(TB级的数据集)的应用程序,并能稳定地,可容错地运行在由上千个节点组成的硬件集群上,然后在短时间内完成海量数据的计算。

概念
一个 MapReduce 作业(job) 通常会将输入的数据集分割成独立的数据块 (chunk),然后交由 map 任务以完全并行的方式进行处理。框架负责对 map 的输出进行排序,并作为 reduce 任务的输入。作业的输入和输出一般都保存在文件系统中。该框架还负责任务的调度与监测,并重新执行失败的任务。

通常来说,Hadoop 的计算节点和存储节点是同一节点,也就是说 MapReduce 框架和 Hadoop 分布式文件系统 (HDFS) 在相同的节点上运行。这种配置让框架可以有效地将任务调度给存有数据的节点,从而使得整个群集获得了非常高的总带宽。

>>> 阅读全文

 

, , , ,

XPerf — Windows Performance Toolkit 使用简介

文章评价:

从 Windows 2000 开始,Windows 中就带了事件跟踪机制。所谓事件跟踪,是一种从各种系统组件触发事件的基础设施,只为少量的内核模式下的实体所使用。在 Windows XP 中, MOF 文件 (与 WMI 提供程序的元数据类似)被用来描述事件。在 Windows Vista 和 Windows Server 2008 中,事件用 XML 装配清单来描述事件,这个设计使得 ETW 的使用更为普遍,成百上千的新的事件提供程序( Event Proivder ) 被添加到系统中。

这些提供程序会产生什么信息呢?首先, Windows事件日志(Windows Event Log) 使用这些 ETW 提供程序生成的一部分信息(但不是全部)。因此可以获得有关系统事件的各种诊断消息。另一个提供程序是性能监视器(Performance Monitor), 特点是能够查询成组的 ETW 事件。将这些不同源的信息组织在一起并不是件容易的事。尤其利用同样的跟踪,在对系统的整体的分析和对某些特定应用的分析中不断切换的时候。

这种整合的需求最终导致了 Windows 性能工具包(Windows Performance Toolkit, WPT) 的诞生,它致力于数据收集和集成,是正确地解释和利用 ETW 输出不可缺少的工具。特别的是,它能用一致的方式查看大量的信息,让你能够对系统内正发生的事情有一个整体印象。另外,通过利用内核采样中断,你可以使用全局的采样事件探查器 (包括调用堆栈分析)。更棒的是,它是完全免费的。

下面让我们来看看 WPT 的功能。从 Windows 7 开始,WPT 被包括在 Windows SDK 中,你需要下载 Windows SDK 并安装它。

>>> 阅读全文

 

, , , , , , , ,

Python编写的强大的通用解析器

Spark 是一种用 Python 编写的强大的、通用的解析器/编译器框架。在某些方面,Spark 所提供的比 SimpleParse 或其它 Python 解析器要多得多。不过由于它完全是用 Python 编写的,所以速度也会比较慢。

我将在本文中继续介绍一些解析的基本概念,并对 Spark 模块进行了讨论。解析框架是一个内容丰富的主题,它值得多花时间去全面了解;这篇文章为读者和我自己都开了一个好头。

在日常的编程中,我经常需要标识存在于文本文档中的部件和结构,这些文档包括:日志文件、配置文件、定界的数据以及格式更自由的(但还是半结构化的)报表格式。所有这些文档都拥有它们自己的“小语言”,用于规定什么能够出现在文档内。我编写这些非正式解析任务的程序的方法总是有点象大杂烩,其中包括定制状态机、正则表达式以及上下文驱动的字符串测试。这些程序中的模式大概总是这样:“读一些文本,弄清是否可以用它来做些什么,然后可能再多读一些文本,一直尝试下去。”

解析器将文档中部件和结构的描述提炼成简明、清晰和说明性的规则,确定由什么组成文档。大多数正式的解析器都使用扩展巴科斯范式(Extended Backus-Naur Form,EBNF)上的变体来描述它们所描述的语言的“语法”。基本上,EBNF 语法对您可能在文档中找到的部件赋予名称;另外,较大的部件通常由较小的部件组成。小部件在较大的部件中出现的频率和顺序由操作符指定。

举例来说,清单 1 是 EBNF 语法 typographify.def,我们在 SimpleParse 那篇文章中见到过这个语法(其它工具运行的方式稍有不同):
  

>>> 阅读全文

 

, , , , , ,

Teiid 基于数据联邦的集成方案

要了解什么是 Teiid ,我们首先需要了解什么是虚拟数据库和数据联邦。

虚拟数据库(Virtual Database–VDB) 是将一个或多个物理数据源组合起来以提供更简单的数据集成解决方案,它提供了包含组件的容器,这些组件用来集成不同数据源的数据,并通过一致的 API 来访问它们。这些物理数据源包括: JDBC 数据源、CSV 文本文件、数据表,甚至可以是 Web services。这种技术被称为是“数据联邦” -Data federation。数据联邦技术提供了一种为数据提供抽象的数据接口的能力。这些多个数据源组成的虚拟视图可以使数据消费者(应用)不需要知道数据的物理位置、数据结构和保存方式。

与其它数据集成技术相比,数据联邦技术的明显优势在于获取数据的方便性和实时性。现在很多企业都在实现 SOA,SOA 的灵活性和敏捷性要求组织提供数据时应该具有更少的时延。以前的利用批量任务或者 ETL 的方式创建数据集市和数据仓库的方式的实时性都不太好,在很多应用场景中被数据联邦技术所取代。

但是数据联邦技术访问数据是通过一个“联邦”视图(federation view)来实现的,视图是实时的。随着企业数据量的增大,性能问题是所有数据集成(Data Integration tools)都面临的问题,但是由于设计上的根本缺陷,数据联邦在这方面虽有很大进展,但是仍无法和另外一些数据集成技术相比。这种缺点制约了它在数据集成领域的适用性,虽然很多领域都使用了数据联邦技术,但是在关键的核心业务系统它的应用非常少。

目前已实施数据联邦项目的特点如下:使用简单的有限的数据源,数据结果集不大,只读性的数据访问,数据质量要求简单。比较典型数据联邦产品有:BEA 的 AquaLogic Data Services Platform、IBM 公司的 Federation Server、Software AG 公司的 Enterprise Information Integration、Sybase 的 Data Federation 以及 Red Hat 公司的 JBoss MetaMatrix,其开源实现即 Teiid。

>>> 阅读全文

 

, , , , , , , , , ,

Rails3 技术手册 (一) 概述

英文原文
Ruby on Rails 是用于快速简洁地开发 Web 应用框架。它被 37signal 公司的项目管理工具 Basecamp 中剥离出来,其作者 David Heinemeier Hansson 率先用 Rails 着手解决手边的现实问题。 我们会发现用 Rails 进行开发时充满乐趣, Rails 负担起了开发中那些无聊的琐事,因此开发者能专注于所要解决的问题本身。

你如果不理解这些开发中的琐事,可以看一下下面的例子:编写过 Web 应用的开发者都不可避免地会用到字典结构、缓存、数据持久化、模板系统、测试框架、路由等等组件。Rails 自身就带了这堆让应用上线运行所必需的组件,而且作者在编写它们时充分考虑了彼此的适配问题。以往希望模板语言能和复杂的 ORM 层能在一起工作的麻烦现在再也没有了。一切将是如此简单。

现在开发者无需再为数据库等的组件编写大量繁琐的 XML 配置。Rails 基于约定而非配置,配置因而精简到最少。假如 Animal 类就是关联到数据库的 animals 数据表,为什么还要让开发者花时间写配置文件来链接它们? 这一切就让 Rails 来帮你吧。

简而言之,Rails 让 Web 开发充满乐趣。

架构
Rails 应用开发是基于模型-视图-控制器模式的 (MVC) 的。想了解 Rails 是如何使用 MVC 的, 最简单的办法是透过了解 Rails 请求的生命周期。如图1-1所示:

>>> 阅读全文

 

, , , , , , ,

IE 10 开发者指南之SVG

SVG (Scapable Vector Graphics,可缩放矢量图像)是互联网联盟(W3C)的正式推荐标准,它是一种使用 XML 来描述二维图像的语言。

SVG 允许3种形式的图像对象存在,分别是矢量图形(如由直线、曲线等组成的路径)、点阵图像和文本。各种图像对象能够组合、变换,并且能修改其样式,也能够定义成预处理对象以便再用。SVG 还支持各种特效,包括嵌套变换、路径剪裁、透明度处理、滤镜效果以及模板对象等。同时,SVG 可以是互动和动态的,动画可以直接加入 SVG 文本,也可以通过脚本加入。在新的SVG版本中,还可以表现视频、音频等其它信息。

SVG 通过使用脚本语言来完成比较复杂的应用,脚本语言调用 SVG 对象模型(SVG Document Object Model)来访问或控制所有的元素、属性和属性值。任何一种 SVG 图像元素都能使用脚本来处理类似鼠标单击、双击以及键盘输入等事件。

由于 SVG 文本是 XML 名字空间中的有效字符,这些字符能作为 SVG 图像的关键字而通过搜索引擎进行查询。

注意:这些特性在 IE10 和 采用 HTML 的 Metro 风格应用同样适用。

>>> 阅读全文

 

, , , ,

在C/C++中使用LIBXML2

文章评价:
C/C++ 标准库中并没有提供任何操作 XML 的方法,因此必须借助第三方函数库,您可以使用免费的诸如 Microsoft MSXML SDK 的商业版软件,也可以使用开源实现 expat 和 libxml2,在xmlbench上罗列了一些常见的 XML 类库及其性能比较,可以供您参考选择。这里我们主要介绍 libxml2,libxml2 是一个 C 语言的 XML 程序库,它可以包括 Windows, Linux, Mac 等等多种操作系统上使用,不但支持 DOM 和 SAX2 等等标准 XML 的解析方法,还从 C# 中借鉴了 XmlTextReader 这种简洁易懂的 pull 解析方式,此外 libxml2 支持 XPATH 查询,并且部分支持 XSLT 转换,在许多著名函数库中都有 libxml2 的身影,比如 Glib 等等。

libxml 的官方地址是XmlSoft,您可以在上面下载最新的源代码。接下来,我们先将源代码编译成平台所需的二进制文件。

编译 libxml2
在 Linux 或者 Windows 上使用 GCC 的读者可以参考用MinGW64编译Readline GetText等类库一文。这儿我们介绍一下 VC++ 的编译方法。Libxml2 依赖于 iconv 和 zlib 库。libiconv 库是一个字符编码转换工具,它提供了一个iconv()的函数,以实现一个字符编码到另一个字符编码的转换。分别下栽这些源代码,包括Zlib 1.2.5, libiconv 1.11.1 和 libxml2 2.7.8。

首先编译 libiconv,需要用 admin 权限打开 VC++ 的命令提示窗口,然后运行:

nmake -f Makefile.msvc NO_NLS=1 MFLAGS=-MT

如果需要成共享库的话,可以在参数中的添加上”DLL=1”。编译结束之后,运行 nmake -f Makefile.msvc install,默认会在 C 盘创建 usr 目录,保存得到的头文件、库文件和二进制文件。

>>> 阅读全文

 

, , , , , ,

ArcGIS Silverlight 客户端指南 (二)

在ArcGIS API 里已经定义了多种类型的地图层(这里避免用图层以免和SL的cavas混淆),它们都可以直接添加到地图控件里,这些地图层的地图资源可以是来自上一篇罗列的ESRI公司的免费地图,也可以是自己用arcgis server 发布的服务,还可以是Bing的地图,或者可以通过扩展加载GoogleMap的资源。

ArcGIS支持三种地图层类型

  • ArcGISTiledMapServiceLayer :瓷砖式地图层,是经过缓存的地图层,适用于发布后不需要更新的地图资源,可以提高速度。
  • ArcGISDynamicMapServiceLayer :动态地图层,没有经过缓存,数据可以是矢量也可以是栅格。适用于需要经常更新的地图资源
  • ArcGISImageServiceLayer : 这是用于动态的栅格地图层,数据是栅格类型的地图资源
  • 在ArcGIS的Map控件里,属性Layers是地图层的集合,它可以包括多个地图层。

    对于有多个地图层时,Map控件会按照地图层的顺序,从下到上依次显示。地图层有两个很有用的属性:

  • Opacity属性,取值0-1,可以设置地图层的透明度,在多个地图层叠加显示时,设置透明度很有用。
  • Visible属性,取值True/False, 用来设置地图层的可见性。
  • ArcGIS的事件
    Silverlight能够利用.net的一些核心库内容,包括事件。对地图控件进行操作,可能会触发一系列事件,例如:地图控件在初始化成功时会触发Initialized事件.

    >>> 阅读全文

     

    , , ,

    JSON简介

    文章评价:
    虽然 XML 已在不少应用程序中大显身手,但它并不是十全十美的,特别是遇到 AJAX 应用的时候,XMLHttpRequest 会检查返回数据的 MIME 类型,如果是 text/xml 类型,XMLHttpRequest 就会运行 XML Parser 来解析返回的文档,并在内存中构建出对应的 DOM 树,之后,你可以用 JavaScript 标准的 DOM 方法来操作 DOM 树。由于众所周知 DOM 的诟病,这显然不是有效率的方法。另外一个问题是,如果你想使用 JavaScript 对象而不是直接用 XM L数据的话,你还得自己遍历整个 DOM 树来创建相应对象。

    于是 JSON 出现在我们面前。

    JSON 提供了一种更适合 AJAX 应用的标准数据交换格式。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

    XML 和 JSON 都利用结构化来标记数据。我们将通过一个地址簿的例子来展示它们之间的不同。

    该地址簿用XML如下表示:

    >>> 阅读全文

     

    , , , ,

    在浏览器中使用Base64编码的图像

    文章评价:
    在上一篇博客中,我们将 BLOB 保存为 Base64 编码的字符串,这些字符串可以内嵌在 XML 的标签当中,这样二进制信息可以随着 XML 文件被拷贝、下载而不用担心信息会缺失。这项技术也在 email 邮件中被广泛使用。

    浏览器对 Base64 的支持
    图像是最经常使用的二进制文件格式之一。诸如 IE7,Firefox 等等现代的浏览器对 Base64 等各种编码的图像信息提供了很好的支持,在这些浏览器中,图形信息可以以下面的形式呈现在页面中、

    <img src="data:image/gif;base64,R0lGODlhDwAPAKECAAAAzMzM///// wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4ML wWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==" alt="Base64 encoded image" width="150" height="150" />

    这种data: URI的格式能把 Base64(或其他数据)可以内嵌在 image 标签的属性当中(或者CSS中)。我们可以看到在大部分浏览器中的显示效果:

    这种做法有利有弊,好处是浏览器可以在一个连接中得到完成的页面内容,不好的地方时图像的大小会增加1/3。因此,这种内嵌的方法适合对小的图形元素比如图标、圆角等等进行处理,从而减少浏览器打开的连接数,但对大的照片、图片(量少而大)等等则不应该使用 Base64 编码以免影响下载速度。

    >>> 阅读全文

     

    , , , , ,

    利用Base64在XML中存储BLOB

    文章评价:
    在一些 XML 的应用中,例如 SOAP,除了复杂的数据类型外,还可能包括图像、声音等多媒体数据。通常的处理办法是通过序列化的Java对象为载体进行传输,或者将图像、声音等数据包含在外部实体中,如果能将这些大型二进制对象存储在XML文件中,则处理起来会有很大的便利性。

    这里我们将以图像为例子讨论在 XML 中存储传输 BLOB 数据的方法。
    Base64算法详解
    Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。如例1所示:

    字符串“张3”
    11010101   11000101    00110011

    转换成Base64

    00110101   00011100     00010100     00110011

    即把8位的字节连成一串110101011100010100110011 然后每次顺序选6个出来之后再把这6二进制数前面再添加两个0,就成了一个新的字节。之后再选出6个来,再添加0,依此类推,直到24个二进制数全部被选完。

    让我们来看看实际结果:

    >>> 阅读全文

     

    , , , ,