初窥Spark SQL Catalyst

初窥Spark SQL Catalyst
在这篇文章中,我根据Spark SQL的论文,介绍了Spark SQL的一个关键模块:DataFrame API。我们现在已经知道,DataFrame和RDDs之间的关系应当是:DataFrame可以转化为RDDs,而RDDs也可以被映射为DataFrame。同时我们也知道,DataFrame API实质上是一套DSL,而最终在Spark计算框架中被执行的,应当是DataFrame最终转化后的RDDs。显而易见,人肉编写的DF所对应的DSL,存在着巨大的优化空间。这也就是本次文章所有讲述的Spark SQL的后半部分内容——Catalyst. *这里额外补一句,根据目前最新的代码,Spark已经把DataFrame这个东西去掉了,取而代之的则是Dataset,为了保持兼容,原来的DataFrame被定义为了Dataset[Row]的别名。关于这个Dataset我先观察观察,如果有必要的话,再单独拎出来说说,目前您可以假装认为它和DataFrame没有啥区别。   Catalyst O

进化的Spark, 从DataFrame说起

进化的Spark, 从DataFrame说起
书接上回,Spark可以说就是RDDs的化身,我们已经看到RDDs的设计方案对于大数据的计算具有诸多优势,但是随着Spark项目的推进,大家也逐渐地发现,在实际的生产领域,Spark RDDs API的编程方式并不是唯一的选择,很多的计算,都很像目前关系型数据库中的关联查询,而所谓的“信息”,其实很大部分都是产生自数据与数据之间的关联,而对于这样的数据模型,RDDs模型的表达能力还是相对有限的。 Spark 1.3.0的发布带来了全新的DataFrame API以及Spark SQL,我们继续追根溯源,找到关于DataFrame与Spark SQL的核心设计稿 - Spark sql: Relational data processing in spark[1]。 从这篇文章的角度来讲,DataFrame API和Spark SQL是配套的,从下图我们就可以看出来新增的这个模块与原有Spark框架的关系: 它们只是以不同的角度来诠释Spark在关系型数据的处理能力,可以看到,整个S

从RDDs到Spark

从RDDs到Spark
Spark是近年来非常火爆的分布式计算框架,可以说它紧跟Hadoop的脚步,并且在很多方面实现了超越。在Spark官方的宣传中我们也可以看到,Hadoop能做到的事情,Spark也可以做,而且通常可以做得更好。事实上,越来越多的业内公司都开始试水Spark,因为其核心卖点内存计算加速以及简洁优雅的编程接口不光可以为某些分布式批处理应用提速,还可以降低分布式计算应用的编写门槛。由于我不是数据工程师,所以我并不太关心分布式应用的编写环节(例如如何利用Spark进行数据挖掘、机器学习……),我更关心Spark这个计算框架以及这个分布式系统的体系结构。现在有很多书都在写Spark源码,但是很遗憾的是,在我看来,这些源码分析做得很“工程”,要知道很少有人会因为某某软件开源,就去死磕它的代码,人们往往需要带着目的去研究他们的代码,从而补足书面文献中所缺少的部分,其次才是看他们的实现是否够“优雅”,够“软件”。 希望本文能做做成一个系列,记录我学习Spark的点滴,同时也将我的学习思路分享给大家。 研究一个软...

Spark源码阅读环境搭建[Windows版]

Spark源码阅读环境搭建[Windows版]
近期要开始阅读Spark的源码了,董的博客里的这篇文章已经把大致的环境搭建思路说得很清楚了。不过由于我没有专用的Linux工作机,在VM里开IDE阅读代码不仅对我8GB内存的小本是种摧残,对我的精神更是种折磨,于是开始琢磨怎么在Windows下配置这个环境。 其实那篇博文已经比较老了(注意到那个发布时间是2014年),不仅Spark有了飞越,Scala同样也是,版本问题似乎已经不再那么至关重要(版本依然重要)下面列出我的配置流水: 安装JDK 1.8,配置CLASS_PATH、系统Path 安装Scala 2.10.6(2.10.x的最新版),安装的时候没什么特殊情况的话,会自动加入Path 安装Git for Windows,这个记得安装的时候不要选Bash,要选Command Prompt 安装SBT,这个似乎不是必要的,因为IDEA自带这个,不过如果希望自己动动命令行手动构建的话,可以装个玩玩,记得加入Path,然后命令行执行sbt命令来进行初始化(有可能需要VPN,有些库被

有趣的Metaball — 渲染及优化

有趣的Metaball — 渲染及优化
近来由于某些门课程设计,重拾了之前本博客中“物理引擎”系列,以C#作为平台重新实现,并且加入了一些可靠的设计模式,从而比以往的设计更加易用。在制作过程中,突然想要用粒子模拟“水”的效果,于是查阅了很多资料,SPH之类的物理算法还在研究,但就水本身的渲染而言,利用Metaball算法则是能够立竿见影的看到效果,下图就是实际效果:   本文谈论的Metaball是2D范畴的,3D范畴的Metaball和2D的Metaball原理是一致的,但是具体的算法及优化上是有一定的差异的。 首先来了解,什么是Metaball?下图来自于Metaball的Wiki页面:   Metaball算法,可以创造出多个形状光滑融合的效果,看上去就像是水滴融合一样,通过使用Metaball,可以模拟水面、颜色融合、变形球等等酷炫效果,如果你玩过LocoRoco或者黏黏世界,那么你就一定见过Metaball。 Metaball的原理很简单,Metaball的本质不是...

使用OpenMP让程序可并行化

使用OpenMP让程序可并行化
在《并行计算》这门课程中我了解到了很多使程序并行化的方法,OpenMP就是其中一种,在实际的使用之后,感觉OpenMP是一种很方便的并行计算工具,它能够提供线程级别的并行化,所以OpenMP一般用于共享内存的单机系统。本文将以K-Means算法作为样例来进行讲解。在介绍算法之前,先做一下热身运动,OpenMP库已经在Visual Studio 2013中集成(前几个版本似乎也有),所以你可以很轻松的为你的Visual Studio项目添加OpenMP支持,在项目属性中,如图所示的地方开启OpenMP支持即可: 热身完毕后进入正题。 K-Means算法是一种聚类算法,顾名思义,它进行划分的方法是依赖于计算均值,算法的整体流程非常简单,假如要把样本分为M个类别:        在样本集N中随机选取M个个体,作为初始类心;        遍历样本中的所有个体,每个个体都与当前的M个类心分别求距离,并将自己和距离最小的那个类心归为一类;        通过平均值的方法计算每一类点...

NextGEN Gallery 导致的严重问题及应对办法

NextGEN Gallery 导致的严重问题及应对办法
今天登陆自己的Wordpress博客进行查看,结果一个我最最讨厌的问题抛了出来: 呵呵呵呵呵!上一次碰到类似的问题是使用NextGEN Gallery上传图片的时候遇到的,那时候费了好大的功夫通过SSH把php.ini的内存限制进行了修改才算勉强能用,而这次这个问题更是奇葩到家了……我还没上传图片好吗!我才刚刚进首页好吗!泪目啊。这明显不应该是我大Dreamhost不给力,这分明是软件问题啊。 好吧,先看那错误提示,找到发生错误的位置,代码是这样的: 这个功能闭着眼睛都知道是干啥的了吧!加载配置选项的,这尼玛怎么能崩炸掉我大内存呢?我忍不住print_r了一下$alloptions_db这个变量,然后一口老血喷出。 在翻过了前面短短的各种信息交杂的“乱码”过后……正面90%以上的都内容都是这样的: 看那个红框框啊,整页都是这个前缀来标识的选项啊,我非常想把这些都复制下来看看有多大,结果我太天真了……这文本量之大已足以让我大Chrom崩溃啊有木有! 显然,就是这...

Windows 7下配置Lex和Yacc

Windows 7下配置Lex和Yacc
这学期编译原理的实践作业是编写一个词法分析器和一个语法分析器,并将它们结合起来,其中提到了允许使用自动生成技术,于是编译界的大神Lex和Yacc就华丽丽登场了,不过他们是Unix上的软件,要在Windows上使用还是需要解决一些问题的。 我在网上查阅了大量的资料,其中最多提到的是使用Parser Generator,这个软件相当于移植版的Lex + Yacc,整个软件的安装包只有2M不大,但是它存在一个问题,就是我无法用它生成可以在VS2012上编译通过的代码,但是根据网络上的资料,使用该软件是可以产生能在VC6编译通过的代码的,不过配置过程稍显繁琐。 我使用了另外一种方法,并在这里介绍给大家,简单方便。 在Windows上的Lex和Yacc的移植版是flex和bison,安装这两个软件就可以使用Lex和Yacc的完整功能: 这两个软件也非常小巧,你可以在这里下载。 下载后直接依次安装,建议安装在同一个目录里,我安装到了C:\GnuWin32,这时候你就已经可以使用他们了。 用他们生