Electronic Joint Business

Solution for E-Business

mysql

基于 MYSQL 存储引擎实现虚拟数据表查询 (二)

在上一篇文章中,我阐述了如何基于 MYSQL 存储引擎从 API 中检索数据,并回馈给 MYSQL。特别是我需要从 MySQL 控制台上获得最新的系统进程列表。本文是对上一篇文章的改进,你将看到我们无须对 MySQL 解析器做任何修改就可以解决同样的问题。1

ProcessInfoEngine
这里的存储引擎不同于常见的 MyISAM 或者 InnoDB 等存储引擎,它从 Windows 进程 API 中检索数据并回馈给 MySQL。为此我们创建数据表 runningprocesslist ,其存储引擎是 ProcessInfoEngine。

`PROCESSNAME` varchar(2048) DEFAULT NULL,
  `ProcessID` int(11) DEFAULT NULL,
  `Threadcount` int(11) DEFAULT NULL,
  `ParentprocessID` int(11) DEFAULT NULL,
  `Priorityclass` int(11) DEFAULT NULL
) ENGINE= ProcessInfoEngine

当用户在 runningprocesslist 数据表上执行 select 查询时,控制权被交给 ProcessInfoEngine 的 rnd_init 方法。该方法会检查数据表名称是否真的为 “RunningProcessList”,然后再检查 where 子句解析树是否存在。如果存在,where 子句解析树将被遍历以便转换成 OpenProcess 调用。如果不存在 where 子句,那么我们将创建进程快照,并将所有进程的信息回馈给 MySQL。

int ha_example::rnd_init(bool scan)
{
        DBUG_ENTER("ha_example::rnd_init");
       
        if(_stricmp(table_share->table_name.str,"RunningProcessList")==0)
        {
                THD *thd=this->ha_thd();
                SELECT_LEX *select_lex=&thd->lex->select_lex;
                m_processListIndex=0;

                if(select_lex->where==0)
                {
                        GetAllProcessList(m_processList);
                }
                else
                {
                        stack<parsestackelement> parseStack;
                        select_lex->where->traverse_cond(My_Cond_traverser,(void*)&parseStack,Item::traverse_order::POSTFIX);
                        if(!parseStack.empty()&&parseStack.size()==1)
                        {
                                GetProcessListSpecifiedInWhereClause(m_processList,parseStack.top().setOfProcessIds);
                        }
                        else
                        {
                                GetAllProcessList(m_processList);
                        }
                }
        }
        DBUG_RETURN(0);
}

在后序遍历 Where 子句解析树时, 我们创建并维护了名为 ParseStackElement 这样一个栈结构。

>>> 阅读全文

 

,

基于 MYSQL 存储引擎实现虚拟数据表查询 (一)

文章评价:
MySQL 支持多种可用于存储管理与检索的存储引擎,最常见的是 MyISAM 和 InnoDB 。创建数据表时可以指定存储引擎。最简单的存储引擎只能读取数据表。大多数引擎支持从文件读取数据并回馈给 MySQL。所以,我设想调用 API 来检索数据并将数据直接回馈给 MySQL。在此之上,我们可以利用 SQL 语句对检索到的数据进行复杂分析。为此我需要在相关 API 之上编写一个引擎,不过我并不打算从头开始编写新引擎,而是打算构建一个通用的组件让所有存储引擎调用,这将大大简化编写引擎的工作。1

背景
我希望透过 MySQL 对系统中的进程进行分析,通过 MySQL 控制台上获得运行中的进程的列表,进而执行复杂分析,比如说查询某个进程所包含的模块。为了提供简单的视图,我希望将这些以数据表的形式呈现,由存储引擎来调用相关 API 检索数据。API 是操作系统中现成的。对于其他部分,传统办法是创建数据表,每当有新进程启动就插入新的数据行,有进程终止时就删除数据行。

显然这种方法有很多缺点:

  • 插入删除数据行都是系统开销。
  • 在查询数据表前,你需要触发负责插入或删除数据行的日志程序。
  • 即便只需查看单一进程,数据表中还是需要维护所有进程的信息。
  • 一旦进程终止它的进程 ID 又为新进程所用,这时如旧数据行未删除就插入新数据行会产生 ID 冲突。
  • 插入或删除需要表锁定,可能会是整个检索单元的性能瓶颈。

因此新的构思应当解决这些问题:

  • 无需插入或删除数据行
  • 查询数据表之前无需触发日志应用
  • 如只查询单一进程则不用读取所有进程的消息
  • 无进程 ID 的不一致性,因为该数据表只是系统的状态快照
  • 无性能瓶颈,因为没有插入或删除操作

好处
新构想比传统方法更好地解决了一个具体问题:即表中的数据可以有时间轴。当表的大小达到一定限度时,可以创建新表。这也是使用 Tableau 商业智能工具进行分析时的要求。Tableau 可以生成 SQL 查询。为方便起见,要求使用单个表而在背后维护多表间的关系。我们可以生成编程式查询来检索某时间段内的数据并显示在 web 页面上,但 Tableau 无法使用这些程序。一种传统技术是将数据复制到单个表中,但同时我们所维护多表的关联就会失效。另一种传统技术是使用视图,但是在视图背后使用编程式查询会导致视图失效。我所构想的是只公开单个数据表,利用 API 从多个表中检索数据。编写存储引擎可以提供解决方法。最简单的引擎会回馈所有的数据让 MySQL 筛选,但这非常低效。而我所构想的存储引擎将利用 MySQL 查询分析器的强大能力。在 MySQL 查询期间 where 子句会被转换为对函数和 API 的调用,这样某种程度上我们只要检索所需的数据。这个构想广义上可以推广到任何 API,无需重写生成 API 调用等核心逻辑。

>>> 阅读全文

 

, , ,

Hadoop 技术手册 (二) 体验 Hadoop 平台

文章评价:
在上一篇文章中,我们概括介绍了 Hadoop 的各个组件,但是留下的困惑之一就是 “我要如何运行这些软件呢?”。本文将利用 Cloudera 网站提供一个免费的 Hadoop 发行版 CDH 来运行一些示例,使得你对 Hadoop 各个组件有深入的了解。

特别值得一提的是,Hadoop 可以通过 Sqoop 非常好地整合 Informix 和 DB2 数据库。 Sqoop 是全球领先的用于在 Hadoop 和关系数据库之间进行数据迁移的开源实现。它使用 JDBC 来读写 Informix、DB2、MySQL、Oracle 等其他数据源。此外还提供了几个优化的数据库适配器,包括 Netezza 和 DB2。

运行简单的 Hadoop, Hive, Pig, Oozie 和 Sqoop 示例
在上一篇文章中,你已经学习了 Hadoop 的介绍和定义,现在是该实践的时候了。要运行本文的例子,你只要从 Cloudera 网站下载支持 VMware、virtual box 等的镜像文件就可以开始进行 MapReduce 了!我们假定你有一台 64位电脑,并有某种流行的虚拟软件。大多数的虚拟软件中都提供了免费下载。当您试图启动 64位的镜像时,你可能会遇到有关 BIOS 设置的报错。图 1-1 显示了需要在 BIOS 修改的设置 (基于 Thinkpad 电脑)。进行更改时,请务必小心。

示例中所使用的数据实在不能称为 BigData。但是本文的目的不是让你用一台笔记本电脑来和一个庞大的文件交火,而是关注数据源、map-reduce 作业这些有趣的问题,并答疑解惑。

下载 Hadoop 虚拟镜像
我们强烈建议您使用 Cloudera 提供镜像来运行这些示例。 Hadoop 是一个解决问题的技术。 Cloudera 的虚拟镜像包让你不用处理繁杂的配置工作,只需专注于大数据本身的问题。如果你坚持要自己配置所有的组件,那 Hadoop 本身就成为一个问题,而不是解决方案了。

>>> 阅读全文

 

, , , , , , , , , , ,

HadoopDB 入门 (二) 配置MySQL

文章评价:
在上一篇文章中,我们介绍了如何对 HadoopDB 和 PostgreSQL 进行配置,以便它们能在一起工作。在本文中,我们将介绍如何在 HadoopDB 中配置另一种普遍使用的数据库来。在文章的前一部分,我还会涉及如何在 Ubuntu 中安装并运行起 HadoopDB,已经熟悉的朋友可以直接跳过这一部分。这里我使用的是 64 位的 Ubuntu Server 10.04,并且广泛地使用 Ubuntu 的包管理器,本文介绍的安装方式,对于其他的 Linux 系统比如 CentOS 也应该是适用的。

本文介绍的是如何配置一个单节点系统,如果您需要一个多节点系统,可以参考上一篇文章中的介绍,你将会发现对 HadoopDB 进行扩展是多么的简单。

安装 Hadoop
安装 Hadoop 之前,首先需要安装 Java。你可以从 Oracle 的站点下载 Sun JDK,或者使用 OpenJDK 也没有任何问题,在 Ubuntu 上,运行下面命令就可以安装 OpenJDK:

sudo apt-get install openjdk-6-jdk

Michael Noll 写过一篇文章深入讨论了如何在 Ubuntu 上安装 Hadoop,我强烈建议您在开始之前读一下这篇文章,本文很多内容都是借鉴该文章的。

首先我们先创建需要运行 Hadoop 帐号和组:

>>> 阅读全文

 

, , , , , ,

HadoopDB 快速上手指南

HadoopDB 是由美国耶鲁大学计算机科学教授 Daniel J. Abadi 及其团队推出开源并行数据库。该数据库集合关系型数据库的数据处理能力与 Hadoop、MapReduce 等技术于一身,采用了许多不同的开源组件,包括开源数据库、PostgreSQL、Apache Hadoop 技术和 Hive 等等。

HadoopDB 的查询是利用 MapReduce 或常规的 SQL 语言完成的。MapReduce 适用于大规模数据集(大于1TB)的并行计算。另一方面,HadoopDB 的数据处理部分是利用Hadoop 完成的。Abadi表示,其中部分是利用了分布在无分享计算机群集中的许多节点上的不同 PostgreSQL 实例完成的。实质上,HadoopDB是MapReduce和并行数据库管理系统技术的混血儿。不过和 Aster Data、Greenplum或Hive等已经开发出的项目和厂商不同,HadoopDB不是简单地在语言/接口层面上的混合,它是更深的系统实现层面上的集成。

因为集两种技术的精华于一身,HadoopDB 可以取得 MapReduce 等大规模并行数据基础设施的容错性。在这些基础设施中,服务器故障对整个网络的影响非常小。HadoopDB可以执行复杂的分析,速度几乎与已有的商用并行数据库一样快。

本文的目的是为运行HadoopDB给出一些指导。整个 HadoopDB 的设计概述可以在VLDB 论文的第五节找到。在该论文中,你还可以找到我们测试 Hadoop (带 HDFS)、HadoopDB 和商用并行数据库的测试结果比较。

HadoopDB 的基本原理是利用 Hadoop 来存取部署在集群上多个单一节点上的 DBMS 服务器(比如:PostgreSQL 或 MySQL)。通过发起 SQL 查询,HadoopDB 将尽可能多的数据处理推给数据库引擎来进行(通常情况下,大部分的映射/组合 – Map/Combine 阶段的逻辑可以用 SQL 来表达)。这样就创建了一个类似于无共享并行数据库的系统。应用从数据库世界得到的技术大大提升了性能,特别是在更复杂的数据分析上。同时,HadoopDB 依赖于 MapReduce 框架的事情确保了系统在高可扩展性和容错、异构性(heterogeneity)方面的效果与 Hadoop 类似。详细内容请再次参考 VLDB 论文。

>>> 阅读全文

 

, , , , , , ,

在Azure中运行MySQL

由于不同的原因,我手头的许多Azure应用都必须依赖于MySQL。例如,我手头的Joomla开发就完全依赖于MySQL。大部分情况下,这是因为在应用中使用了MySQL的原生驱动,而未不是设计一个数据库独立层,类似.NET中的ADO.NET或者PHP中的PDO,或者裁剪掉那些MySQL特有特性。基于上述的理由,要在Windows Azure中运行这些应用,不得不想方设法让MySQL在Azure中运行。

这其实没有想象的困难,在此过程中,我可以重用许多二进制可执行文件。

想法与建议
在深入让MySQL运行起来的技术细节之前,我想先分享一下个人对于在Azure中运行MySQL的观点,在我告诉你别这么做之前,你可以节约阅读这篇文章的时间,

现实是即使你能在Windows Azure中运行MySQL,这么做也不太实际。我的建议是把它保留做你最后的法宝或者权宜之计直到Sql Server能够支持你的应用。我这么说是有许多原因的,有些是技术方面的,有些是财务方面的。因此,本文更多是关注在Azure运行和管理MySQL的过程,而不是非要这么做。

现在,让我们来深入技术问题。在Azure中运行MySQL的方法是创建一个Worker Role,它会作为二进制文件的实际宿主。你只要拷贝出可执行文件,然后编写简单的Windows Azure相关代码来实际执行应用,并传递请求给它。事实上,任何可执行文件只要可以通过xcopy发布而且无休止运行的都可以通过这个方法来实现。这对于进行分布式计算之类的事情是相当棒的。

>>> 阅读全文

 

, , , ,

Spring 配置 1-2-3 (一) 基础设施

这篇短文主要是为了对SSH开发中的常见配置做一下整理,以方便开发工作中的快速查阅,节省开发时间。我们将从一个空白的Web Project开发,逐一添加各种常见的框架、组件的支持,我们会从常见的Spring, Hibernate,Ibatis开始,涵盖ActiveMQ,Drools, 最后谈到一些不常用的框架,比如JackRabbit的支持。

准备工作

我们选用Eclipse作为我们开发的IDE,Tomcat6作为开发的应用服务器,而MySQL 5作为后台数据库服务器,MySQL 记得打开InnoDB的支持,详细的配置不再详述。一切准备就绪之后,我们在Eclipse创建一个”Dynamic Web Project”项目,取名叫”Arabic”,这时候Eclipse里的项目结构如下图所示:

一些约定:

>>> 阅读全文

 

, , ,

详解MongoDB的DBRefs

比方说,有个内容丰富的站点,它囊括了诸如 blog ,图片之类的内容,也有日程安排, 文章引用的等等东西。这样许许多多截然不同的内容而且他们彼此之间又没有什么共性:blog 有标题和文本,图片有图片链接和缩略图, 文章引用有引文和作者的名字等等。它们的唯一共性就是站点上所有的东西被存储在不同的 MongoDB 集合中,而且都有一个属性 _Id。

现在有个需求,要求用户可以针对这个网站的所有内容都可以发表评论,也就是说,每个人都可以任选站点的任意内容评头论足一番。如果所有的东西都存储在 MySQL 或者其他关系数据库中,我们可能这样设计:我们可以给不同的数据表都添加上一栏comments:blogpost_comments,picture_comments等等。我们也可以选用另一个方法,创建一个新的数据表comments,并存储评论的内容的id和类型type。这样查询起评论就满简单的:

SELECT * FROM comments WHERE type = ‘picture’ AND object_id = 123

第二种方法和 DBRef 的工作方式类似,即利用类型 type 和 id。你可以参考这篇 文章。DBRef 的格式如下

{ $ref :<collname>, $id :<idvalue>; [, $db :<dbname>; ] }

正如你所见的,$ref有个参数 collection name,就是上面的 type。而 $id,当然就是 id 了。(这儿有个字段:$db,不过当我们只有一个 MongoDB 数据库时,它就没什么用处了)。用 MongoDB 我们这样来存储 comments表:

{
author: "John Doe",
text: "Oh, such a great picture",
object: { $ref: "pictures", $id: ObjectID("4b0552b0f0da7d1eb6f126a1") }
}

这就是全部。

>>> 阅读全文

 

, , ,