让文件具有计算能力

      有很多数据库之外的文件都蕴含着结构化数据,比如:文本、Excel、日志、二进制文件等。为了在应用程序中使用这些结构化数据,一般的作法是先把它们导入数据库,利用数据库的接口计算数据并获得结果。


    但是,将文件导入数据库再计算,会产生如下不便:

    额外的工作量。将文件导入库内,通常要进行ETL。很多时候,还要处理增量数据、实现定时调度、开发存储过程、设置数据库权限,工作量很大。


    加大了数据库吞吐负担。有些文件的数据量很大,比如网站日志。导入数据库后,这些数据占用昂贵的数据库存储空间、CPU资源、网络IO,加大了数据库的吞吐负担。


    推进了数据库扩容。更多的数据加大了数据库的吞吐负担,就会加速数据库的扩容 ,用户不得不经常升级扩容,购买昂贵的设备、数据库License、CPU。有时候,还需要购买更高档的数据库专用服务器。


    数据的可管理性变差。文件可以按照业务种类、模块关系、时间顺序进行多级目录管理,可管理性较高,但数据库是扁平结构,不能以多级目录的形式来管理数据,只适合管理数量较少的表。有时,导入的数据种类多、数量大、命名随意,在数据库中很容易形成大量意义混淆的表名,长此以往,数据库中会积累大量意义不明但又不敢删除的顽固数据,可管理性反而变差。


    文件入库的缺点这么多,为什么还要入库?这是因为文件本身缺乏计算能力,为了获得计算能力,我们不得不将它入库,并承受由此带来的不便。如果文件具有计算能力,这些不便都会消失,我们还能将库内的冗余数据也导出成库外文件,带来更大的便利!


    数据库中有两类数据,核心的业务数据,以及由此派生出的面向具体应用的冗余数据(如为了提高性能和方便查询事先汇总的数据)。数据库建设初期,以核心数据为主。但随着业务的发展,冗余数据不论在量级和增速上都会大大超过核心数据。核心数据的安全性要求高,数量少,有必要放进昂贵的数据库存储空间。冗余数据衍生自核心数据,它的安全要求不高,一旦损坏也可以通过核心数据重新生成,因此没有必要放进数据库中。之所以要把冗余数据放在数据库中,不是为了安全性,而是为了让冗余数据获得计算能力。


    由于数据量大、关联的应用多,冗余数据消耗了数据库的绝大部分资源,对数据库的吞吐瓶颈影响更大,扩容时所要付出的成本也更多,可管理性也会更差。


    如果能使文件拥有计算能力,我们将获得这些好处:

    没有额外的工作量。对于库外文件,我们可以直接读取并计算,不必再导入数据库,ETL的工作量减少到零。


    管理方便。文件天然支持多级目录,复制、转移、拆分都比数据库简单高效得多,允许用户按照业务模块、时间顺序等规则分类管理数据,应用程序下线时,也可以按照目录删除该应用对应的数据。数据管理因此变得简单清晰,工作量显著降低。


    成本低廉。既然是文件,那就可以简单地存储在廉价硬盘中,无需购买昂贵的数据库专用软硬件。


    降低数据库吞吐负担。将数量最大,应用最多的冗余数据移到库外,数据库的性能自然会明显提高,吞吐负担随之减低。


    降低数据库扩容压力。数据库吞吐负担降低,就可以显著推迟扩容临界点的到来,数据库可以继续服役,也可以节省大量的扩容成本。


    资源利用率高。用文件来存储数据并非要抛弃数据库,相反的,文件应当只存储安全要求不高、数据量巨大的冗余数据以及库外文件,而数据库仍然存储核心数据。文件存储和数据库存储各司其职,资源利用率显著提高。


    整体性能显著提高。数据库是私有接口,通道拥挤;文件系统是开放接口,任何程序都能访问,性能的天花板更高。另外,文件可以方便地复制、分散在多台廉价PC上,可以使用多节点并行计算的方式来解决吞吐瓶颈,性能大幅度提高。虽然数据库也有并行解决方案,但Teradata、Greenplum等方案非常昂贵,免费的Hive、Impala目前计算能力和成熟度还不高,难以普及使用。


     文件计算的优势很多,但有一个关键的缺点,即文件本身没有计算能力,我们需要特定的工具才能让它具有库外计算能力。R语言、MapReduce、高级语言、集算器就是这样的工具。


     自有引擎支持文件计算。集算器可以直接读取Txt文件、Excel文件、二进制文件中的结构化数据,从而轻松支持库外文件计算。集算器还可以直接访问各种关系型数据库、半结构化数据,可以轻松进行多数据源混合计算。


    内置丰富的计算函数。集算器是针对结构化数据计算的程序设计语言,提供了丰富的内置对象和库函数,可以实现复杂的业务逻辑,同时还能降低从业务逻辑到程序代码的转换门槛。比如,有序集合可以解决SQL\SP中的典型难题,包括相对位置访问、多级分组中的行间计算、复杂的排名计算。


    支持廉价横向扩展。集算器支持多节点并行计算,从而支持大文件库外计算,在保证高性能的同时可以有效降低成本。集算器还是个几乎免费的软件,不必购买专用的数据存储设备和相应的授权就能使用,它支持Windows/Linux/Unix,既支持中高端服务器也支持廉价PC,伸缩性比数据库更强。


    下面用一个例子来说明集算器进行文件计算的过程:某企业使用文件来存储历史数据和冗余数据,其中包括了历史订单数据;数据库用来存储核心数据和当期数据,包括当月的订单数据以及完整的客户信息。现在需要通过外部输入的商品列表来计算去年年初到目前为止,有多少客户购买了列表上的所有商品;计算完成后,需要将客户ID和客户名返回给报表工具。集算器代码如下:



A1-A3:从文件读取历史数据,从数据库取当月数据,并将两者合并。
A4-A5:按照时间和商品列表过滤订单,其中商品列表来自于外部(一般是报表工具)。需要注意的是,例子中假设数据量不大,因此采用了先合并再过滤的方式。如果实际数据量比较大,则应该采用先过滤再合并的方式;如果数据量进一步加大,则应当用文件游标分段读取分段计算方式;对于特别巨大的数据,可以采用多节点并行计算的方式。
A6-A10:计算出购买了相同产品的客户。由于同一个客户会购买同样的商品,因此需要将订单按客户分组,在每组中求得用户购买了哪些不重复的商品(相当于SQL中的distinct)。继续对不重复的商品计数,即可知道用户购买了几种商品。这个数量如果和商品列表一致,则表示该用户购买了列表中的所有商品。
A11-A12:从数据库取得完整的客户ID、客户名称,通过关联计算求出A10中客户ID所对应的客户名称。 
A13:将计算结果返回给报表工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值